X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/82c38a77943cf91a084429bf10740edffbd0c195..2f9cb34a07fcd98effda2fa900e48c31813f14c8:/apps/forms_builder/forms/fields.py diff --git a/apps/forms_builder/forms/fields.py b/apps/forms_builder/forms/fields.py new file mode 100644 index 00000000..40b2d9e1 --- /dev/null +++ b/apps/forms_builder/forms/fields.py @@ -0,0 +1,106 @@ +from __future__ import unicode_literals + +from django.core.exceptions import ImproperlyConfigured +from django import forms +from django.forms.extras import SelectDateWidget +from django.utils.translation import ugettext_lazy as _ + +from forms_builder.forms.settings import USE_HTML5, EXTRA_FIELDS, EXTRA_WIDGETS +from forms_builder.forms.utils import html5_field, import_attr + + +# Constants for all available field types. +TEXT = 1 +TEXTAREA = 2 +EMAIL = 3 +CHECKBOX = 4 +CHECKBOX_MULTIPLE = 5 +SELECT = 6 +SELECT_MULTIPLE = 7 +RADIO_MULTIPLE = 8 +FILE = 9 +DATE = 10 +DATE_TIME = 11 +HIDDEN = 12 +NUMBER = 13 +URL = 14 +DOB = 15 + +# Names for all available field types. +NAMES = ( + (TEXT, _("Single line text")), + (TEXTAREA, _("Multi line text")), + (EMAIL, _("Email")), + (NUMBER, _("Number")), + (URL, _("URL")), + (CHECKBOX, _("Check box")), + (CHECKBOX_MULTIPLE, _("Check boxes")), + (SELECT, _("Drop down")), + (SELECT_MULTIPLE, _("Multi select")), + (RADIO_MULTIPLE, _("Radio buttons")), + (FILE, _("File upload")), + (DATE, _("Date")), + (DATE_TIME, _("Date/time")), + (DOB, _("Date of birth")), + (HIDDEN, _("Hidden")), +) + +# Field classes for all available field types. +CLASSES = { + TEXT: forms.CharField, + TEXTAREA: forms.CharField, + EMAIL: forms.EmailField, + CHECKBOX: forms.BooleanField, + CHECKBOX_MULTIPLE: forms.MultipleChoiceField, + SELECT: forms.ChoiceField, + SELECT_MULTIPLE: forms.MultipleChoiceField, + RADIO_MULTIPLE: forms.ChoiceField, + FILE: forms.FileField, + DATE: forms.DateField, + DATE_TIME: forms.DateTimeField, + DOB: forms.DateField, + HIDDEN: forms.CharField, + NUMBER: forms.FloatField, + URL: forms.URLField, +} + +# Widgets for field types where a specialised widget is required. +WIDGETS = { + TEXTAREA: forms.Textarea, + CHECKBOX_MULTIPLE: forms.CheckboxSelectMultiple, + RADIO_MULTIPLE: forms.RadioSelect, + DATE: SelectDateWidget, + DOB: SelectDateWidget, + HIDDEN: forms.HiddenInput, +} + +# Some helper groupings of field types. +CHOICES = (CHECKBOX, SELECT, RADIO_MULTIPLE) +DATES = (DATE, DATE_TIME, DOB) +MULTIPLE = (CHECKBOX_MULTIPLE, SELECT_MULTIPLE) + +# HTML5 Widgets +if USE_HTML5: + WIDGETS.update({ + DATE: html5_field("date", forms.DateInput), + DATE_TIME: html5_field("datetime", forms.DateTimeInput), + DOB: html5_field("date", forms.DateInput), + EMAIL: html5_field("email", forms.TextInput), + NUMBER: html5_field("number", forms.TextInput), + URL: html5_field("url", forms.TextInput), + }) + +# Add any custom fields defined. +for field_id, field_path, field_name in EXTRA_FIELDS: + if field_id in CLASSES: + err = "ID %s for field %s in FORMS_EXTRA_FIELDS already exists" + raise ImproperlyConfigured(err % (field_id, field_name)) + CLASSES[field_id] = import_attr(field_path) + NAMES += ((field_id, _(field_name)),) + +# Add/update custom widgets. +for field_id, widget_path in EXTRA_WIDGETS: + if field_id not in CLASSES: + err = "ID %s in FORMS_EXTRA_WIDGETS does not match a field" + raise ImproperlyConfigured(err % field_id) + WIDGETS[field_id] = import_attr(widget_path)