9bf056fe7b3665c75e416ce21a42e862ff5036ec
[philo.git] / templatetags / containers.py
1 from django import template
2 from django.conf import settings
3 from django.utils.safestring import SafeUnicode, mark_safe
4 from django.core.exceptions import ObjectDoesNotExist
5
6 register = template.Library()
7
8
9 class ContainerNode(template.Node):
10         def __init__(self, name, as_var=None):
11                 self.name = name
12                 self.as_var = as_var
13         def render(self, context):
14                 page = None
15                 if 'page' in context:
16                         page = context['page']
17                 if page:
18                         contentlet = None
19                         try:
20                                 contentlet = page.contentlets.get(name__exact=self.name)
21                         except ObjectDoesNotExist:
22                                 pass
23                         if contentlet:
24                                 content = contentlet.content
25                                 if contentlet.dynamic:
26                                         try:
27                                                 content = mark_safe(template.Template(content, name=contentlet.name).render(context))
28                                         except template.TemplateSyntaxError, error:
29                                                 content = ''
30                                                 if settings.DEBUG:
31                                                         content = ('[Error parsing contentlet \'%s\': %s]' % self.name, error)
32                                 if self.as_var:
33                                         context[self.as_var] = content
34                                         content = ''
35                                 return content
36                 return ''
37
38
39 def do_container(parser, token):
40         """
41         {% container <name> [as <variable>] %}
42         """
43         params = token.split_contents()
44         if len(params) >= 2: # without as_var
45                 name = params[1].strip('"')
46                 as_var = None
47                 if len(params) == 4:
48                         as_var = params[3]
49                 return ContainerNode(name, as_var)
50         else: # error
51                 raise template.TemplateSyntaxError('do_container template tag provided with invalid arguments')
52 register.tag('container', do_container)