1 from django import template
2 from forum import settings
3 from forum.utils.mail import create_and_send_mail_messages
4 from django.template.defaulttags import url as default_url
6 register = template.Library()
8 class MultiUserMailMessage(template.Node):
9 def __init__(self, nodelist):
10 self.nodelist = nodelist
12 def render(self, context):
13 recipients = context['recipients']
16 for recipient in recipients:
17 context['embeddedmedia'] = {}
18 context['recipient'] = recipient
19 self.nodelist.render(context)
20 messages.append((recipient, context['subject'], context['htmlcontent'], context['textcontent'], context['embeddedmedia']))
22 create_and_send_mail_messages(messages)
25 def email(parser, token):
26 nodelist = parser.parse(('endemail',))
27 parser.delete_first_token()
28 return MultiUserMailMessage(nodelist)
32 class EmailPartNode(template.Node):
33 def __init__(self, nodelist, varname):
34 self.nodelist = nodelist
35 self.varname = varname
37 def render(self, context):
38 context[self.varname] = self.nodelist.render(context).strip()
41 def subject(parser, token):
42 nodelist = parser.parse(('endsubject',))
43 parser.delete_first_token()
44 return EmailPartNode(nodelist, 'subject')
46 def content(parser, token):
48 tag_name, base = token.split_contents()
51 tag_name = token.split_contents()[0]
54 raise template.TemplateSyntaxError, "%r tag requires at least two arguments" % token.contents.split()[0]
56 nodelist = parser.parse(('end%s' % tag_name,))
59 base = template.loader.get_template(base)
61 basenodes = base.nodelist
62 content = [i for i,n in enumerate(basenodes) if isinstance(n, template.loader_tags.BlockNode) and n.name == "content"]
65 nodelist = template.NodeList(basenodes[0:index] + nodelist + basenodes[index:])
68 parser.delete_first_token()
69 return EmailPartNode(nodelist, tag_name)
72 register.tag('htmlcontent', content)
73 register.tag('textcontent', content)
76 class EmbedMediaNode(template.Node):
77 def __init__(self, location, alias):
78 self.location = template.Variable(location)
81 def render(self, context):
82 context['embeddedmedia'][self.alias] = self.location.resolve(context)
87 def embedmedia(parser, token):
89 tag_name, location, _, alias = token.split_contents()
91 raise template.TemplateSyntaxError, "%r tag requires exactly four arguments" % token.contents.split()[0]
93 return EmbedMediaNode(location, alias)
96 class FullUrlNode(template.Node):
97 def __init__(self, default_node):
98 self.default_node = default_node
100 def render(self, context):
101 domain = settings.APP_BASE_URL
102 path = self.default_node.render(context)
103 return "%s%s" % (domain, path)
105 @register.tag(name='fullurl')
106 def fullurl(parser, token):
107 default_node = default_url(parser, token)
108 return FullUrlNode(default_node)