Source code for mails.forms
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django import forms
from .core import MailEngine
from .exceptions import ConfigurationError
from .widgets import SummernoteEditor
[docs]class EmailForm(forms.Form):
"""
This form is prefilled with data from a mail_code and is used by any user to send out
the mail after editing.
"""
subject = forms.CharField(max_length=255, label="Subject*")
text = forms.CharField(widget=SummernoteEditor, label="Text*")
mail_field = forms.EmailField(label="Optional: bcc this email to", required=False)
prefix = "mail_form"
extra_config = {}
def __init__(self, *args, **kwargs):
self.mail_code = kwargs.pop("mail_code")
# Check if all exta configurations are valid.
self.extra_config.update(kwargs.pop("mail_config", {}))
if not all(
key in MailEngine._possible_parameters
for key, val in self.extra_config.items()
):
raise KeyError("Not all `extra_config` parameters are accepted.")
# This form shouldn't be is_bound==True is there is any non-relavant POST data given.
if len(args) > 0 and args[0]:
data = args[0]
elif "data" in kwargs:
data = kwargs.pop("data")
else:
data = {}
if "%s-subject" % self.prefix in data.keys():
data = {
"%s-subject" % self.prefix: data.get("%s-subject" % self.prefix),
"%s-text" % self.prefix: data.get("%s-text" % self.prefix),
"%s-mail_field" % self.prefix: data.get("%s-mail_field" % self.prefix),
}
else:
# Reset to prevent having a false-bound form.
data = {}
super().__init__(data or None)
# Set the data as initials
self.engine = MailEngine(self.mail_code, **self.extra_config, **kwargs)
self.engine.validate(render_template=True)
self.fields["text"].widget = SummernoteEditor(
csp_nonce=kwargs.pop("csp_nonce", "Hello!")
)
self.fields["text"].initial = self.engine.mail_data["html_message"]
self.fields["subject"].initial = self.engine.mail_data["subject"]
[docs] def is_valid(self):
"""Fallback used in CBVs."""
if super().is_valid():
try:
self.engine.validate(render_template=False)
return True
except (ImportError, KeyError, ConfigurationError):
return False
return False
[docs] def save(self):
self.engine.render_template(self.cleaned_data["text"])
self.engine.mail_data["subject"] = self.cleaned_data["subject"]
if self.cleaned_data["mail_field"]:
self.engine.mail_data["bcc"].append(self.cleaned_data["mail_field"])
self.engine.send_mail()
return self.engine.template_variables["object"]
[docs]class HiddenDataForm(forms.Form):
"""
Regular Django form which tranforms all fields to hidden fields.
BE AWARE: This form may only be used for non-sensitive data!
Any data that may not be interceptedby the used should NEVER be added to this form.
"""
def __init__(self, form, *args, **kwargs):
super().__init__(form.data, *args, **kwargs)
for name, field in form.fields.items():
self.fields[name] = field
self.fields[name].widget = forms.HiddenInput()