68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
from django.conf import settings
|
|
from django.core.mail import EmailMessage, EmailMultiAlternatives
|
|
from django.template import loader
|
|
|
|
import mdformat
|
|
from markdownify import markdownify
|
|
|
|
from membershipworks.models import EventInvoice
|
|
|
|
|
|
def make_multipart_email(
|
|
subject: str, html_body: str, to: tuple[str]
|
|
) -> EmailMultiAlternatives:
|
|
plain_body = mdformat.text(markdownify(html_body), extensions={"tables"})
|
|
|
|
email = EmailMultiAlternatives(
|
|
subject,
|
|
plain_body,
|
|
from_email="CMS Invoices <invoices@claremontmakerspace.org>",
|
|
to=to,
|
|
reply_to=["Claremont MakerSpace <Info@ClaremontMakerSpace.org>"],
|
|
)
|
|
|
|
email.attach_alternative(html_body, "text/html")
|
|
return email
|
|
|
|
|
|
def make_instructor_email(
|
|
invoice: EventInvoice, pdf: bytes, event_url: str
|
|
) -> EmailMessage:
|
|
if invoice.event.instructor is None or invoice.event.instructor.member is None:
|
|
raise ValueError("Event Instructor not defined or is not member")
|
|
template = loader.get_template(
|
|
"membershipworks/email/event_invoice_instructor.dj.html"
|
|
)
|
|
html_body = template.render({"invoice": invoice, "event_url": event_url})
|
|
|
|
message = make_multipart_email(
|
|
f'Your CMS instructor invoice has been received for event "{invoice.event}" {invoice.event.start} - {invoice.event.end}',
|
|
html_body,
|
|
(invoice.event.instructor.member.sanitized_mailbox(),),
|
|
)
|
|
message.attach(f"CMS_event_invoice_{invoice.uuid}.pdf", pdf, "application/pdf")
|
|
return message
|
|
|
|
|
|
def make_admin_email(invoice: EventInvoice, pdf: bytes, event_url: str) -> EmailMessage:
|
|
template = loader.get_template("membershipworks/email/event_invoice_admin.dj.html")
|
|
html_body = template.render({"invoice": invoice, "event_url": event_url})
|
|
|
|
message = make_multipart_email(
|
|
f'CMS instructor invoice created for event "{invoice.event}" {invoice.event.start} - {invoice.event.end}',
|
|
html_body,
|
|
# TODO: should this be in database instead?
|
|
settings.INVOICE_HANDLERS,
|
|
)
|
|
message.attach(f"CMS_event_invoice_{invoice.uuid}.pdf", pdf, "application/pdf")
|
|
return message
|
|
|
|
|
|
def make_invoice_emails(
|
|
invoice: EventInvoice, pdf: bytes, event_url: str
|
|
) -> list[EmailMessage]:
|
|
return [
|
|
make_instructor_email(invoice, pdf, event_url),
|
|
make_admin_email(invoice, pdf, event_url),
|
|
]
|