def render_heads(self, request, widget, context): '''Generator of rendered table heads''' for head in self.headers: name = head.code th = Widget('th', head.name, cn=name, title=head.description)\ .addClass(head.extraclass) yield th.render(request)
def stream(self, request, widget, context): '''We override stream since we don't care about a legend in a table row''' children = list(widget.allchildren()) yield Widget('tr', self.stream_errors(request, children))\ .addClass('error-row') yield Widget('tr', self.stream_fields(request, children))
def stream_errors(self, request, children): '''Create the error ``td`` elements. They all have the class ``error``.''' for w in children: b = w.bfield w = Widget('td', cn='error') if b: w.addClass(b.widget.attrs.get('type'))\ .add(b.error).addAttr('id', b.errors_id) yield w
def stream(self, request, widget, context): '''We override inner so that the actual rendering is delegate to :class:`djpcms.html.Table`.''' for s in super(BaseTableElement, self).stream(request, widget, context): yield s tr = Widget('tr', self.render_heads(request, widget, context)) head = Widget('thead', tr) body = Widget('tbody', self.row_generator(request, widget, context)) table = Widget('table', (head, body)) yield table.addClass(self.elem_css).render(request)
def render_footer(self, request, namespace, column, blocks): if column == 0: link = Widget('a','BSD license', href='http://www.opensource.org/licenses/bsd-license.php')\ .addAttr('target','_blank') return Widget('p', ('djpcms code is licensed under ', link, '.')) elif column == 2: return '<p>Powered by <a href="http://www.python.org">Python'\ ' {0}.{1}.{2}</a></p>'.format(*sys.version_info[:3]) else: return html.NON_BREACKING_SPACE
def __init__(self, min_length=2, divider=None, cn=None, render_empty=True, tag='div'): divider = divider or '›' self.divider = "<span class='divider'>" + divider + "</span>" self.min_length = min_length self.render_empty = render_empty self.widget = Widget(tag, cn=cn or classes.breadcrumbs)
class Breadcrumbs(object): '''A lazy class for building a site breadcrumb trail to keep track of current request location. It renders as a ``ul`` element with class name defaulted to ``"breadcrumbs"``. ''' def __init__(self, min_length=2, divider=None, cn=None, render_empty=True, tag='div'): divider = divider or '›' self.divider = "<span class='divider'>" + divider + "</span>" self.min_length = min_length self.render_empty = render_empty self.widget = Widget(tag, cn=cn or classes.breadcrumbs) def items(self, request): crumbs = [] while request: crumbs.append(request) request = request.parent cutoff = self.min_length - 1 if cutoff: crumbs = crumbs[:-cutoff] position = len(crumbs) for request in crumbs: li = Widget('li', cn='position{0}'.format(position)) name = request.view.breadcrumb(request) if position < len(crumbs): url = request.url title = request.title a = Widget('a', name, title=title, href=url) li.add(a) li.add(self.divider) else: li.add(name) position -= 1 yield li def render(self, request): if request.valid: ul = Widget('ul') for li in reversed(tuple(self.items(request))): ul.add(li) if ul: self.widget.add(ul) return self.widget.render(request) if self.render_empty: return NON_BREACKING_SPACE else: return ''
def models_list(self, request, **kwargs): all = [] for c in self.query(request): links = Widget('div', views.application_views_links(c), cn=classes.button_holder) all.append(Widget('dl', (Widget('a', c.title, href=c.url), links))) if all: return Widget('div', all, cn=classes.object_definition) else: return ''
def render(self, request): if request.valid: ul = Widget('ul') for li in reversed(tuple(self.items(request))): ul.add(li) if ul: self.widget.add(ul) return self.widget.render(request) if self.render_empty: return NON_BREACKING_SPACE else: return ''
def render(self, request): if request.valid: ul = Widget("ul") for li in reversed(tuple(self.items(request))): ul.add(li) if ul: self.widget.add(ul) return self.widget.render(request) if self.render_empty: return NON_BREACKING_SPACE else: return ""
def icon(name, size, widget): name = mapping.get(name, name) if not name.startswith('icon-'): name = 'icon-%s' % name inner = Widget('i', cn=name) if size: inner.addClass('icon-{0}'.format(size)) if widget: widget.insert(0, inner) widget.insert(1, ' ') return widget else: return inner.render()
def render_instance_default(self, request, instance, **kwargs): mkp = markups.get(instance.markup) text = instance.body if mkp: text = mkp(request, text) w = Widget('div', text, cn=classes.sitecontent) if instance.javascript: g = script_template % instance.javascript script = g.replace('\r\n', '\n') if request.is_xhr: w.add(script) else: request.media.add(media.Media(js=[script])) return w.render(request)
def render_instance_default(self, request, instance, **kwargs): mkp = markups.get(instance.markup) text = instance.body if mkp: text = mkp(request, text) w = Widget('div', text, cn=classes.sitecontent) if instance.javascript: g = script_template % instance.javascript script = g.replace('\r\n','\n') if request.is_xhr: w.add(script) else: request.media.add(media.Media(js=[script])) return w.render(request)
class Breadcrumbs(object): """A lazy class for building a site breadcrumb trail to keep track of current request location. It renders as a ``ul`` element with class name defaulted to ``"breadcrumbs"``. """ def __init__(self, min_length=2, divider=None, cn=None, render_empty=True, tag="div"): divider = divider or "›" self.divider = "<span class='divider'>" + divider + "</span>" self.min_length = min_length self.render_empty = render_empty self.widget = Widget(tag, cn=cn or classes.breadcrumbs) def items(self, request): crumbs = [] while request: crumbs.append(request) request = request.parent cutoff = self.min_length - 1 if cutoff: crumbs = crumbs[:-cutoff] position = len(crumbs) for request in crumbs: li = Widget("li", cn="position{0}".format(position)) name = request.view.breadcrumb(request) if position < len(crumbs): url = request.url title = request.title a = Widget("a", name, title=title, href=url) li.add(a) li.add(self.divider) else: li.add(name) position -= 1 yield li def render(self, request): if request.valid: ul = Widget("ul") for li in reversed(tuple(self.items(request))): ul.add(li) if ul: self.widget.add(ul) return self.widget.render(request) if self.render_empty: return NON_BREACKING_SPACE else: return ""
def query(self, request, **kwargs): for g in sorted(self.groups(request), key = lambda x : x['title']): url = g['url'] if url: a = Widget('a', g['title'], href=url) else: a = g['title'] yield a, g['body']
def navstream(request, urlselects, secondary_after, level): for request, nav in sorted(((c, c.in_navigation)\ for c in request.auth_children()), key=lambda x : x[1]): if not nav: continue link = application_link(request, asbutton=False) li = Widget('li', link) secondary = secondary_after and nav > secondary_after if link.attrs['href'] in urlselects: li.addClass(classes.state_active) if level: slis = list(navstream(request, urlselects, None, level - 1)) if slis: ul = Widget('ul') for sli, _ in slis: ul.add(sli) li.add(ul) yield li, secondary
def navstream(request, urlselects, secondary_after, level): for request, nav in sorted(((c, c.in_navigation) for c in request.auth_children()), key=lambda x: x[1]): if not nav: continue link = application_link(request, asbutton=False) li = Widget("li", link) secondary = secondary_after and nav > secondary_after if link.attrs["href"] in urlselects: li.addClass(classes.state_active) if level: slis = list(navstream(request, urlselects, None, level - 1)) if slis: ul = Widget("ul") for sli, _ in slis: ul.add(sli) li.add(ul) yield li, secondary
def items(self, request): crumbs = [] while request: crumbs.append(request) request = request.parent cutoff = self.min_length - 1 if cutoff: crumbs = crumbs[:-cutoff] position = len(crumbs) for request in crumbs: li = Widget('li', cn='position{0}'.format(position)) name = request.view.breadcrumb(request) if position < len(crumbs): url = request.url title = request.title a = Widget('a', name, title=title, href=url) li.add(a) li.add(self.divider) else: li.add(name) position -= 1 yield li
def profile(request, callback, Response): tmp = tempfile.mktemp() out = Stream() prof = profiler.Profile() response = prof.runcall(callback) prof.dump_stats(tmp) stats = pstats.Stats(tmp, stream=out) #stats.strip_dirs() # Must happen prior to sort_stats stats.sort_stats('time', 'calls') stats.print_stats() stats_str = out.getvalue() os.unlink(tmp) stats_str = stats_str.split('\n') headers = '\n'.join(make_header(stats_str[:4])) data = data_stream(stats_str[6:], 100) tables = make_stat_table(request, data) w = Widget(cn='profiler') w.add(Widget('div', headers, cn='legend')) w.add(tabs(tables)) content = w.render(request) return to_bytes('\n'.join(html_doc_stream(request, content, 200)))
def items(self, request): crumbs = [] while request: crumbs.append(request) request = request.parent cutoff = self.min_length - 1 if cutoff: crumbs = crumbs[:-cutoff] position = len(crumbs) for request in crumbs: li = Widget("li", cn="position{0}".format(position)) name = request.view.breadcrumb(request) if position < len(crumbs): url = request.url title = request.title a = Widget("a", name, title=title, href=url) li.add(a) li.add(self.divider) else: li.add(name) position -= 1 yield li
def profile(request, callback, Response): tmp = tempfile.mktemp() out = Stream() prof = profiler.Profile() response = prof.runcall(callback) prof.dump_stats(tmp) stats = pstats.Stats(tmp, stream=out) #stats.strip_dirs() # Must happen prior to sort_stats stats.sort_stats('time', 'calls') stats.print_stats() stats_str = out.getvalue() os.unlink(tmp) stats_str = stats_str.split('\n') headers = '\n'.join(make_header(stats_str[:4])) data = data_stream(stats_str[6:],100) tables = make_stat_table(request, data) w = Widget(cn = 'profiler') w.add(Widget('div', headers, cn = 'legend')) w.add(tabs(tables)) content = w.render(request) return to_bytes('\n'.join(html_doc_stream(request, content, 200)))
def __init__(self, min_length=2, divider=None, cn=None, render_empty=True, tag="div"): divider = divider or "›" self.divider = "<span class='divider'>" + divider + "</span>" self.min_length = min_length self.render_empty = render_empty self.widget = Widget(tag, cn=cn or classes.breadcrumbs)
def render_header(self, request, namespace, column, blocks): if column == 0: return Widget( None, ('<h2>Dynamic content management system for Python</h2>', Breadcrumbs().render(request))).render(request)
def field_widget(self, widget): # Override field_widget so that the container for errors is not added return Widget('div', widget.bfield.widget)
def handle_error(self, request, response): '''Render an error into text or Html depending on *content_type*. This function can be overwritten by user implementation.''' exc_info = request.exc_info settings = request.settings status = 500 if exc_info and exc_info[0] is not None: status = getattr(exc_info[1], 'status', status) else: exc_info = None # 302 is a special case, we redirect content_type = request.content_type if status in REDIRECT_CODES: location = dict(exc_info[1].headers)['location'] if request.is_xhr: content = ajax.jredirect(request.environ, location) else: content_type = None response.headers['Location'] = iri_to_uri(location) content = '' else: err_cls = '%s%s' % (classes.error, status) err_title = '%s %s' % (status, error_title(status)) if content_type == 'text/plain': content = err_title if settings.DEBUG: content += '\n\n' + html_trace(exc_info, plain=True) else: inner = Widget('div', cn=(classes.error, err_cls)) if settings.DEBUG: inner.addClass('debug') inner.add(Widget('h2', err_title)) inner.add(Widget('a', request.path, href=request.path)) inner.add(html_trace(exc_info)) else: func_name = 'render_error_%s' % status if hasattr(self, func_name): text = getattr(self, func_name)(request, status) else: text = error_title inner.add(text) if request.is_xhr: content = ajax.jservererror(request.environ, inner.render(request)) else: try: layout = request.view.root.get_page_layout( err_cls, classes.error, 'default') outer = layout() content = outer.render(request, context={'content': inner}) except: logger.error('Could not render %s error on %s layout', status, layout, exc_info=True) content = inner.render(request) if is_renderer(content): response.status_code = 200 response.content_type = content.content_type() content = content.render(request) else: response.content_type = content_type response.status_code = status if status == 500: logger.critical('Interval server error', exc_info=exc_info) return content
def Meta(*args, **kwargs): return Widget(_Meta, *args, **kwargs)
def handle_error(self, request, response): '''Render an error into text or Html depending on *content_type*. This function can be overwritten by user implementation.''' exc_info = request.exc_info settings = request.settings status = 500 if exc_info and exc_info[0] is not None: status = getattr(exc_info[1], 'status', status) else: exc_info = None # 302 is a special case, we redirect content_type = request.content_type if status in REDIRECT_CODES: location = dict(exc_info[1].headers)['location'] if request.is_xhr: content = ajax.jredirect(request.environ, location) else: content_type = None response.headers['Location'] = iri_to_uri(location) content = '' else: err_cls = '%s%s' % (classes.error, status) err_title = '%s %s' % (status, error_title(status)) if content_type == 'text/plain': content = err_title if settings.DEBUG: content += '\n\n' + html_trace(exc_info, plain=True) else: inner = Widget('div', cn=(classes.error, err_cls)) if settings.DEBUG: inner.addClass('debug') inner.add(Widget('h2', err_title)) inner.add(Widget('a', request.path, href=request.path)) inner.add(html_trace(exc_info)) else: func_name = 'render_error_%s' % status if hasattr(self, func_name): text = getattr(self, func_name)(request, status) else: text = error_title inner.add(text) if request.is_xhr: content = ajax.jservererror(request.environ, inner.render(request)) else: try: layout = request.view.root.get_page_layout(err_cls, classes.error, 'default') outer = layout() content = outer.render(request, context={'content': inner}) except: logger.error('Could not render %s error on %s layout', status, layout, exc_info=True) content = inner.render(request) if is_renderer(content): response.status_code = 200 response.content_type = content.content_type() content = content.render(request) else: response.content_type = content_type response.status_code = status if status == 500: logger.critical('Interval server error', exc_info=exc_info) return content