style
[redakcja.git] / apps / catalogue / templatetags / set_get_parameter.py
1 # -*- coding: utf-8 -*-
2 from re import split
3
4 from django import template
5
6 register = template.Library()
7
8
9 """
10 In template:
11     {% set_get_paramater param1='const_value',param2=,param3=variable %}
12 results with changes to query string:
13     param1 is set to `const_value' string
14     param2 is unset, if exists,
15     param3 is set to the value of variable in context
16
17 Using 'django.core.context_processors.request' is required.
18
19 """
20
21
22 class SetGetParameter(template.Node):
23     def __init__(self, values):
24         self.values = values
25
26     def render(self, context):
27         request = template.Variable('request').resolve(context)
28         params = request.GET.copy()
29         for key, value in self.values.items():
30             if value == '':
31                 if key in params:
32                     del(params[key])
33             else:
34                 params[key] = template.Variable(value).resolve(context)
35         return '?%s' % params.urlencode()
36
37
38 @register.tag
39 def set_get_parameter(parser, token):
40     parts = split(r'\s+', token.contents, 2)
41
42     values = {}
43     for pair in parts[1].split(','):
44         s = pair.split('=')
45         values[s[0]] = s[1]
46
47     return SetGetParameter(values)