mirror of
https://github.com/Hopiu/wagtail.git
synced 2026-05-14 18:23:14 +00:00
This is because DateFields are not timezone aware which causes warnings to be raised by django. The widgets are still set to "DateInput" so the look and behaviour should not change
110 lines
3.7 KiB
Python
110 lines
3.7 KiB
Python
import django.forms
|
|
from django.utils.datastructures import SortedDict
|
|
|
|
|
|
class BaseForm(django.forms.Form):
|
|
def __init__(self, *args, **kwargs):
|
|
kwargs.setdefault('label_suffix', '')
|
|
return super(BaseForm, self).__init__(*args, **kwargs)
|
|
|
|
|
|
class FormBuilder(object):
|
|
def __init__(self, fields):
|
|
self.fields = fields
|
|
|
|
def create_singleline_field(self, field, options):
|
|
# TODO: This is a default value - it may need to be changed
|
|
options['max_length'] = 255
|
|
return django.forms.CharField(**options)
|
|
|
|
def create_multiline_field(self, field, options):
|
|
return django.forms.CharField(widget=django.forms.Textarea, **options)
|
|
|
|
def create_date_field(self, field, options):
|
|
return django.forms.DateField(**options)
|
|
|
|
def create_datetime_field(self, field, options):
|
|
return django.forms.DateTimeField(**options)
|
|
|
|
def create_email_field(self, field, options):
|
|
return django.forms.EmailField(**options)
|
|
|
|
def create_url_field(self, field, options):
|
|
return django.forms.URLField(**options)
|
|
|
|
def create_number_field(self, field, options):
|
|
return django.forms.DecimalField(**options)
|
|
|
|
def create_dropdown_field(self, field, options):
|
|
options['choices'] = map(
|
|
lambda x: (x.strip(), x.strip()),
|
|
field.choices.split(',')
|
|
)
|
|
return django.forms.ChoiceField(**options)
|
|
|
|
def create_radio_field(self, field, options):
|
|
options['choices'] = map(
|
|
lambda x: (x.strip(), x.strip()),
|
|
field.choices.split(',')
|
|
)
|
|
return django.forms.ChoiceField(widget=django.forms.RadioSelect, **options)
|
|
|
|
def create_checkboxes_field(self, field, options):
|
|
options['choices'] = [(x.strip(), x.strip()) for x in field.choices.split(',')]
|
|
options['initial'] = [x.strip() for x in field.default_value.split(',')]
|
|
return django.forms.MultipleChoiceField(
|
|
widget=django.forms.CheckboxSelectMultiple, **options
|
|
)
|
|
|
|
def create_checkbox_field(self, field, options):
|
|
return django.forms.BooleanField(**options)
|
|
|
|
FIELD_TYPES = {
|
|
'singleline': create_singleline_field,
|
|
'multiline': create_multiline_field,
|
|
'date': create_date_field,
|
|
'datetime': create_datetime_field,
|
|
'email': create_email_field,
|
|
'url': create_url_field,
|
|
'number': create_number_field,
|
|
'dropdown': create_dropdown_field,
|
|
'radio': create_radio_field,
|
|
'checkboxes': create_checkboxes_field,
|
|
'checkbox': create_checkbox_field,
|
|
}
|
|
|
|
@property
|
|
def formfields(self):
|
|
formfields = SortedDict()
|
|
|
|
for field in self.fields:
|
|
options = self.get_field_options(field)
|
|
|
|
if field.field_type in self.FIELD_TYPES:
|
|
formfields[field.clean_name] = self.FIELD_TYPES[field.field_type](self, field, options)
|
|
else:
|
|
raise Exception("Unrecognised field type: " + form.field_type)
|
|
|
|
return formfields
|
|
|
|
def get_field_options(self, field):
|
|
options = {}
|
|
options['label'] = field.label
|
|
options['help_text'] = field.help_text
|
|
options['required'] = field.required
|
|
options['initial'] = field.default_value
|
|
return options
|
|
|
|
def get_form_class(self):
|
|
return type('WagtailForm', (BaseForm,), self.formfields)
|
|
|
|
|
|
class SelectDateForm(django.forms.Form):
|
|
date_from = django.forms.DateTimeField(
|
|
required=False,
|
|
widget=django.forms.DateInput(attrs={'placeholder': 'Date from'})
|
|
)
|
|
date_to = django.forms.DateTimeField(
|
|
required=False,
|
|
widget=django.forms.DateInput(attrs={'placeholder': 'Date to'})
|
|
)
|