comfy/wagtail_store/dynamic_forms/models.py

131 wiersze
4.0 KiB
Python
Czysty Zwykły widok Historia

2023-10-03 20:04:14 +00:00
import datetime
from django.db import models
2023-10-09 19:52:06 +00:00
from django.conf import settings
from django.utils.formats import date_format
2023-10-03 20:04:14 +00:00
from modelcluster.fields import ParentalKey
from wagtail.admin.panels import (
FieldPanel, FieldRowPanel,
InlinePanel, MultiFieldPanel
)
from wagtail.fields import RichTextField
from wagtail.contrib.forms.models import (
2023-10-09 19:52:06 +00:00
AbstractFormField,
2023-10-10 20:28:02 +00:00
FormMixin,
2023-10-09 19:52:06 +00:00
Page,
AbstractFormSubmission
2023-10-03 20:04:14 +00:00
)
from mailings.models import (
OutgoingEmail,
Attachment
)
from dynamic_forms.forms import DynamicForm
2023-10-03 20:04:14 +00:00
class Form(FormMixin, Page):
2023-10-03 20:04:14 +00:00
intro = RichTextField(blank=True)
thank_you_text = RichTextField(blank=True)
2023-10-10 20:28:02 +00:00
allow_attachments = models.BooleanField(default=False)
2023-10-09 19:52:06 +00:00
content_panels = Page.content_panels + [
2023-10-03 20:04:14 +00:00
FieldPanel('intro'),
InlinePanel('form_fields', label="Form fields"),
FieldPanel('thank_you_text'),
MultiFieldPanel([
FieldRowPanel([
FieldPanel('from_address', classname="col6"),
FieldPanel('to_address', classname="col6"),
]),
FieldPanel('subject'),
], "Email"),
2023-10-13 18:58:49 +00:00
FieldPanel("allow_attachments")
2023-10-03 20:04:14 +00:00
]
def get_form_class(self):
return DynamicForm
def get_form(self, *args, **kwargs):
form_class = self.get_form_class()
form_params = self.get_form_parameters()
form_params.update(kwargs)
2023-10-13 18:58:49 +00:00
form_params["field_list"] = self.get_form_fields()
form_params["file_uploads"] = self.allow_attachments
return form_class(*args, **form_params)
2023-10-03 20:04:14 +00:00
class Meta:
abstract = True
2023-10-09 19:52:06 +00:00
class EmailFormSubmission(AbstractFormSubmission):
2023-11-05 19:03:03 +00:00
# TODO - make this optional, allow to set pattern in admin
def get_submission_id(self, form_slug):
case_number_daily = EmailFormSubmission.objects.filter(submit_time__date=datetime.date.today()).count()
return f"{form_slug}-{datetime.date.today()}-{case_number_daily}"
2023-10-09 19:52:06 +00:00
def send_mail(self, data):
# modify this, get proper template
2023-10-13 18:58:49 +00:00
to_addresses = data.pop("to_address").split(",")
attachments = [
Attachment(
file.name, file.file.read(), file.content_type
)
for file in data.pop("attachments", [])
]
subject = data.pop("subject")
form_slug = data.pop("form_slug")
2023-10-13 18:58:49 +00:00
from_address = data.pop("from_address", settings.DEFAULT_FROM_EMAIL)
for address in to_addresses:
OutgoingEmail.objects.send(
subject=subject,
template_name="form_mail",
recipient=address,
sender=from_address,
context={"form_data": data, "submission_id": self.get_submission_id(form_slug)},
attachments=attachments
)
2023-10-09 19:52:06 +00:00
2023-10-10 20:28:02 +00:00
class CustomEmailForm(Form):
2023-10-09 19:52:06 +00:00
from_address = models.EmailField(
blank=True,
help_text="Sender email address"
)
to_address = models.CharField(
max_length=255,
help_text="Comma separated list of recipients"
)
subject = models.CharField(
max_length=255,
help_text="Subject of the email with data"
)
2023-10-10 20:28:02 +00:00
template = "forms/email_form_page.html"
2023-10-09 19:52:06 +00:00
2023-10-13 18:58:49 +00:00
def get_submission_class(self):
return EmailFormSubmission
def process_form_submission(self, form):
attachments = form.cleaned_data.pop("attachments", [])
2023-10-13 18:58:49 +00:00
submission = self.get_submission_class().objects.create(
form_data=form.cleaned_data,
page=self,
)
mail_data = form.cleaned_data.copy()
mail_data.update({
"from_address": self.from_address,
"to_address": self.to_address,
"subject": self.subject,
"attachments": attachments,
"form_slug": self.slug
2023-10-13 18:58:49 +00:00
})
submission.send_mail(data=mail_data)
return submission
2023-10-09 19:52:06 +00:00
class EmailFormField(AbstractFormField):
2023-10-10 20:28:02 +00:00
form = ParentalKey(
"CustomEmailForm", related_name="form_fields", on_delete=models.CASCADE
2023-10-09 19:52:06 +00:00
)