You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
6.3 KiB
176 lines
6.3 KiB
import re
|
|
|
|
from cms.models import CMSPlugin
|
|
from cms.models.fields import PageField
|
|
from django.db import models
|
|
from django.template.defaultfilters import slugify
|
|
from django.utils.encoding import python_2_unicode_compatible
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from jsonfield import JSONField
|
|
from unidecode import unidecode
|
|
|
|
from .conf import settings
|
|
from .fields import PluginReferenceField
|
|
from .managers import ActiveFormManager
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class Form(models.Model):
|
|
name = models.CharField(_('Name'), max_length=255, db_index=True, editable=False)
|
|
|
|
objects = models.Manager()
|
|
active_objects = ActiveFormManager()
|
|
|
|
class Meta:
|
|
verbose_name = _('form')
|
|
verbose_name_plural = _('forms')
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class FormDefinition(CMSPlugin):
|
|
name = models.CharField(_('Form Name'), max_length=255)
|
|
|
|
title = models.CharField(_('Title'), max_length=150, blank=True)
|
|
description = models.TextField(_('Description'), blank=True)
|
|
submit_btn_txt = models.CharField(
|
|
_('Submit Button Text'), max_length=100, default=_('Submit'),
|
|
help_text=_('Text for the Submit Button. The default is \'Submit\''))
|
|
|
|
post_submit_msg = models.TextField(
|
|
_('Post Submit Message'), blank=True, default=_('Thank You'),
|
|
help_text=_('Display this message to users after they submit your form.'))
|
|
|
|
# 'HTTP redirect after successful submission'
|
|
success_redirect = models.BooleanField(
|
|
_('Redirect?'), default=False,
|
|
help_text=_('HTTP redirect after successful submission'))
|
|
page_redirect = PageField(
|
|
verbose_name=_('Page URL'), blank=True, null=True,
|
|
on_delete=models.SET_NULL,
|
|
help_text=_('A page has priority over an external URL'))
|
|
external_redirect = models.URLField(
|
|
_('External URL'), blank=True,
|
|
help_text=_('e.g. http://example.com/thank-you'))
|
|
|
|
# Email
|
|
email_to = models.CharField(
|
|
_('Send form data to e-mail address'), max_length=255, blank=True,
|
|
help_text=_('Separate several addresses with a comma.'))
|
|
email_from = models.EmailField(_('Sender Email Address'), max_length=255, blank=True)
|
|
email_subject = models.CharField(_('Email Subject'), max_length=255, blank=True)
|
|
email_uploaded_files = models.BooleanField(
|
|
_('Send uploaded files as email attachments'), default=True)
|
|
|
|
# Save to database
|
|
save_data = models.BooleanField(
|
|
_('Save to database'), default=True,
|
|
help_text=_('Logs all form submissions to the database.'))
|
|
spam_protection = models.SmallIntegerField(
|
|
_('Spam Protection'),
|
|
choices=settings.DJANGOCMS_FORMS_SPAM_PROTECTIONS,
|
|
default=settings.DJANGOCMS_FORMS_DEFAULT_SPAM_PROTECTION)
|
|
|
|
form_template = models.CharField(
|
|
_('Form Template'), max_length=150, blank=True,
|
|
choices=settings.DJANGOCMS_FORMS_TEMPLATES,
|
|
default=settings.DJANGOCMS_FORMS_DEFAULT_TEMPLATE,
|
|
)
|
|
|
|
plugin_reference = PluginReferenceField(Form, related_name='plugin')
|
|
|
|
class Meta:
|
|
verbose_name_plural = _('forms')
|
|
verbose_name = _('form')
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
@property
|
|
def redirect_url(self):
|
|
if self.page_redirect:
|
|
return self.page_redirect.get_absolute_url()
|
|
elif self.external_redirect:
|
|
return self.external_redirect
|
|
|
|
@property
|
|
def upload_to(self):
|
|
return '%s-%s' % (
|
|
slugify(unidecode(self.name)).replace('_', '-'),
|
|
self.plugin_reference_id)
|
|
|
|
def copy_relations(self, oldinstance):
|
|
for field in oldinstance.fields.all():
|
|
field.pk = None
|
|
field.form = self
|
|
field.save()
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class FormField(models.Model):
|
|
form = models.ForeignKey(FormDefinition, related_name='fields')
|
|
field_type = models.CharField(
|
|
_('Field Type'), max_length=100,
|
|
choices=settings.DJANGOCMS_FORMS_FIELD_TYPES,
|
|
default=settings.DJANGOCMS_FORMS_DEFAULT_FIELD_TYPE)
|
|
label = models.CharField(_('name'), max_length=255)
|
|
placeholder_text = models.CharField(_('Placeholder Text'), blank=True, max_length=100)
|
|
required = models.BooleanField(_('Required'), default=True)
|
|
help_text = models.TextField(
|
|
_('Description'), blank=True,
|
|
help_text=_('A description / instructions for this field.'))
|
|
initial = models.CharField(_('Default Value'), max_length=255, blank=True)
|
|
choice_values = models.TextField(
|
|
_('Choices'), blank=True,
|
|
help_text=_('Enter options one per line. For "File Upload" '
|
|
'field type, enter allowed filetype (e.g .pdf) one per line.'))
|
|
position = models.PositiveIntegerField(_('Position'), blank=True, null=True)
|
|
|
|
class Meta:
|
|
verbose_name_plural = _('fields')
|
|
verbose_name = _('field')
|
|
ordering = ('position', )
|
|
|
|
def __str__(self):
|
|
return self.label
|
|
|
|
def field_attrs(self):
|
|
args = {
|
|
'required': self.required,
|
|
'label': self.label if self.label else '',
|
|
'initial': self.initial if self.initial else None,
|
|
'help_text': self.help_text,
|
|
}
|
|
return args
|
|
|
|
def get_choices(self):
|
|
if self.choice_values:
|
|
regex = re.compile('[\s]*\n[\s]*')
|
|
choices = regex.split(self.choice_values)
|
|
return [(str(choice.encode('utf-8')), str(choice.encode('utf-8'))) for choice in choices]
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class FormSubmission(models.Model):
|
|
plugin = models.ForeignKey(
|
|
Form, verbose_name=_('Form'), editable=False, related_name='submissions')
|
|
creation_date = models.DateTimeField(_('Date'), auto_now=True)
|
|
created_by = models.ForeignKey(
|
|
settings.AUTH_USER_MODEL, verbose_name=_('User'), editable=False, null=True)
|
|
ip = models.GenericIPAddressField(verbose_name='IP', blank=True, null=True)
|
|
referrer = models.CharField(_('Referrer URL'), max_length=150, blank=True)
|
|
|
|
form_data = JSONField(_('Form Data'))
|
|
|
|
class Meta:
|
|
verbose_name_plural = _('form submissions')
|
|
verbose_name = _('form submission')
|
|
ordering = ('-creation_date', )
|
|
permissions = (
|
|
('export_formsubmission', 'Can export Form Submission'),
|
|
)
|
|
|
|
def __str__(self):
|
|
return u'%s' % self.plugin
|
|
|