Commit 79e8a63d63d15645d05b01a6bf7f2bbec5a9a7a1
1 parent
5350572c
Exists in
master
and in
39 other branches
Adding ordering possibility to search
Showing
8 changed files
with
108 additions
and
25 deletions
Show diff stats
src/colab/custom_settings.py
@@ -15,6 +15,24 @@ LANGUAGES = ( | @@ -15,6 +15,24 @@ LANGUAGES = ( | ||
15 | 15 | ||
16 | LANGUAGE_CODE = 'pt-br' | 16 | LANGUAGE_CODE = 'pt-br' |
17 | 17 | ||
18 | +# ORDERING_DATA receives the options to order for as it's keys and a dict as | ||
19 | +# value, if you want to order for the last name, you can use something like: | ||
20 | +# 'last_name': {'name': 'Last Name', 'fields': 'last_name'} inside the dict, | ||
21 | +# you pass two major keys (name, fields) | ||
22 | +# The major key name is the name to appear on the template | ||
23 | +# the major key fields it show receive the name of the fields to order for in | ||
24 | +# the indexes | ||
25 | + | ||
26 | +ORDERING_DATA = { | ||
27 | + 'latest': { | ||
28 | + 'name': gettext(u'Recent activity'), | ||
29 | + 'fields': ('-modified', '-created'), | ||
30 | + }, | ||
31 | + 'hottest': { | ||
32 | + 'name': gettext(u'Relevance'), | ||
33 | + 'fields': None, | ||
34 | + }, | ||
35 | +} | ||
18 | 36 | ||
19 | # the following variable define how many characters should be shown before | 37 | # the following variable define how many characters should be shown before |
20 | # a highlighted word, to make sure that the highlighted word will appear | 38 | # a highlighted word, to make sure that the highlighted word will appear |
src/search/forms.py
@@ -3,6 +3,7 @@ | @@ -3,6 +3,7 @@ | ||
3 | import unicodedata | 3 | import unicodedata |
4 | 4 | ||
5 | from django import forms | 5 | from django import forms |
6 | +from django.conf import settings | ||
6 | from django.utils.translation import ugettext_lazy as _ | 7 | from django.utils.translation import ugettext_lazy as _ |
7 | from haystack.forms import SearchForm | 8 | from haystack.forms import SearchForm |
8 | 9 | ||
@@ -12,6 +13,7 @@ from super_archives.models import Message | @@ -12,6 +13,7 @@ from super_archives.models import Message | ||
12 | 13 | ||
13 | class ColabSearchForm(SearchForm): | 14 | class ColabSearchForm(SearchForm): |
14 | q = forms.CharField(label=_('Search')) | 15 | q = forms.CharField(label=_('Search')) |
16 | + order = forms.CharField(widget=forms.HiddenInput(), required=False) | ||
15 | type = forms.CharField(required=False, label=_(u'Type')) | 17 | type = forms.CharField(required=False, label=_(u'Type')) |
16 | 18 | ||
17 | def search(self): | 19 | def search(self): |
@@ -27,7 +29,16 @@ class ColabSearchForm(SearchForm): | @@ -27,7 +29,16 @@ class ColabSearchForm(SearchForm): | ||
27 | sqs = self.searchqueryset.all() | 29 | sqs = self.searchqueryset.all() |
28 | 30 | ||
29 | if self.cleaned_data['type']: | 31 | if self.cleaned_data['type']: |
30 | - sqs = sqs.filter(type=self.cleaned_data['type']) | 32 | + "It will consider other types with a whitespace" |
33 | + types = self.cleaned_data['type'] | ||
34 | + sqs = sqs.filter(type__in=types.split()) | ||
35 | + | ||
36 | + | ||
37 | + if self.cleaned_data['order']: | ||
38 | + for option, dict_order in settings.ORDERING_DATA.items(): | ||
39 | + if self.cleaned_data['order'] == option: | ||
40 | + if dict_order['fields']: | ||
41 | + sqs = sqs.order_by(*dict_order['fields']) | ||
31 | # if self.cleaned_data['type'] == 'user': | 42 | # if self.cleaned_data['type'] == 'user': |
32 | # sqs = self.searchqueryset.models(User) | 43 | # sqs = self.searchqueryset.models(User) |
33 | # elif self.cleaned_data['type'] in ['message', 'thread']: | 44 | # elif self.cleaned_data['type'] in ['message', 'thread']: |
src/super_archives/templates/message-list.html
@@ -12,11 +12,17 @@ | @@ -12,11 +12,17 @@ | ||
12 | 12 | ||
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 %}> | ||
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 %}> | ||
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> | 15 | + {% for option, dict_order in order_data.items %} |
16 | + <li> | ||
17 | + <span class="glyphicon glyphicon-chevron-right"></span> | ||
18 | + <a href="{% append_to_get order=option p=1 %}"> | ||
19 | + {% ifequal request.GET.order option %} | ||
20 | + {% blocktrans with name=dict_order.name %}<strong>{{ name }}</strong>{% endblocktrans %}</a> | ||
21 | + {% else %} | ||
22 | + {% blocktrans with name=dict_order.name %}{{ name }}{% endblocktrans %}</a> | ||
23 | + {% endifequal %} | ||
24 | + </li> | ||
25 | + {% endfor %} | ||
20 | </ul> | 26 | </ul> |
21 | 27 | ||
22 | <h4>{% trans "Lists" %}</h4> | 28 | <h4>{% trans "Lists" %}</h4> |
src/super_archives/templatetags/append_to_get.py
@@ -1,16 +0,0 @@ | @@ -1,16 +0,0 @@ | ||
1 | -# -*- coding: utf-8 -*- | ||
2 | - | ||
3 | -from django import template | ||
4 | - | ||
5 | -from super_archives.utils import url | ||
6 | - | ||
7 | -register = template.Library() | ||
8 | - | ||
9 | - | ||
10 | -@register.simple_tag(takes_context=True) | ||
11 | -def append_to_get(context, **kwargs): | ||
12 | - return url.append_to_get( | ||
13 | - context['request'].META['PATH_INFO'], | ||
14 | - context['request'].META['QUERY_STRING'], | ||
15 | - **kwargs | ||
16 | - ) |
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | + | ||
3 | +from django import template | ||
4 | + | ||
5 | +from super_archives.utils import url | ||
6 | + | ||
7 | +register = template.Library() | ||
8 | + | ||
9 | + | ||
10 | +@register.simple_tag(takes_context=True) | ||
11 | +def append_to_get(context, **kwargs): | ||
12 | + return url.append_to_get( | ||
13 | + context['request'].META['PATH_INFO'], | ||
14 | + context['request'].META['QUERY_STRING'], | ||
15 | + **kwargs | ||
16 | + ) | ||
17 | + | ||
18 | +@register.simple_tag(takes_context=True) | ||
19 | +def pop_from_get(context, **kwargs): | ||
20 | + return url.pop_from_get( | ||
21 | + context['request'].META['PATH_INFO'], | ||
22 | + context['request'].META['QUERY_STRING'], | ||
23 | + **kwargs | ||
24 | + ) |
src/super_archives/utils/url.py
@@ -58,3 +58,26 @@ def append_to_get(path, query=None, **kwargs): | @@ -58,3 +58,26 @@ def append_to_get(path, query=None, **kwargs): | ||
58 | if current_url[-1] == '&': | 58 | if current_url[-1] == '&': |
59 | return current_url[:-1] | 59 | return current_url[:-1] |
60 | return current_url | 60 | return current_url |
61 | + | ||
62 | + | ||
63 | +def pop_from_get(path, query=None, **kwargs): | ||
64 | + # Getting the path with the query | ||
65 | + print query | ||
66 | + | ||
67 | + current_url = u'{}?{}'.format( | ||
68 | + path, | ||
69 | + query, | ||
70 | + ) | ||
71 | + for key, value in kwargs.items(): | ||
72 | + popitem = u'{}={}'.format(key, value) | ||
73 | + if query == popitem: | ||
74 | + return path | ||
75 | + | ||
76 | + if key not in current_url: | ||
77 | + return current_url | ||
78 | + | ||
79 | + first_path, end_path = current_url.split(key) | ||
80 | + end_path_without_element = end_path.split(value, 1) | ||
81 | + path_list = first_path + end_path_without_element | ||
82 | + print path_list | ||
83 | + return u''.join(path_list) |
src/super_archives/views.py
@@ -3,6 +3,7 @@ | @@ -3,6 +3,7 @@ | ||
3 | import smtplib | 3 | import smtplib |
4 | 4 | ||
5 | from django import http | 5 | from django import http |
6 | +from django.conf import settings | ||
6 | from django.contrib import messages | 7 | from django.contrib import messages |
7 | from django.db import IntegrityError | 8 | from django.db import IntegrityError |
8 | from django.views.generic import View | 9 | from django.views.generic import View |
@@ -85,7 +86,7 @@ def list_messages(request): | @@ -85,7 +86,7 @@ def list_messages(request): | ||
85 | 'n_results': paginator.count, | 86 | 'n_results': paginator.count, |
86 | 'threads': threads, | 87 | 'threads': threads, |
87 | 'selected_list': selected_list, | 88 | 'selected_list': selected_list, |
88 | - 'order_by': order_by, | 89 | + 'order_data': settings.ORDERING_DATA, |
89 | } | 90 | } |
90 | return render(request, 'message-list.html', template_data) | 91 | return render(request, 'message-list.html', template_data) |
91 | 92 |
src/templates/search/search.html
1 | {% extends "base.html" %} | 1 | {% extends "base.html" %} |
2 | {% load i18n %} | 2 | {% load i18n %} |
3 | -{% load append_to_get %} | 3 | +{% load urlutils %} |
4 | {% load highlight %} | 4 | {% load highlight %} |
5 | 5 | ||
6 | {% block main-content %} | 6 | {% block main-content %} |
@@ -16,9 +16,25 @@ | @@ -16,9 +16,25 @@ | ||
16 | <hr/> | 16 | <hr/> |
17 | 17 | ||
18 | <div class="row"> | 18 | <div class="row"> |
19 | - <div class="col-lg-2"> | 19 | + <div id="filters" class="hidden-xs hidden-sm col-md-2 col-lg-2"> |
20 | <h3>{% trans "Filters" %}</h3> | 20 | <h3>{% trans "Filters" %}</h3> |
21 | 21 | ||
22 | + <h4>{% trans "Sort by" %}</h4> | ||
23 | + <ul class="unstyled-list"> | ||
24 | + {% for option, dict_order in order_data.items %} | ||
25 | + <li> | ||
26 | + <span class="glyphicon glyphicon-chevron-right"></span> | ||
27 | + <a href="{% append_to_get order=option p=1 %}"> | ||
28 | + {% ifequal request.GET.order option %} | ||
29 | + {% blocktrans with name=dict_order.name %}<strong>{{ name }}</strong>{% endblocktrans %} | ||
30 | + {% else %} | ||
31 | + {% blocktrans with name=dict_order.name %}{{ name }}{% endblocktrans %} | ||
32 | + {% endifequal %} | ||
33 | + </a> | ||
34 | + </li> | ||
35 | + {% endfor %} | ||
36 | + </ul> | ||
37 | + | ||
22 | <h4>{% trans "Types" %}</h4> | 38 | <h4>{% trans "Types" %}</h4> |
23 | 39 | ||
24 | <ul class="unstyled-list"> | 40 | <ul class="unstyled-list"> |