示例#1
0
    def test_dispatch_custom_type(self):
        class Type:
            pass

        @html.register(Type)
        def render_type(_, role=None):
            return Text('html' if role is None else f'html-{role}')

        assert render(Type()) == 'html'
        assert render(Type(), role='detail') == 'html-detail'
示例#2
0
def render_collapsible(lst,
                       item_role='collapsible-item',
                       title=None,
                       expanded=False,
                       **kwargs):
    """
    Renders a queryset or list of objects

    Args:
        lst:
            List or queryset of objects inside the collapsible list.
        item_role:
            Role assigned to each element in the list. Defaults to
            'collapsible-item'.
        title (bool):
            Title in which the list of object is displayed.
        expanded (str):
            If true, start list in the "expanded" state.
    """
    if title is None:
        if isinstance(lst, QuerySet):
            title = title.model._meta.verbose_name_plural
        else:
            raise TypeError('must provide an explicit title!')

    data = [render(x, item_role, **kwargs) for x in lst]
    random_id = str(uuid.uuid4())
    display = 'block' if expanded else 'none'

    return div(
        class_='CollapsibleList'
    )[h2(onclick=f"$('#{random_id}').toggle()",
         children=[title, span(f'({len(data)})'),
                   fa_icon('angle-down')]),
      html_list(data, style=f'display: {display}', id=random_id), ]
示例#3
0
    def render_queryset(qs, role=None, **kwargs):
        """
        Renders a queryset object. Dispatch by role and model.
        """
        model = qs.model
        key = (model, role)
        if role:
            kwargs['role'] = role

        try:
            renderer = registry[key]
        except KeyError:
            return html_list(render(x, **kwargs) for x in qs)
        else:
            return renderer(qs, **kwargs)
示例#4
0
def role_model_list(request, model, role):
    cls = get_class(model)
    kwargs = query_to_kwargs(request)
    size = kwargs.pop('size', 10)
    data = []
    for idx, obj in enumerate(cls.objects.all()[:size], 1):
        link = reverse('role-model-instance',
                       kwargs={
                           'model': model,
                           'role': role,
                           'id': obj.id
                       })
        key = span([f'{idx}) ', a(str(obj), href=link)])
        data.append((key, render(obj, role, **kwargs)))

    return {'data': html_map(data)}
示例#5
0
def non_strict_render(obj, role=None, ctx=None, strict=False):
    return render(obj, role=role, ctx=ctx, strict=strict)
示例#6
0
 def test_render_arbitrary_types(self):
     assert render(CustomType()) == 'custom'
     assert render(CustomTypeWithHtml()) == '<div>custom</div>'
示例#7
0
 def test_escape_strings_when_rendering(self):
     assert render('<') == '&lt;'
     assert render([1, 2]) == '<ul><li>1</li><li>2</li></ul>'
     assert render({'foo': 'bar'}) == '<dl><dt>foo</dt><dd>bar</dd></dl>'
示例#8
0
 def test_render_base_python_types(self):
     assert render('hello') == 'hello'
     assert render(42) == '42'
     assert render(3.14) == '3.14'
示例#9
0
def _render_lazy_string(st, **kwargs):
    return render(str(st))
示例#10
0
def role_queryset(request, model, role):
    cls = get_class(model)
    qs = cls.objects.all()
    kwargs = query_to_kwargs(request)
    size = kwargs.pop('size', 10)
    return {'data': render(qs[:size], role, **kwargs)}
示例#11
0
def role_model_instance(request, model, role, id):
    cls = get_class(model)
    obj = cls.objects.get(id=id)
    kwargs = query_to_kwargs(request)
    return {'data': render(obj, role, **kwargs)}