f1e968d0a48ff1266d2a585f061dd109a964bff7
[redakcja.git] / apps / filebrowser / templatetags / fb_tags.py
1 # coding: utf-8
2
3 from django import template
4 from django.utils.encoding import smart_unicode
5 from django.utils.safestring import mark_safe
6
7 from filebrowser.fb_settings import SELECT_FORMATS
8
9 register = template.Library()
10
11 @register.inclusion_tag('filebrowser/include/_response.html', takes_context=True)
12 def query_string(context, add=None, remove=None):
13     """
14     Allows the addition and removal of query string parameters.
15     
16     _response.html is just {{ response }}
17     
18     Usage:
19     http://www.url.com/{% query_string "param_to_add=value, param_to_add=value" "param_to_remove, params_to_remove" %}
20     http://www.url.com/{% query_string "" "filter" %}filter={{new_filter}}
21     http://www.url.com/{% query_string "sort=value" "sort" %}
22     """
23     # Written as an inclusion tag to simplify getting the context.
24     add = string_to_dict(add)
25     remove = string_to_list(remove)
26     params = context['query'].copy()
27     response = get_query_string(params, add, remove)
28     return {'response': response }
29     
30
31 def query_helper(query, add=None, remove=None):
32     """
33     Helper Function for use within views.
34     """
35     add = string_to_dict(add)
36     remove = string_to_list(remove)
37     params = query.copy()
38     return get_query_string(params, add, remove)
39     
40
41 def get_query_string(p, new_params=None, remove=None):
42     """
43     Add and remove query parameters. From `django.contrib.admin`.
44     """
45     if new_params is None: new_params = {}
46     if remove is None: remove = []
47     for r in remove:
48         for k in p.keys():
49             if k.startswith(r):
50                 del p[k]
51     for k, v in new_params.items():
52         if k in p and v is None:
53             del p[k]
54         elif v is not None:
55             p[k] = v
56     return mark_safe('?' + '&'.join([u'%s=%s' % (k, v) for k, v in p.items()]).replace(' ', '%20'))
57     
58
59 def string_to_dict(string):
60     """
61     Usage::
62     
63         {{ url|thumbnail:"width=10,height=20" }}
64         {{ url|thumbnail:"width=10" }}
65         {{ url|thumbnail:"height=20" }}
66     """
67     kwargs = {}
68     if string:
69         string = str(string)
70         if ',' not in string:
71             # ensure at least one ','
72             string += ','
73         for arg in string.split(','):
74             arg = arg.strip()
75             if arg == '': continue
76             kw, val = arg.split('=', 1)
77             kwargs[kw] = val
78     return kwargs
79     
80
81 def string_to_list(string):
82     """
83     Usage::
84     
85         {{ url|thumbnail:"width,height" }}
86     """
87     args = []
88     if string:
89         string = str(string)
90         if ',' not in string:
91             # ensure at least one ','
92             string += ','
93         for arg in string.split(','):
94             arg = arg.strip()
95             if arg == '': continue
96             args.append(arg)
97     return args
98     
99
100 class SelectableNode(template.Node):
101     def __init__(self, filetype, format):
102         self.filetype = template.Variable(filetype)
103         self.format = template.Variable(format)
104     
105     def render(self, context):
106         try:
107             filetype = self.filetype.resolve(context)
108         except template.VariableDoesNotExist:
109             filetype = ''
110         try:
111             format = self.format.resolve(context)
112         except template.VariableDoesNotExist:
113             format = ''
114         if filetype and format and filetype in SELECT_FORMATS[format]:
115             selectable = True
116         elif filetype and format and filetype not in SELECT_FORMATS[format]:
117             selectable = False
118         else:
119             selectable = True
120         context['selectable'] = selectable
121         return ''
122     
123
124 def selectable(parser, token):
125     
126     try:
127         tag, filetype, format = token.split_contents()
128     except:
129         raise TemplateSyntaxError, "%s tag requires 2 arguments" % token.contents.split()[0]
130         
131     return SelectableNode(filetype, format)
132     
133 register.tag(selectable)