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 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]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"))