]> git.openstreetmap.org Git - osqa.git/blob - forum/templatetags/email_tags.py
b28983755d5df8e235938202bf38e8085ee426db
[osqa.git] / forum / templatetags / email_tags.py
1 from django import template
2 from forum import settings
3 from forum.utils.mail import create_and_send_mail_messages
4
5 register = template.Library()
6
7 class MultiUserMailMessage(template.Node):
8     def __init__(self, nodelist):
9         self.nodelist = nodelist
10
11     def render(self, context):
12         recipients = context['recipients']
13         messages = list()
14
15         for recipient in recipients:
16             context['embeddedmedia'] = {}
17             context['recipient'] = recipient
18             self.nodelist.render(context)
19             messages.append((recipient, context['subject'], context['htmlcontent'], context['textcontent'], context['embeddedmedia']))
20
21         create_and_send_mail_messages(messages)
22
23 @register.tag
24 def email(parser, token):
25     nodelist = parser.parse(('endemail',))
26     parser.delete_first_token()
27     return MultiUserMailMessage(nodelist)
28
29
30
31 class EmailPartNode(template.Node):
32     def __init__(self, nodelist, varname):
33         self.nodelist = nodelist
34         self.varname = varname
35
36     def render(self, context):
37         context[self.varname] = self.nodelist.render(context).strip()
38
39 @register.tag
40 def subject(parser, token):
41     nodelist = parser.parse(('endsubject',))
42     parser.delete_first_token()
43     return EmailPartNode(nodelist, 'subject')
44
45 def content(parser, token):
46     try:
47         tag_name, base = token.split_contents()
48     except ValueError:
49         try:
50             tag_name = token.split_contents()[0]
51             base = None
52         except:
53             raise template.TemplateSyntaxError, "%r tag requires at least two arguments" % token.contents.split()[0]
54
55     nodelist = parser.parse(('end%s' % tag_name,))
56
57     if base:
58         base = template.loader.get_template(base)
59
60         basenodes = base.nodelist
61         content = [i for i,n in enumerate(basenodes) if isinstance(n, template.loader_tags.BlockNode) and n.name == "content"]
62         if len(content):
63             index = content[0]
64             nodelist = template.NodeList(basenodes[0:index] + nodelist + basenodes[index:])
65         
66
67     parser.delete_first_token()
68     return EmailPartNode(nodelist, tag_name)
69
70
71 register.tag('htmlcontent', content)
72 register.tag('textcontent', content)
73
74
75 class EmbedMediaNode(template.Node):
76     def __init__(self, location, alias):
77         self.location = template.Variable(location)
78         self.alias = alias
79
80     def render(self, context):
81         context['embeddedmedia'][self.alias] = self.location.resolve(context)
82         pass
83
84
85 @register.tag
86 def embedmedia(parser, token):
87     try:
88         tag_name, location, _, alias = token.split_contents()
89     except ValueError:
90         raise template.TemplateSyntaxError, "%r tag requires exactly four arguments" % token.contents.split()[0]
91
92     return EmbedMediaNode(location, alias)
93
94
95
96
97
98     
99     
100
101