--- /dev/null
+# coding: utf-8
+
+from django import template
+from django.utils.encoding import smart_unicode
+from django.utils.safestring import mark_safe
+
+from filebrowser.fb_settings import SELECT_FORMATS
+
+register = template.Library()
+
+@register.inclusion_tag('filebrowser/include/_response.html', takes_context=True)
+def query_string(context, add=None, remove=None):
+ """
+ Allows the addition and removal of query string parameters.
+
+ _response.html is just {{ response }}
+
+ Usage:
+ http://www.url.com/{% query_string "param_to_add=value, param_to_add=value" "param_to_remove, params_to_remove" %}
+ http://www.url.com/{% query_string "" "filter" %}filter={{new_filter}}
+ http://www.url.com/{% query_string "sort=value" "sort" %}
+ """
+ # Written as an inclusion tag to simplify getting the context.
+ add = string_to_dict(add)
+ remove = string_to_list(remove)
+ params = context['query'].copy()
+ response = get_query_string(params, add, remove)
+ return {'response': response }
+
+
+def query_helper(query, add=None, remove=None):
+ """
+ Helper Function for use within views.
+ """
+ add = string_to_dict(add)
+ remove = string_to_list(remove)
+ params = query.copy()
+ return get_query_string(params, add, remove)
+
+
+def get_query_string(p, new_params=None, remove=None):
+ """
+ Add and remove query parameters. From `django.contrib.admin`.
+ """
+ if new_params is None: new_params = {}
+ if remove is None: remove = []
+ for r in remove:
+ for k in p.keys():
+ if k.startswith(r):
+ del p[k]
+ for k, v in new_params.items():
+ if k in p and v is None:
+ del p[k]
+ elif v is not None:
+ p[k] = v
+ return mark_safe('?' + '&'.join([u'%s=%s' % (k, v) for k, v in p.items()]).replace(' ', '%20'))
+
+
+def string_to_dict(string):
+ """
+ Usage::
+
+ {{ url|thumbnail:"width=10,height=20" }}
+ {{ url|thumbnail:"width=10" }}
+ {{ url|thumbnail:"height=20" }}
+ """
+ kwargs = {}
+ if string:
+ string = str(string)
+ if ',' not in string:
+ # ensure at least one ','
+ string += ','
+ for arg in string.split(','):
+ arg = arg.strip()
+ if arg == '': continue
+ kw, val = arg.split('=', 1)
+ kwargs[kw] = val
+ return kwargs
+
+
+def string_to_list(string):
+ """
+ Usage::
+
+ {{ url|thumbnail:"width,height" }}
+ """
+ args = []
+ if string:
+ string = str(string)
+ if ',' not in string:
+ # ensure at least one ','
+ string += ','
+ for arg in string.split(','):
+ arg = arg.strip()
+ if arg == '': continue
+ args.append(arg)
+ return args
+
+
+class SelectableNode(template.Node):
+ def __init__(self, filetype, format):
+ self.filetype = template.Variable(filetype)
+ self.format = template.Variable(format)
+
+ def render(self, context):
+ try:
+ filetype = self.filetype.resolve(context)
+ except template.VariableDoesNotExist:
+ filetype = ''
+ try:
+ format = self.format.resolve(context)
+ except template.VariableDoesNotExist:
+ format = ''
+ if filetype and format and filetype in SELECT_FORMATS[format]:
+ selectable = True
+ elif filetype and format and filetype not in SELECT_FORMATS[format]:
+ selectable = False
+ else:
+ selectable = True
+ context['selectable'] = selectable
+ return ''
+
+
+def selectable(parser, token):
+
+ try:
+ tag, filetype, format = token.split_contents()
+ except:
+ raise TemplateSyntaxError, "%s tag requires 2 arguments" % token.contents.split()[0]
+
+ return SelectableNode(filetype, format)
+
+register.tag(selectable)