Improve on mail view
This commit is contained in:
parent
20499f81ae
commit
c291147a7c
2 changed files with 49 additions and 7 deletions
|
@ -1 +0,0 @@
|
||||||
from django.core.mail import send_mail
|
|
|
@ -1,11 +1,54 @@
|
||||||
from django.views.generic.base import ContextMixin
|
from django.views.generic.base import ContextMixin
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
|
from django.template.exceptions import TemplateDoesNotExist
|
||||||
|
from django.core.mail import EmailMultiAlternatives
|
||||||
|
|
||||||
|
from html.parser import HTMLParser
|
||||||
|
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
class MailView(ContextMixin):
|
class MailView(ContextMixin):
|
||||||
def render_html(**kwargs):
|
def __init__(self, template_name=None, html_template_name=None, text_template_name=None):
|
||||||
context = self.get_context_data(**kwargs)
|
self.html_template_name = html_template_name
|
||||||
return render_to_string(self.html_template_name, context)
|
self.text_template_name = text_template_name
|
||||||
|
|
||||||
def render_text(**kwargs):
|
if self._template_name := template_name:
|
||||||
context = self.get_context_data(**kwargs)
|
if len(template_name.split("/")[-1].split(".")[-1] in ("html", "txt")):
|
||||||
return render_to_string(self.text_template_name, context)
|
basename = template_name.rsplit(".", 1)[0]
|
||||||
|
else:
|
||||||
|
basename = template_name
|
||||||
|
|
||||||
|
for ext in ("html", "txt"):
|
||||||
|
try:
|
||||||
|
path = f"{basename}.{ext}"
|
||||||
|
render_to_string(path)
|
||||||
|
if ext == "html":
|
||||||
|
self.html_template_name = self.html_template_name or path
|
||||||
|
else:
|
||||||
|
self.text_template_name = self.text_template_name or path
|
||||||
|
except TemplateDoesNotExist:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def render_to_html(self, **kwargs):
|
||||||
|
if self.html_template_name:
|
||||||
|
context = self.get_context_data(**kwargs)
|
||||||
|
return render_to_string(self.html_template_name, context)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def render_to_text(self, from_html=False, **kwargs):
|
||||||
|
if self.text_template_name:
|
||||||
|
context = self.get_context_data(**kwargs)
|
||||||
|
return render_to_string(self.text_template_name, context)
|
||||||
|
else:
|
||||||
|
if from_html and html := self.render_to_html(**kwargs):
|
||||||
|
return BeautifulSoup(html).get_text()
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def send(self, subject, recipient, context={}, attachments=[], sender=None, cc=[], bcc=[], text_from_html=False):
|
||||||
|
text = self.render_to_text(text_from_html, **context)
|
||||||
|
email = EmailMultiAlternatives(subject, text, sender, [recipient], cc=cc, bcc=bcc, attachments=attachments)
|
||||||
|
if html := self.render_to_html(**context):
|
||||||
|
email.attach_alternative(html, "text/html")
|
||||||
|
email.send()
|
Loading…
Reference in a new issue