/blogmaker/util/templatetags/prefab_tags.py

http://blogmaker.googlecode.com/ · Python · 81 lines · 46 code · 15 blank · 20 comment · 3 complexity · 7c50228e9449ddbfc472adf29d5c228e MD5 · raw file

  1. ''' @copyright:Copyright (c) 2006-2007, PreFab Software Inc. '''
  2. from django import template
  3. from django.conf import settings
  4. from blogmaker.util import expand_shortcuts
  5. register = template.Library()
  6. register.filter('expand_shortcuts', template.defaultfilters.stringfilter(expand_shortcuts))
  7. @register.simple_tag
  8. def setting(name):
  9. return getattr(settings, name)
  10. @register.tag
  11. def getsetting(parser, token):
  12. ''' Access a setting and assign a variable in the template
  13. Usage: {% getsetting setting as var %}
  14. '''
  15. args = token.split_contents()
  16. if len(args) != 4:
  17. raise template.TemplateSyntaxError, "%r tag requires two or four arguments" % args[0]
  18. return GetSettingNode(args[1], args[3])
  19. class GetSettingNode(template.Node):
  20. def __init__(self, setting, var):
  21. self.setting = setting
  22. self.var = var
  23. def render(self, context):
  24. value = getattr(settings, self.setting)
  25. context[self.var] = value
  26. return ''
  27. @register.tag('with')
  28. def do_with(parser, token):
  29. """
  30. Add a value to the context (inside of this block) for easy access.
  31. Example::
  32. {% with person.addresses.all as addresses %}
  33. {% if addresses %}
  34. <h3>Addresses</h3>
  35. {% for address in addresses %}
  36. ...
  37. {% endfor %}
  38. {% endif %}
  39. {% endwith %}
  40. From http://www.djangosnippets.org/snippets/132/
  41. """
  42. bits = list(token.split_contents())
  43. if len(bits) != 4 or bits[2] != "as":
  44. raise template.TemplateSyntaxError, "%r expected format is 'value as name'" % token.contents[0]
  45. var = parser.compile_filter(bits[1])
  46. name = bits[3]
  47. nodelist = parser.parse(('endwith',))
  48. parser.delete_first_token()
  49. return WithNode(var, name, nodelist)
  50. class WithNode(template.Node):
  51. def __init__(self, var, name, nodelist):
  52. self.var = var
  53. self.name = name
  54. self.nodelist = nodelist
  55. def __repr__(self):
  56. return "<WithNode>"
  57. def render(self, context):
  58. val = self.var.resolve(context)
  59. context.push()
  60. context[self.name] = val
  61. output = self.nodelist.render(context)
  62. context.pop()
  63. return output