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