Dodanie aplikacji sorl.thumbnail i filebrowser.
[redakcja.git] / 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 (file)
index 0000000..f1e968d
--- /dev/null
@@ -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)