Commit 449a023b74f33a0efc972898715a8249e9ecb602

Authored by Luan
1 parent 0f152d6a

Refactoring append_to_get templatetag

src/super_archives/templates/message-list.html
@@ -13,9 +13,9 @@ @@ -13,9 +13,9 @@
13 <h4>{% trans "Sort by" %}</h4> 13 <h4>{% trans "Sort by" %}</h4>
14 <ul class="unstyled-list"> 14 <ul class="unstyled-list">
15 <li {% ifequal order_by "hottest" %} title="{% trans "Remove filter" %}" {% endifequal %}> 15 <li {% ifequal order_by "hottest" %} title="{% trans "Remove filter" %}" {% endifequal %}>
16 - <span class="glyphicon glyphicon-chevron-right"></span> <a href="{% ifequal order_by "hottest" %} {% append_to_get order="",p=1 %} {% else %} {% append_to_get order='hottest',p=1 %} {% endifequal %}">{% trans "Relevance" %}</a></li> 16 + <span class="glyphicon glyphicon-chevron-right"></span> <a href="{% ifequal order_by "hottest" %} {% append_to_get order="" p=1 %} {% else %} {% append_to_get order='hottest' p=1 %} {% endifequal %}">{% trans "Relevance" %}</a></li>
17 <li {% ifequal order_by "latest" %} title="{% trans "Remove filter" %}" {% endifequal %}> 17 <li {% ifequal order_by "latest" %} title="{% trans "Remove filter" %}" {% endifequal %}>
18 - <span class="glyphicon glyphicon-chevron-right"></span> <a href="{% ifequal order_by "latest" %} {% append_to_get order="",p=1 %} {% else %} {% append_to_get order='latest',p=1 %} {% endifequal %}"> 18 + <span class="glyphicon glyphicon-chevron-right"></span> <a href="{% ifequal order_by "latest" %} {% append_to_get order="" p=1 %} {% else %} {% append_to_get order='latest' p=1 %} {% endifequal %}">
19 {% trans "Recent activity" %}</a></li> 19 {% trans "Recent activity" %}</a></li>
20 </ul> 20 </ul>
21 21
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 <ul class="unstyled-list"> 23 <ul class="unstyled-list">
24 {% for list in lists %} 24 {% for list in lists %}
25 <li {% if list.name == selected_list %} title="{% trans "Remove filter" %}" class="selected" {% endif %}> 25 <li {% if list.name == selected_list %} title="{% trans "Remove filter" %}" class="selected" {% endif %}>
26 - <span class="glyphicon {% if list.name == selected_list %}glyphicon-remove{% else %}glyphicon-chevron-right{% endif %}"></span> <a href="{% ifnotequal list.name selected_list %} {% append_to_get list=list.name,p=1 %} {% else %} {% append_to_get list="",p=1 %} 26 + <span class="glyphicon {% if list.name == selected_list %}glyphicon-remove{% else %}glyphicon-chevron-right{% endif %}"></span> <a href="{% ifnotequal list.name selected_list %} {% append_to_get list=list.name p=1 %} {% else %} {% append_to_get list="" p=1 %}
27 {% endifnotequal %}">{{ list.name }}</a></li> 27 {% endifnotequal %}">{{ list.name }}</a></li>
28 {% endfor %} 28 {% endfor %}
29 </ul> 29 </ul>
src/super_archives/templatetags/append_to_get.py
  1 +# -*- coding: utf-8 -*-
1 2
2 import urllib 3 import urllib
3 from django import template 4 from django import template
4 5
5 register = template.Library() 6 register = template.Library()
6 7
7 -"""  
8 -Decorator to facilitate template tag creation  
9 -"""  
10 -def easy_tag(func):  
11 - """deal with the repetitive parts of parsing template tags"""  
12 - def inner(parser, token):  
13 - #print token  
14 - try:  
15 - return func(*token.split_contents())  
16 - except TypeError:  
17 - raise template.TemplateSyntaxError('Bad arguments for tag "%s"' %  
18 - token.split_contents()[0])  
19 - inner.__name__ = func.__name__  
20 - inner.__doc__ = inner.__doc__  
21 - return inner  
22 -  
23 -  
24 -class AppendGetNode(template.Node):  
25 - def __init__(self, dict):  
26 - self.dict_pairs = {}  
27 - for pair in dict.split(','):  
28 - pair = pair.split('=')  
29 - self.dict_pairs[pair[0]] = template.Variable(pair[1])  
30 -  
31 - def render(self, context):  
32 - get = context['request'].GET.copy()  
33 -  
34 - for key in self.dict_pairs:  
35 - get[key] = self.dict_pairs[key].resolve(context)  
36 -  
37 - path = context['request'].META['PATH_INFO']  
38 -  
39 - if len(get):  
40 - # Convert all unicode objects in the get dict to  
41 - # str (utf-8 encoded)  
42 - get_utf_encoded = {}  
43 - for (key, value) in get.items():  
44 - if isinstance(value, unicode):  
45 - value = value.encode('utf-8')  
46 - get_utf_encoded.update({key: value})  
47 - get_utf_encoded = dict(get_utf_encoded)  
48 -  
49 - path = '?' + urllib.urlencode(get_utf_encoded)  
50 -  
51 - return path  
52 -  
53 -@register.tag()  
54 -@easy_tag  
55 -def append_to_get(_tag_name, dict):  
56 - return AppendGetNode(dict) 8 +
  9 +@register.simple_tag(takes_context=True)
  10 +def append_to_get(context, **kwargs):
  11 + # Getting the path with the query
  12 + current_url = u'{}?{}'.format(
  13 + context['request'].META['PATH_INFO'],
  14 + context['request'].META['QUERY_STRING'],
  15 + )
  16 +
  17 + if kwargs and context['request'].META['QUERY_STRING']:
  18 + current_url += '&'
  19 +
  20 + for key, value in kwargs.items():
  21 + # get the key, value to check if the pair exists in the query
  22 + new = u'{}={}'.format(key, value)
  23 +
  24 + if new in current_url:
  25 + continue
  26 +
  27 + if key not in current_url:
  28 + current_url += u'{}={}&'.format(key, value)
  29 + continue
  30 +
  31 + parse_url = current_url.split(key)
  32 +
  33 + if len(parse_url) > 2:
  34 + continue
  35 +
  36 + if unicode(value) in parse_url[1][1:]:
  37 + continue
  38 +
  39 + check_kwargs_values = [
  40 + False for value in kwargs.values()
  41 + if unicode(value) not in parse_url[1]
  42 + ]
  43 +
  44 + if not all(check_kwargs_values):
  45 + list_remaining = parse_url[1][1:].split('&')
  46 + real_remaining = u''
  47 +
  48 + if len(list_remaining) >= 2:
  49 + real_remaining = u'&'.join(list_remaining[1:])
  50 +
  51 + current_url = u'{url}{key}={value}&{remaining}'.format(
  52 + url=parse_url[0],
  53 + key=key,
  54 + value=value,
  55 + remaining=real_remaining,
  56 + )
  57 + continue
  58 +
  59 + current_url = u'{url}{key}={value}+{remaining_get}'.format(
  60 + url=parse_url[0],
  61 + key=key,
  62 + value=value,
  63 + remaining_get=parse_url[1][1:],
  64 + )
  65 + if current_url[-1] == '&':
  66 + return current_url[:-1]
  67 + return current_url