--- /dev/null
+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)