]> git.openstreetmap.org Git - osqa.git/blob - forum/templatetags/ui_registry.py
21ba3bbdc0436ff2b2300df20e39252ec67ff62d
[osqa.git] / forum / templatetags / ui_registry.py
1 from django import template
2 from forum.modules import ui
3 import logging
4
5 register = template.Library()
6
7
8 class LoadRegistryNode(template.Node):
9     def __init__(self, registry, separator):
10         self.registry = registry
11         self.separator = separator
12
13     def render(self, context):
14         separator = self.separator.render(context)
15         result = ''
16
17         for ui_object in self.registry:
18             try:
19                 if ui_object.can_render(context):
20                         if result:
21                             result += separator
22                         result += ui_object.render(context)
23             except (KeyError, Exception), e:
24                 import traceback
25                 logging.error("Exception %s rendering ui objects %s: \n%s" % (
26                     e, ui_object, traceback.format_exc()
27                 ))
28
29         return result
30
31
32 @register.tag
33 def loadregistry(parser, token):
34     try:
35         tag_name, registry = token.split_contents()
36     except ValueError:
37         raise template.TemplateSyntaxError, "%r tag requires exactly one argument" % token.contents.split()[0]
38
39     registry = ui.get_registry_by_name(registry)
40     separator = parser.parse(('endloadregistry',))
41     parser.delete_first_token()
42     return LoadRegistryNode(registry, separator)
43
44
45 class LoopRegistryNode(template.Node):
46     def __init__(self, registry, nodelist):
47         self.registry = registry
48         self.nodelist = nodelist
49
50     def render(self, context):
51         result = ''
52
53         for ui_object in self.registry:
54             if ui_object.can_render(context):
55                 try:
56                     ui_object.update_context(context)
57                     result += self.nodelist.render(context)
58                 except Exception, e:
59                     import traceback
60                     logging.error("Exception %s updating ui loop context %s: \n%s" % (
61                         e, ui_object, traceback.format_exc()
62                     ))
63
64
65         return result
66
67 @register.tag
68 def loopregistry(parser, token):
69     try:
70         tag_name, registry = token.split_contents()
71     except ValueError:
72         raise template.TemplateSyntaxError, "%r tag requires exactly one argument" % token.contents.split()[0]
73
74     registry = ui.get_registry_by_name(registry)
75     nodelist = parser.parse(('endloopregistry',))
76     parser.delete_first_token()
77
78     return LoopRegistryNode(registry, nodelist)