Source code for mezzanine.forms.models
from __future__ import unicode_literals
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
from mezzanine.conf import settings
from mezzanine.core.fields import RichTextField
from mezzanine.core.models import Orderable, RichText, wrapped_manager
from mezzanine.forms import fields
from mezzanine.pages.models import Page
[docs]class FieldManager(models.Manager):
"""
Only show visible fields when displaying actual form..
"""
def visible(self):
return self.filter(visible=True)
[docs]@python_2_unicode_compatible
class AbstractBaseField(Orderable):
"""
A field for a user-built form.
"""
label = models.TextField(_("Label"))
field_type = models.IntegerField(_("Type"), choices=fields.NAMES)
required = models.BooleanField(_("Required"), default=True)
visible = models.BooleanField(_("Visible"), default=True)
choices = models.CharField(_("Choices"), max_length=1000, blank=True,
help_text=_("Comma separated options where applicable. If an option "
"itself contains commas, surround the option with `backticks`."))
default = models.CharField(_("Default value"), blank=True,
max_length=settings.FORMS_FIELD_MAX_LENGTH)
placeholder_text = models.CharField(_("Placeholder Text"), blank=True,
max_length=100)
help_text = models.TextField(_("Help text"), blank=True)
objects = wrapped_manager(FieldManager)
class Meta:
abstract = True
verbose_name = _("Field")
verbose_name_plural = _("Fields")
def __str__(self):
return self.label
[docs] def get_choices(self):
"""
Parse a comma separated choice string into a list of choices taking
into account quoted choices.
"""
choice = ""
(quote, unquote) = ("`", "`")
quoted = False
for char in self.choices:
if not quoted and char == quote:
quoted = True
elif quoted and char == unquote:
quoted = False
elif char == "," and not quoted:
choice = choice.strip()
if choice:
yield choice, choice
choice = ""
else:
choice += char
choice = choice.strip()
if choice:
yield choice, choice
[docs] def is_a(self, *args):
"""
Helper that returns ``True`` if the field's type is given in any arg.
"""
return self.field_type in args
[docs]class Field(AbstractBaseField):
form = models.ForeignKey("Form", on_delete=models.CASCADE,
related_name="fields")
class Meta(AbstractBaseField.Meta):
order_with_respect_to = "form"
[docs]class FormEntry(models.Model):
"""
An entry submitted via a user-built form.
"""
form = models.ForeignKey("Form", on_delete=models.CASCADE,
related_name="entries")
entry_time = models.DateTimeField(_("Date/time"))
class Meta:
verbose_name = _("Form entry")
verbose_name_plural = _("Form entries")
[docs]class FieldEntry(models.Model):
"""
A single field value for a form entry submitted via a user-built form.
"""
entry = models.ForeignKey("FormEntry", on_delete=models.CASCADE,
related_name="fields")
field_id = models.IntegerField()
value = models.CharField(max_length=settings.FORMS_FIELD_MAX_LENGTH,
null=True)
class Meta:
verbose_name = _("Form field entry")
verbose_name_plural = _("Form field entries")