Guest User

Emails from file-based templates

a guest
Dec 24th, 2013
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.59 KB | None | 0 0
  1. from textwrap import fill, dedent
  2.  
  3. from django.template import Context
  4. from django.template.loader import get_template
  5. from django.template.loader_tags import BlockNode, ExtendsNode
  6. from post_office.mail import send
  7.  
  8.  
  9. def send_mail_from_file(recipients, name, context={}, **kwargs):
  10.     subject, message, html_message = render_email(name, context)
  11.     return send(recipients=recipients, subject=subject, html_message=html_message,
  12.                 message=message, template=None, context=None, **kwargs)
  13.  
  14.  
  15. # https://github.com/BradWhittington/django-templated-email/blob/master/templated_email/backends/vanilla_django.py
  16. def render_email(template_name, context={}, template_dir='mails/'):
  17.     context = Context(context, autoescape=False)
  18.     full_template_name = '%s%s.email' % (template_dir, template_name)
  19.     template = get_template(full_template_name)
  20.  
  21.     subject = render_template_block(template, 'subject', context).strip()
  22.     plain = render_template_block(template, 'plain', context).strip()
  23.     html = render_template_block(template, 'html', context).strip()
  24.  
  25.     # strip leading whitespace
  26.     plain = dedent(plain)
  27.     # wrap lines individually
  28.     new_plain = '\n'.join([fill(line) for line in plain.splitlines()])
  29.  
  30.     return subject, new_plain, html
  31.  
  32.  
  33. # https://github.com/uniphil/Django-Block-Render/blob/master/block_render.py
  34. class BlockNotFound(Exception):
  35.     """The requested block did not exist."""
  36.     pass
  37.  
  38.  
  39. def render_template_block(template, block, context):
  40.     """
  41.    Renders a single block from a template.
  42.    This template should have previously been rendered.
  43.  
  44.    """
  45.     template._render(context)
  46.     return _render_template_block_nodelist(template.nodelist, block, context)
  47.  
  48.  
  49. def _render_template_block_nodelist(nodelist, block, context):
  50.     for node in nodelist:
  51.         if isinstance(node, BlockNode) and node.name == block:
  52.             return node.render(context)
  53.         for key in ('nodelist', 'nodelist_true', 'nodelist_false'):
  54.             if hasattr(node, key):
  55.                 try:
  56.                     rendered = _render_template_block_nodelist(
  57.                         getattr(node, key), block, context)
  58.                 except:
  59.                     pass
  60.                 else:
  61.                     return rendered
  62.     for node in nodelist:
  63.         if isinstance(node, ExtendsNode):
  64.             try:
  65.                 rendered = render_template_block(
  66.                     node.get_parent(context), block, context)
  67.             except BlockNotFound:
  68.                 pass
  69.             else:
  70.                 return rendered
  71.     raise BlockNotFound
Advertisement
Add Comment
Please, Sign In to add comment