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
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) }
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", ''), }
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)
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(' ') 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')