"""
open/dulcinea/lib/ui/util.qpy
"""
from csv import DictWriter
from dulcinea.common import format_date_time, format_user
from dulcinea.util import StringIO
from qp.fill.html import htmltag, url_quote, nl2br, href
from qp.pub.common import get_request, get_user, get_response, get_publisher
from qp.pub.common import get_path, complete_path, site_now, page
from qpy import stringify, xml
import re
percent_pattern = re.compile('%[A-F0-9][A-F0-9]')
def undo_percent_quoting(text):
text = text.encode('utf8')
while True:
hit = percent_pattern.search(text)
if not hit:
break
key = hit.group()
text = text.replace(key, chr(int(key[1:], 16)))
return xml(text)
def get_site_url(): # maybe this should use get_publisher().complete_url('/')
request = get_request()
scheme = request.get_scheme()
server = request.get_server()
script_name = request.get_script_name()
return "%s://%s%s/" % (scheme, server, script_name)
def javascript_headers:xml(javascript_src, javascript_script):
if javascript_src:
'\n' % javascript_src
if javascript_script:
''
def none_quote:xml(value=None):
return value or ''
def li:xml(*args, **kwargs):
htmltag('li', **kwargs)
if type(args[0]) is tuple:
data = args[0]
else:
data = args
fields = len(data)
if fields == 1:
data[0]
elif fields == 2:
href(data[0], data[1])
elif len(data) == 3:
data[0] % href(data[1], data[2])
else:
raise TypeError('too many fields for list_item(): %d' % fields)
''
def item_list:xml(*args, **kwargs):
if kwargs.get('ordered_list', False) is True:
start_list = '
'
end_list = '
'
else:
start_list = ''
start_list
for data in args:
li(data)
end_list
def popup:xml(*args):
''
def trimmed:xml(*args):
''
for arg in args:
arg
'
'
def format_date(date):
"""(date : datetime) -> str
"""
return none_quote(date and date.strftime('%Y-%m-%d'))
def format_date_time(date):
"""(date : datetime) -> str
"""
return none_quote(date and date.strftime('%Y-%m-%d %H:%M'))
def format_rfc822_date_time(date):
return none_quote(date and date.strftime('%a, %d %b %Y %H:%M:%S %Z'))
def format_address(address):
if address:
return nl2br(address.format())
else:
return none_quote()
def feedback_link(recipients, subject, text):
if not get_publisher().get_feedback_domain():
return ''
if not recipients:
user_names = ['webmaster']
else:
user_names = [url_quote(stringify(user_name).split('@')[0])
for user_name in recipients]
# In Python 2.4.2, url_quote() raises KeyError for non-ascii strings.
subject_string = stringify(subject)
try:
subject_string.encode('ascii')
except UnicodeEncodeError:
subject_string = get_path()
return href(
complete_path('/feedback/?%s,%s' % (
','.join(user_names), url_quote(subject_string))),
text, title='contact %s@%s' % (
user_names[0], get_publisher().get_feedback_domain()))
def format_yes_or_no:xml(switch):
if switch:
'Yes'
else:
'No'
def format_history_event:xml(event):
'%s | ' % none_quote(
format_date_time(event.get_timestamp()))
'%s | ' % format_user(
event.get_user(), name=False, email=False)
message = event.get_message() or ''
if get_user().is_admin():
message += " (%s)" % event.get_event_code()
'%s | ' % message
def format_history:xml(history, title='History'):
if title:
boxtitle(title)
'''
Date/time | User ID | Message |
'''
for event in history:
if (not get_user().is_admin() and
event.get_event_code() in ('act_as_start', 'email_retrieved')):
continue
''
format_history_event(event)
'
'
'
'
def boxtitle:xml(arg, *args):
''
arg
for a in args:
if a:
' '
a
'
'
def csv(fieldnames, dict_list, filename="data.csv", add_header=True):
"""(fieldnames:[str], dict_list:[dict], filename:str="data.csv",
add_header:bool=True) -> str
Returns csv file version of the date.
Has side effect of setting the response content type and
naming the download file.
Each dict in dict_list should have keys from fieldnames.
"""
set_csv_headers(filename)
s = StringIO()
dict_writer = DictWriter(s, fieldnames=fieldnames)
if add_header:
dict_writer.writerow(dict(zip(fieldnames, fieldnames)))
for row in dict_list:
dict_writer.writerow(row)
return s.getvalue()
def set_csv_headers(filename):
response = get_response()
response.set_content_type('text/comma-separated-values', 'utf-8')
response.set_header('Content-Disposition',
'attachment; filename="%s"' % filename)
def anchor:xml(name=None, content=None, **kwargs):
htmltag('a', name=name, **kwargs)
content
''
def dl:xml(tuples, **kwargs):
htmltag('dl', **kwargs)
for title, description in tuples:
if title:
'%s' % title
if description:
'%s' % description
''
def ul:xml(items, **kwargs):
htmltag('ul', **kwargs)
for item in items:
'%s' % item
''
def ol:xml(items, **kwargs):
htmltag('ol', **kwargs)
for item in items:
'%s' % item
''
def index_page(directory, title=None):
page_title = title
href_args = []
for component, name, crumb, link_title in directory.get_exports():
if component == '':
page_title = title or link_title or crumb or 'Index'
elif crumb:
href_args.append((component, crumb, link_title))
return page(page_title,
popup(ul([href(*href_arg) for href_arg in href_args])))
def respond(title, *content, **kwargs):
get_response().set_body(page(title, *content, **kwargs))
get_publisher().respond_now()
def safe_respond(title, *content):
respond(title, crumbs='', *content)
def webstats_page:xml(web_address, title='Webstats'):
month_tag = site_now().strftime(str("%Y%m"))
page(title, '')