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 | 15 | |
| 16 | 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 | 37 | # the following variable define how many characters should be shown before |
| 20 | 38 | # a highlighted word, to make sure that the highlighted word will appear | ... | ... |
src/search/forms.py
| ... | ... | @@ -3,6 +3,7 @@ |
| 3 | 3 | import unicodedata |
| 4 | 4 | |
| 5 | 5 | from django import forms |
| 6 | +from django.conf import settings | |
| 6 | 7 | from django.utils.translation import ugettext_lazy as _ |
| 7 | 8 | from haystack.forms import SearchForm |
| 8 | 9 | |
| ... | ... | @@ -12,6 +13,7 @@ from super_archives.models import Message |
| 12 | 13 | |
| 13 | 14 | class ColabSearchForm(SearchForm): |
| 14 | 15 | q = forms.CharField(label=_('Search')) |
| 16 | + order = forms.CharField(widget=forms.HiddenInput(), required=False) | |
| 15 | 17 | type = forms.CharField(required=False, label=_(u'Type')) |
| 16 | 18 | |
| 17 | 19 | def search(self): |
| ... | ... | @@ -27,7 +29,16 @@ class ColabSearchForm(SearchForm): |
| 27 | 29 | sqs = self.searchqueryset.all() |
| 28 | 30 | |
| 29 | 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 | 42 | # if self.cleaned_data['type'] == 'user': |
| 32 | 43 | # sqs = self.searchqueryset.models(User) |
| 33 | 44 | # elif self.cleaned_data['type'] in ['message', 'thread']: | ... | ... |
src/super_archives/templates/message-list.html
| ... | ... | @@ -12,11 +12,17 @@ |
| 12 | 12 | |
| 13 | 13 | <h4>{% trans "Sort by" %}</h4> |
| 14 | 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 | 26 | </ul> |
| 21 | 27 | |
| 22 | 28 | <h4>{% trans "Lists" %}</h4> | ... | ... |
src/super_archives/templatetags/append_to_get.py
| ... | ... | @@ -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 @@ |
| 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 | 58 | if current_url[-1] == '&': |
| 59 | 59 | return current_url[:-1] |
| 60 | 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 | 3 | import smtplib |
| 4 | 4 | |
| 5 | 5 | from django import http |
| 6 | +from django.conf import settings | |
| 6 | 7 | from django.contrib import messages |
| 7 | 8 | from django.db import IntegrityError |
| 8 | 9 | from django.views.generic import View |
| ... | ... | @@ -85,7 +86,7 @@ def list_messages(request): |
| 85 | 86 | 'n_results': paginator.count, |
| 86 | 87 | 'threads': threads, |
| 87 | 88 | 'selected_list': selected_list, |
| 88 | - 'order_by': order_by, | |
| 89 | + 'order_data': settings.ORDERING_DATA, | |
| 89 | 90 | } |
| 90 | 91 | return render(request, 'message-list.html', template_data) |
| 91 | 92 | ... | ... |
src/templates/search/search.html
| 1 | 1 | {% extends "base.html" %} |
| 2 | 2 | {% load i18n %} |
| 3 | -{% load append_to_get %} | |
| 3 | +{% load urlutils %} | |
| 4 | 4 | {% load highlight %} |
| 5 | 5 | |
| 6 | 6 | {% block main-content %} |
| ... | ... | @@ -16,9 +16,25 @@ |
| 16 | 16 | <hr/> |
| 17 | 17 | |
| 18 | 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 | 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 | 38 | <h4>{% trans "Types" %}</h4> |
| 23 | 39 | |
| 24 | 40 | <ul class="unstyled-list"> | ... | ... |