"""
open/dulcinea/lib/ui/news.qpy
"""
from datetime import timedelta
from dulcinea.common import format_date
from dulcinea.news import NewsItem, get_news_db
from dulcinea.ui.user.util import ensure_admin_access
from qp.fill.directory import Directory
from qp.fill.form import Form
from qp.fill.html import href
from qp.pub.common import get_user, redirect, header, footer, not_found
from qp.pub.common import site_now
from qpy import xml
class NewsDirectory(Directory):
def get_exports(self):
yield ('', '_q_index', 'News', 'News items')
if get_user().is_admin():
yield ('add', 'add', 'Add', 'Add a new news item')
def _q_index:xml(self):
title = 'News'
header(title)
'
'
_format_news_items(get_news_db().get_sorted_news_items())
'
'
footer(title)
def add(self):
news_item = NewsItem()
form = _news_item_form(news_item)
if form.get("cancel"):
redirect(".")
if form.has_errors() or not form.is_submitted():
return _news_item_form_render(form, 'New News Item', news_item)
news_item.set_title(form['title'])
news_item.set_subtitle(form['subtitle'] or '')
news_item.set_text(form['text'])
if form.get("preview"):
return _news_item_form_render(form, 'Confirm New News Item',
news_item)
get_news_db().add(news_item)
redirect(".")
def _q_lookup(self, component):
try:
key = int(component)
except ValueError:
not_found(repr(component))
try:
item = get_news_db().get_news_item(key)
except KeyError:
not_found("Not found: %r" % key)
return NewsUI(item)
def _format_news_items:xml(items):
''
def summary:xml(user):
''
for item in get_news_db().get_sorted_news_items():
'- %s
' % href('/news/%s/' % item.get_key(), item.get_title())
'
'
class NewsUI(Directory):
def __init__(self, item):
self.item = item
def get_exports(self):
yield ('', '_q_index', self.item.get_title(), '')
if get_user().is_admin():
yield ('edit', 'edit', 'Edit', 'Edit news item')
def _q_index:xml(self):
title = self.item.get_title()
header(title)
_format_news_items([self.item])
footer(title)
def edit(self):
ensure_admin_access()
form = _news_item_form(self.item)
if form.get("cancel"):
redirect(".")
if form.has_errors() or not form.is_submitted():
return _news_item_form_render(form, 'Edit News Item', self.item)
self.item.set_title(form['title'])
self.item.set_subtitle(form['subtitle'] or '')
self.item.set_text(form['text'])
self.item.set_timestamp()
if form.get("preview"):
return _news_item_form_render(form, 'Confirm News Item', self.item)
redirect(".")
def _news_item_form(news_item):
form = Form()
form.add_string('title', value=news_item.title, title='Title',
size=90, required=1)
form.add_string('subtitle', value=news_item.subtitle, title='Subtitle',
size=90)
form.add_text('text', value=news_item.text, title='Text of news item',
required=1, rows=30, cols=80)
form.add_submit("preview", "Preview")
form.add_submit("submit", "Submit")
form.add_submit("cancel", "Cancel")
return form
def _news_item_form_render:xml(form, title, news_item):
header(title)
if form.get("preview"):
_format_news_items([news_item])
form.render()
footer(title)
def format_news_css:str():
'''
dl.news {
padding: 1ex;
}
dl.news dt {
padding: 0.5ex;
}
dl.news dt span.subtitle {
font-size: smaller;
font-weight: normal;
}
dl.news dt span.actionlinks {
font-weight: normal;
}
dl.news dd.date {
font-size: smaller;
padding-bottom: 0;
margin-bottom: 0;
}
'''