Source code for pagetools.pages.forms

import logging
import os

from captcha.fields import CaptchaField
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
from django import forms
from django.core.exceptions import ValidationError
from django.core.mail import send_mail
from django.forms import widgets
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _

from pagetools.pages.validators import validate_emails_str
from pagetools.settings import SUBMIT_BUTTON_CLASSES

from .settings import MAILFORM_RECEIVERS, MAILFORM_SENDER


logger = logging.getLogger(__name__)


[docs]class DynMultipleChoiceField(forms.MultipleChoiceField): def __init__(self, **kwargs): try: label, values = kwargs["label"].split(":") except ValueError as exc: raise ValidationError(_('ChoiceField name must be "name: option1, option2 [...])')) from exc kwargs.update( { "label": label, "choices": [(slugify(v), v) for v in values.split(",")], "widget": widgets.CheckboxSelectMultiple, } ) super().__init__(**kwargs)
[docs]class SendEmailForm(forms.Form): IGNORED_FIELDS_IN_MESSAGE = ("captcha",) USE_MAILRECEIVERS = True def __init__(self, *args, **kwargs): self.mailreceivers = kwargs.pop("mailreceivers", None) or MAILFORM_RECEIVERS super().__init__(*args, **kwargs) self.helper = FormHelper() self.helper.form_method = "post" self.helper.add_input(Submit("submit", _("Submit"), css_class=SUBMIT_BUTTON_CLASSES))
[docs] def get_mailmessage(self): return os.linesep.join( [ "%s\t%s" % (field.name, field.value()) for field in self if field.name not in self.IGNORED_FIELDS_IN_MESSAGE ] )
[docs] def get_mailsubject(self): return _("Form submission")
[docs] def get_mailreceivers(self): return self.mailreceivers
[docs] def get_mailsender(self): return MAILFORM_SENDER
[docs] def is_valid(self): _is_valid = super().is_valid() if _is_valid: send_mail( self.get_mailsubject(), self.get_mailmessage(), self.get_mailsender(), self.get_mailreceivers(), fail_silently=False, ) return _is_valid
[docs] def clean(self): super().clean() if not self.mailreceivers: raise ValidationError(_("An error occured")) validate_emails_str(",".join(self.mailreceivers))
[docs] def get_error_msg(self): return _("An error occured")
[docs]class ContactForm(SendEmailForm): subject = forms.CharField(max_length=100, label=_("About"), required=True) name = forms.CharField(label=_("Your Name")) sender = forms.EmailField(label=_("E-Mail")) message = forms.CharField(widget=forms.widgets.Textarea(), label=_("Message"))
[docs]class CaptchaContactForm(ContactForm): captcha = CaptchaField()