SciPost Code Repository

Skip to content
Snippets Groups Projects
forms.py 2.76 KiB
Newer Older
__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django import forms
Jorran de Wit's avatar
Jorran de Wit committed

Jorran de Wit's avatar
Jorran de Wit committed
from .mixins import MailUtilsMixin
from .widgets import SummernoteEditor

Jorran de Wit's avatar
Jorran de Wit committed
class EmailTemplateForm(forms.Form, MailUtilsMixin):
Jorran de Wit's avatar
Jorran de Wit committed
    subject = forms.CharField(max_length=250, label="Subject*")
    text = forms.CharField(widget=SummernoteEditor, label="Text*")
    extra_recipient = forms.EmailField(label="Optional: bcc this email to", required=False)
    prefix = 'mail_form'

    def __init__(self, *args, **kwargs):
Jorran de Wit's avatar
Jorran de Wit committed
        self.pre_validation(*args, **kwargs)

Jorran de Wit's avatar
Jorran de Wit committed
        # This form shouldn't be is_bound==True is there is any non-relavant POST data given.
        data = args[0] if args else {}
        data = kwargs['data'] if 'data' in kwargs else data
Jorran de Wit's avatar
Jorran de Wit committed
        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-extra_recipient' % self.prefix: data.get('%s-extra_recipient' % self.prefix),
            }
        else:
            data = None
Jorran de Wit's avatar
Jorran de Wit committed
        super().__init__(data or None)
        if self.original_recipient == '':
            self.fields['extra_recipient'].label = "Send this email to"
            self.fields['extra_recipient'].required = True

        # Set the data as initials
Jorran de Wit's avatar
Jorran de Wit committed
        self.fields['text'].initial = self.mail_template
        self.fields['subject'].initial = self.mail_data['subject']

    def save_data(self):
        # Get text and html
Jorran de Wit's avatar
Jorran de Wit committed
        self.html_message = self.cleaned_data['text']
        self.subject = self.cleaned_data['subject']
        self.validate_message()
Jorran de Wit's avatar
Jorran de Wit committed
        self.validate_bcc_list()
Jorran de Wit's avatar
Jorran de Wit committed
        # Get recipients list. Try to send through BCC to prevent privacy issues!
Jorran de Wit's avatar
Jorran de Wit committed
        if self.cleaned_data.get('extra_recipient') and self.original_recipient:
            self.bcc_list.append(self.cleaned_data.get('extra_recipient'))
        elif self.cleaned_data.get('extra_recipient') and not self.original_recipient:
            self.original_recipient = [self.cleaned_data.get('extra_recipient')]
        elif self.original_recipient == '':
            self.add_error('extra_recipient', 'Please fill the bcc field to send the mail.')
Jorran de Wit's avatar
Jorran de Wit committed

Jorran de Wit's avatar
Jorran de Wit committed
        self.validate_recipients()
        self.save_mail_data()

    def clean(self):
        data = super().clean()
        self.save_data()
        return data

    def save(self):
        self.send()
        return self.instance


class HiddenDataForm(forms.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()