X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/04b05946ab640eaf9135a73772b704dd41c323e7..717c14c014e3c988bcb392599a47ffa92630da78:/apps/filebrowser/templatetags/fb_tags.py diff --git a/apps/filebrowser/templatetags/fb_tags.py b/apps/filebrowser/templatetags/fb_tags.py new file mode 100644 index 00000000..f1e968d0 --- /dev/null +++ b/apps/filebrowser/templatetags/fb_tags.py @@ -0,0 +1,133 @@ +# 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)