Skip to content

Instantly share code, notes, and snippets.

@alexlovelltroy
Last active December 20, 2015 04:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexlovelltroy/6074043 to your computer and use it in GitHub Desktop.
Save alexlovelltroy/6074043 to your computer and use it in GitHub Desktop.
Class Based E-mail for django
from django.conf import settings
from django.core.mail import EmailMultiAlternatives
from django.db import models
from django.template import Template, Context ,loader
from django.contrib.sites.models import Site
def resolve_template(template):
"Accepts a template object, path-to-template or list of paths"
if isinstance(template, (list, tuple)):
return loader.select_template(template)
elif isinstance(template, basestring):
return loader.get_template(template)
else:
return template
class EmailTemplate(models.Model):
name = models.CharField(max_length=64, unique=True)
description = models.CharField(max_length=512)
subject = models.CharField(max_length=512)
text_content = models.TextField()
html_content = models.TextField(null=True, blank=True)
def __unicode__(self):
return self.name
class BaseEmail(object):
_msg = None
def __init__(self, **kwargs):
"""
Constructor. Can contain helpful extra
keyword arguments, and other things.
"""
# Go through keyword arguments, and either save their values to our
# instance, or raise an error.
for key, value in kwargs.iteritems():
setattr(self, key, value)
def get_subject(self):
return None
def get_to(self):
return None
def get_from_email(self):
return None
def get_cc(self):
return None
def get_bcc(self):
return None
def get_headers(self):
return None
def get_text_content(self):
return None
def get_html_content(self):
return None
def build_msg(self):
if self._msg is None:
self._msg = EmailMultiAlternatives(
subject = self.get_subject(),
body= self.get_text_content(),
from_email = self.get_from_email(),
to = self.get_to(),
bcc = self.get_bcc(),
cc = self.get_cc(),
headers = self.get_headers(),
)
if self.get_html_content() is not None:
self._msg.attach_alternative(self.get_html_content(), 'text/html')
return self._msg
def send(self):
msg = self.build_msg()
msg.send()
class ModelTemplateEmail(BaseEmail):
_template = None
def get_template_name(self):
return self.template_name
def get_context(self):
return self.context
def get_template(self, template_name):
if self._template is None:
self._template = EmailTemplate.objects.get(name=self.get_template_name())
return self._template
def get_subject(self):
return Template(self.get_template().subject).render(Context(self.get_context()))
def get_text_content(self):
return Template(self.get_template().text_content).render(Context(self.get_context()))
def get_html_content(self):
return Template(self.get_template().text_content).render(Context(self.get_context()))
class FileTemplateEmailMixin(BaseEmail):
def get_template_name(self):
return self.template_name
def get_context(self):
return self.context
def get_subject(self):
template_name = "%s_subject.txt" % self.template_name
template = resolve_template(template_name)
template.render(self.get_context())
def get_text_content(self):
template_name = "%s_body.txt" % self.template_name
template = resolve_template(template_name)
template.render(self.get_context())
def get_html_content(self):
template_name = "%s_body.html" % self.template_name
template = resolve_template(template_name)
template.render(self.get_context())
class SiteContextMixin(object):
def get_context(self):
context = super(SiteContextMixin, self).get_context()
context.update(dict(site = Site.objects.get_current()))
return context
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment