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'
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), ]
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)
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)}
def non_strict_render(obj, role=None, ctx=None, strict=False): return render(obj, role=role, ctx=ctx, strict=strict)
def test_render_arbitrary_types(self): assert render(CustomType()) == 'custom' assert render(CustomTypeWithHtml()) == '<div>custom</div>'
def test_escape_strings_when_rendering(self): assert render('<') == '<' assert render([1, 2]) == '<ul><li>1</li><li>2</li></ul>' assert render({'foo': 'bar'}) == '<dl><dt>foo</dt><dd>bar</dd></dl>'
def test_render_base_python_types(self): assert render('hello') == 'hello' assert render(42) == '42' assert render(3.14) == '3.14'
def _render_lazy_string(st, **kwargs): return render(str(st))
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)}
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)}