class ModelItemListForm(ForModelForm): max_display = forms.IntegerField(initial=10, widget=html.TextInput(cn='span1')) text_search = forms.CharField(required=False) filter = forms.CharField(required=False) exclude = forms.CharField(required=False) order_by = forms.ChoiceField(required=False, widget=html.Select(cn='model-fields'), choices=FieldChoices()) descending = forms.BooleanField(initial=False) headers = forms.ChoiceField(required=False, widget=html.Select(cn='model-fields'), choices=FieldChoices(multiple=True)) table_footer = forms.BooleanField(initial=False, label='footer') display_if_empty = forms.BooleanField(initial=False)
class DateField(Field): widget = html.TextInput(cn='dateinput') validation_error = '{1} is not a valid date.' def _clean(self, value, bfield): if not isinstance(value, date): try: value = dateparser(value) except: raise ValidationError( self.validation_error.format(bfield, value)) return self.todate(value) def todate(self, value): if hasattr(value, 'date'): value = value.date() return value
def handle_params(self, choices=None, **kwargs): '''Choices is an iterable or a callable which takes the form as only argument''' if not isinstance(choices, ChoiceFieldOptions): if not hasattr(choices,'__call__') and\ not hasattr(choices,'__iter__'): raise TypeError('choices must be an instance of\ ChoiceFieldOptions, iterable or a callable. Got "{0}" instead'.format( choices)) choices = ChoiceFieldOptions(query=choices) self.choices = choices if choices.autocomplete: if not self.widget.attrs.get('type') == 'text': self.widget = html.TextInput() self.widget.addClass('autocomplete') elif choices.multiple: self.widget_attrs['multiple'] = 'multiple' self._raise_error(kwargs)
def search_form(name='SearchForm', placeholder='search', input_name=None, submit=None, cn=None, choices=None, label='search text', deafult_style=uni.nolabel, on_submit=None, required=False, **kwargs): '''Create a new :class:`djpcms.forms.HtmlForm` for searching. :parameter name: name of the :class:`Form` :parameter placeholder: text for the ``placeholder`` input attribute. :parameter submit: submit text. If not provided, the form will submit on enter key-stroke. :parameter cn: additional class names for the input element in the form. ''' submit = submit or () input_name = input_name or forms.SEARCH_STRING widget = html.TextInput(placeholder=placeholder, cn=cn) if not submit: widget.addData('options', {'submit': True}) layout = uni.FormLayout(default_style=deafult_style) else: submit = ((submit, 'search'), ) layout = uni.FormLayout(uni.Inlineset(input_name, uni.SUBMITS), default_style=deafult_style) if choices: field = forms.ChoiceField(attrname=input_name, label=label, required=required, choices=choices, widget=widget) else: field = forms.CharField(attrname=input_name, label=label, required=required, widget=widget) form_cls = forms.MakeForm(name, (field, ), on_submit=on_submit) return forms.HtmlForm(form_cls, inputs=submit, layout=layout, **kwargs)
class LoginForm(forms.Form): '''The Standard login form ''' username = forms.CharField(max_length=30, widget=html.TextInput(cn='autocomplete-off')) password = forms.CharField(max_length=60, widget=html.PasswordInput()) def clean(self): '''process login''' data = self.cleaned_data try: user = self.request.view.permissions.authenticate_and_login( self.request.environ, **data) if user: data['user'] = user return except ValueError as e: raise forms.ValidationError(str(e)) raise ValueError('No authentication backend available.') def on_submit(self, commit): return self.cleaned_data['user']
class IntegerField(Field): default = None widget = html.TextInput(cn='numeric') convert_error = '"{0}" is not a valid integer.' def handle_params(self, validator=None, **kwargs): self.validator = validator self._raise_error(kwargs) def clean(self, value, bfield): try: value = value.replace(',', '') except AttributeError: pass return super(IntegerField, self).clean(value, bfield) def _clean(self, value, bfield): try: value = int(value) if self.validator: return self.validator(value) return value except: raise ValidationError(self.convert_error.format(value))
class CharField(Field): '''\ A text :class:`Field` which introduces three optional parameter (attribute): .. attribute:: max_length If provided, the text length will be validated accordingly. Default ``None``. .. attribute:: char_transform One of ``None``, ``u`` for upper and ``l`` for lower. If provided converts text to upper or lower. Default ``None``. .. attribute:: toslug If provided it will be used to create a slug text which can be used as URI without the need to escape. For example, if ``toslug`` is set to "_", than:: bla foo; bee becomes:: bla_foo_bee Default ``None`` ''' default = '' widget = html.TextInput() def handle_params(self, max_length=30, char_transform=None, toslug=None, **kwargs): if not max_length: raise ValueError('max_length must be provided for {0}'\ .format(self.__class__.__name__)) self.max_length = int(max_length) if self.max_length <= 0: raise ValueError('max_length must be positive') self.char_transform = char_transform if toslug: if toslug == True: toslug = '-' toslug = slugify(toslug) self.toslug = toslug self._raise_error(kwargs) def _clean(self, value, bfield): try: value = to_string(value) except: raise ValidationError() if self.toslug: value = slugify(value, self.toslug) if self.char_transform: if self.char_transform == 'u': value = value.upper() else: value = value.lower() if self.required and not value: raise ValidationError( self.validation_error.format(bfield.name, value)) return value