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