Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
    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))
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
    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)
Пример #7
0
 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
Пример #8
0
 def __init__(self,
              min_length=2,
              divider=None,
              cn=None,
              render_empty=True,
              tag='div'):
     divider = divider or '&rsaquo;'
     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)
Пример #9
0
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 '&rsaquo;'
        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 ''
Пример #10
0
 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 ''
Пример #11
0
 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 ''
Пример #12
0
 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 ""
Пример #13
0
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()
Пример #14
0
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()
Пример #15
0
 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)
Пример #16
0
 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)
Пример #17
0
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 "&rsaquo;"
        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 ""
Пример #18
0
 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']
Пример #19
0
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
Пример #20
0
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
Пример #21
0
    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)
Пример #22
0
    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
Пример #23
0
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)))
Пример #24
0
    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
Пример #25
0
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)))
Пример #26
0
 def __init__(self, min_length=2, divider=None, cn=None, render_empty=True, tag="div"):
     divider = divider or "&rsaquo;"
     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)
Пример #27
0
 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)
Пример #28
0
 def field_widget(self, widget):
     # Override field_widget so that the container for errors is not added
     return Widget('div', widget.bfield.widget)
Пример #29
0
    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
Пример #30
0
def Meta(*args, **kwargs):
    return Widget(_Meta, *args, **kwargs)
Пример #31
0
    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