""" 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) ''' ''' 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) '' '
Date/timeUser IDMessage
' 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, '')