import os from itertools import chain from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from django import forms from django.forms.util import flatatt from django.utils.html import conditional_escape from django.utils.encoding import force_unicode class PlainWidget(forms.widgets.Widget): ''' Class to define a form widget that effectively nulls the htmls of a widget and reduces the output to only it's value ''' def render(self, name, value, attrs=None): return mark_safe(u'%s' % value) class DetailSelectMultiple(forms.widgets.SelectMultiple): def __init__(self, queryset=None, *args, **kwargs): self.queryset = queryset super(DetailSelectMultiple, self).__init__(*args, **kwargs) def render(self, name, value, attrs=None, choices=(), *args, **kwargs): if value is None: value = '' final_attrs = self.build_attrs(attrs, name=name) css_class = final_attrs.get('class', 'list') output = u'\n') def exists_with_famfam(path): try: return two_state_template(os.path.exists(path)) except Exception, exc: return exc def two_state_template(state, famfam_ok_icon=u'tick', famfam_fail_icon=u'cross'): if state: return mark_safe(u'' % famfam_ok_icon) else: return mark_safe(u'' % famfam_fail_icon) class TextAreaDiv(forms.widgets.Widget): ''' Class to define a form widget that simulates the behavior of a Textarea widget but using a div tag instead ''' def __init__(self, attrs=None): # The 'rows' and 'cols' attributes are required for HTML correctness. default_attrs = {'class': 'text_area_div'} if attrs: default_attrs.update(attrs) super(TextAreaDiv, self).__init__(default_attrs) def render(self, name, value, attrs=None): if value is None: value = '' final_attrs = self.build_attrs(attrs, name=name) result = mark_safe(u'%s' % (flatatt(final_attrs), conditional_escape(force_unicode(value)))) return mark_safe(result.replace('\n', '
')) # From: http://www.peterbe.com/plog/emailinput-html5-django class EmailInput(forms.widgets.Input): ''' Class for a login form widget that accepts only well formated email address ''' input_type = 'email' def render(self, name, value, attrs=None): if attrs is None: attrs = {} attrs.update(dict(autocorrect='off', autocapitalize='off', spellcheck='false')) return super(EmailInput, self).render(name, value, attrs=attrs) class ScrollableCheckboxSelectMultiple(forms.widgets.CheckboxSelectMultiple): ''' Class for a form widget composed of a selection of checkboxes wrapped in a div tag with automatic overflow to add scrollbars when the list exceds the height of the div ''' def render(self, name, value, attrs=None, choices=()): if value is None: value = [] has_id = attrs and 'id' in attrs final_attrs = self.build_attrs(attrs, name=name) output = [u'') return mark_safe(u'
%s
' % u'\n'.join(output))