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 ", to=to, reply_to=["Claremont MakerSpace "], ) 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), ]