def add_class_attrs(self, widget=None):
        if not widget:
            widget = self.widget

        # for multiwidgets we recursively update classes for each sub-widget
        if isinstance(widget, AdminSplitDateTime):
            for w in widget.widgets:
                self.add_class_attrs(w)
            return

        classes = widget.attrs.get('class', '')
        if isinstance(widget, ReadOnlyPasswordHashWidget):
            classes = add_css_class(classes, 'form-control-static', prepend=True)
        elif isinstance(widget, (AdminDateWidget,
                                 AdminTimeWidget,
                                 RelatedFieldWidgetWrapper)):
            # for some admin widgets we don't want the input to take full horizontal space
            classes = add_css_class(classes, 'form-control form-control-inline', prepend=True)
        elif not isinstance(widget, (CheckboxInput,
                                     RadioSelect,
                                     CheckboxSelectMultiple,
                                     FileInput)):
            classes = add_css_class(classes, 'form-control', prepend=True)
            # For these widget types, add the size class here
            classes = add_css_class(classes, self.get_size_class())
        widget.attrs['class'] = classes
    def test_add_css_class(self):
        css_classes = "one two"
        css_class = "three four"
        classes = add_css_class(css_classes, css_class)
        self.assertEqual(classes, "one two three four")

        classes = add_css_class(css_classes, css_class, prepend=True)
        self.assertEqual(classes, "three four one two")
 def get_label_class(self):
     label_class = self.label_class
     if not label_class and self.layout == 'horizontal':
         label_class = self.horizontal_label_class
     label_class = text_value(label_class)
     if not self.show_label:
         label_class = add_css_class(label_class, 'sr-only')
     return add_css_class(label_class, 'col-form-label')
 def add_class_attrs(self, widget=None):
     if widget is None:
         widget = self.widget
     classes = widget.attrs.get('class', '')
     if isinstance(widget, ReadOnlyPasswordHashWidget):
         classes = add_css_class(classes, 'form-control-static', prepend=True)
     elif not isinstance(widget, self.WIDGETS_NO_FORM_CONTROL):
         classes = add_css_class(classes, 'form-control', prepend=True)
         classes = add_css_class(classes, self.get_size_class())
     widget.attrs['class'] = classes
Exemple #5
0
def tab_item(context, title, url='#', **kwargs):
    show = kwargs.get('show', True)
    if not show:
        return {'show': show}

    compactable = kwargs.get('compactable')
    compact_only = kwargs.get('compact_only')
    icon = kwargs.get('icon')

    if icon is None and (compactable or compact_only):
        raise template.TemplateSyntaxError(
            "'icon' is required, when 'compactable' is True or 'compact_only' is True"
        )

    link_css = 'text-nowrap nav-item nav-link'

    if icon:
        link_css = add_css_class(link_css, 'mdi mdi-{}'.format(icon))

    text_color = kwargs.get('text_color')
    if text_color:
        link_css = add_css_class(link_css, 'text-{}'.format(text_color))

    css = kwargs.get('css')
    if css:
        link_css = add_css_class(link_css, css)

    active = get_active(context=context, url=url, **kwargs)
    if active:
        link_css = add_css_class(link_css, active)

    user = context.get('user')

    return {
        'title':
        title,
        'url':
        url,
        'link_css':
        link_css,
        'counters':
        get_counters(**kwargs),
        'compactable':
        compactable,
        'compact_only':
        compact_only,
        'toggle':
        kwargs.get('toggle'),
        'json_ld':
        generate_site_navigation_element_json_ld(title, url)
        if not user or user.is_anonymous else None,
        'show':
        kwargs.get('show', True)
    }
Exemple #6
0
def render_button(content,
                  button_type=None,
                  icon=None,
                  button_class='',
                  size='',
                  href='',
                  name=None,
                  value=None,
                  title=None):
    attrs = {}
    classes = add_css_class('btn', button_class)
    size = text_value(size).lower().strip()
    if size == 'xs':
        classes = add_css_class(classes, 'btn-xs')
    elif size == 'sm' or size == 'small':
        classes = add_css_class(classes, 'btn-sm')
    elif size == 'lg' or size == 'large':
        classes = add_css_class(classes, 'btn-lg')
    elif size == 'md' or size == 'medium':
        pass
    elif size:
        raise BootstrapError(
            'Parameter "size" should be "xs", "sm", "lg" or empty ("{}" given).'
            .format(size))
    if button_type:
        if button_type == 'submit':
            classes = add_css_class(classes, 'btn-primary')
            attrs['class'] = 'btn btn-primary'
        elif button_type == 'reset':
            attrs['class'] = 'btn btn-warning'
        elif button_type not in ('reset', 'button', 'link'):
            raise BootstrapError(
                'Parameter "button_type" should be "submit", "reset", "button", "link" or empty ("{}" given).'
                .format(button_type))
        attrs['type'] = button_type
        icon_content = render_icon(icon) if icon else ''
        if href:
            attrs['href'] = href
            tag = 'a'
        else:
            tag = 'button'
        if name:
            attrs['name'] = name
        if value:
            attrs['value'] = value
        if title:
            attrs['title'] = title
        return render_tag(tag,
                          attrs=attrs,
                          content=mark_safe(
                              text_concat(icon_content, content,
                                          separator=' ')))
 def get_form_group_class(self):
     form_group_class = self.form_group_class
     if self.field.errors and self.error_css_class:
         form_group_class = add_css_class(
             form_group_class, self.error_css_class)
     if self.field.field.required and self.required_css_class:
         form_group_class = add_css_class(
             form_group_class, self.required_css_class)
     if self.field_errors:
         form_group_class = add_css_class(form_group_class, 'has-error')
     elif self.field.form.is_bound:
         form_group_class = add_css_class(
             form_group_class, self.success_css_class)
     if self.layout == 'horizontal':
         form_group_class = add_css_class(
             form_group_class, self.get_size_class(prefix='form-group'))
     return form_group_class
 def wrap_widget(self, html):
     if isinstance(self.widget, CheckboxInput):
         checkbox_class = add_css_class('form-check', self.get_size_class())
         html = '<div class="{klass}">{content}</div>'.format(
             klass=checkbox_class,
             content=html,
         )
     return html
 def list_to_class(self, html, klass):
     classes = add_css_class(klass, self.get_size_class())
     mapping = [
         ('<ul', '<div'),
         ('</ul>', '</div>'),
         ('<li', '<div class="{klass}"'.format(klass=classes)),
         ('</li>', '</div>'),
     ]
     for k, v in mapping:
         html = html.replace(k, v)
     return html
def recaptcha(classes=''):
    """
    Google recaptcha template tag, which should be included in forms

    :param classes: additional classes
    :return: rendered template
    """
    return {
        'classes': add_css_class('g-recaptcha', classes, prepend=True),
        'site_key': getattr(settings, "GOOGLE_RECAPTCHA_SITE_KEY", ''),
    }
Exemple #11
0
def render_icon(icon, **kwargs):
    """
    Render a Bootstrap glyphicon icon
    """
    attrs = {
        'class':
        add_css_class(
            'icon icon-{icon}'.format(icon=icon),
            kwargs.get('extra_classes', ''),
        )
    }
    title = kwargs.get('title')
    if title:
        attrs['title'] = title
    return render_tag('span', attrs=attrs)
Exemple #12
0
def render_field_and_label(field,
                           label,
                           field_class='',
                           label_for=None,
                           label_class='',
                           layout='',
                           **kwargs):
    if layout == 'horizontal':
        if not label_class:
            label_class = get_bootstrap_setting('horizontal_label_class')
        if not field_class:
            field_class = get_bootstrap_setting('horizontal_field_class')
        if not label:
            label = mark_safe('&#160;')
        label_class = add_css_class(label_class, 'col-form-label')
    html = field
    if field_class:
        html = '<div class="{klass}">{html}</div>'.format(klass=field_class,
                                                          html=html)
    if label:
        html = render_label(
            label, label_for=label_for, label_class=label_class) + html
    return html
 def get_label_class(self):
     return add_css_class(self.label_class, 'sr-only')