From 2d13baf3ff9a0372e07cc2a8f7b28cb2cbee6454 Mon Sep 17 00:00:00 2001 From: Luan Date: Mon, 21 Oct 2013 11:22:38 -0200 Subject: [PATCH] Adding specific filters to search #23 #24 --- src/search/forms.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- src/search/views.py | 58 +++++++++++++++++++++++++++------------------------------- src/templates/search/search.html | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- 3 files changed, 146 insertions(+), 68 deletions(-) diff --git a/src/search/forms.py b/src/search/forms.py index 4eaebe7..dca5e6c 100644 --- a/src/search/forms.py +++ b/src/search/forms.py @@ -8,13 +8,35 @@ from django.utils.translation import ugettext_lazy as _ from haystack.forms import SearchForm from accounts.models import User -from super_archives.models import Message +from super_archives.models import Message, MailingList class ColabSearchForm(SearchForm): q = forms.CharField(label=_('Search'), required=False) order = forms.CharField(widget=forms.HiddenInput(), required=False) type = forms.CharField(required=False, label=_(u'Type')) + author = forms.CharField(required=False, label=_(u'Author')) + # ticket status + tag = forms.CharField(required=False, label=_(u'Status')) + # mailinglist tag + list = forms.MultipleChoiceField( + required=False, + label=_(u'Mailinglist'), + choices=[(v, v) for v in MailingList.objects.values('name') + for (v, v) in v.items()] + ) + milestone = forms.CharField(required=False, label=_(u'Milestone')) + priority = forms.CharField(required=False, label=_(u'Priority')) + component = forms.CharField(required=False, label=_(u'Component')) + severity = forms.CharField(required=False, label=_(u'Severity')) + reporter = forms.CharField(required=False, label=_(u'Reporter')) + keywords = forms.CharField(required=False, label=_(u'Keywords')) + collaborators = forms.CharField(required=False, label=_(u'Collaborators')) + repository_name = forms.CharField(required=False, label=_(u'Repository')) + username = forms.CharField(required=False, label=_(u'Username')) + name = forms.CharField(required=False, label=_(u'Name')) + institution = forms.CharField(required=False, label=_(u'Institution')) + role = forms.CharField(required=False, label=_(u'Role')) def search(self): if not self.is_valid(): @@ -33,25 +55,44 @@ class ColabSearchForm(SearchForm): types = self.cleaned_data['type'] sqs = sqs.filter(type__in=types.split()) - if self.cleaned_data['order']: for option, dict_order in settings.ORDERING_DATA.items(): if self.cleaned_data['order'] == option: if dict_order['fields']: sqs = sqs.order_by(*dict_order['fields']) - # if self.cleaned_data['type'] == 'user': - # sqs = self.searchqueryset.models(User) - # elif self.cleaned_data['type'] in ['message', 'thread']: - # sqs = self.searchqueryset.models(Message) - # elif self.cleaned_data['type'] == 'wiki': - # sqs = self.searchqueryset.models(Wiki) - # elif self.cleaned_data['type'] == 'changeset': - # sqs = self.searchqueryset.models(Changeset) - # elif self.cleaned_data['type'] == 'ticket': - # sqs = self.searchqueryset.models(Ticket) - # else: - # sqs = self.searchqueryset.all() + if self.cleaned_data['author']: + sqs = sqs.filter(author=self.cleaned_data['author']) + + if self.cleaned_data['milestone']: + sqs = sqs.filter(milestone=self.cleaned_data['milestone']) + if self.cleaned_data['priority']: + sqs = sqs.filter(priority=self.cleaned_data['priority']) + if self.cleaned_data['severity']: + sqs = sqs.filter(severity=self.cleaned_data['severity']) + if self.cleaned_data['reporter']: + sqs = sqs.filter(reporter=self.cleaned_data['reporter']) + if self.cleaned_data['keywords']: + sqs = sqs.filter(keywords=self.cleaned_data['keywords']) + if self.cleaned_data['collaborators']: + sqs = sqs.filter(collaborators=self.cleaned_data['collaborators']) + if self.cleaned_data['repository_name']: + sqs = sqs.filter( + repository_name=self.cleaned_data['repository_name'] + ) + if self.cleaned_data['username']: + sqs = sqs.filter(username=self.cleaned_data['username']) + if self.cleaned_data['name']: + sqs = sqs.filter(name=self.cleaned_data['name']) + if self.cleaned_data['institution']: + sqs = sqs.filter(institution=self.cleaned_data['institution']) + if self.cleaned_data['role']: + sqs = sqs.filter(role=self.cleaned_data['role']) + if self.cleaned_data['tag']: + sqs = sqs.filter(tag=self.cleaned_data['tag']) + + if self.cleaned_data['list']: + sqs = sqs.filter(tag__in=self.cleaned_data['list']) if self.load_all: sqs = sqs.load_all() diff --git a/src/search/views.py b/src/search/views.py index 56f3e99..fc7e16f 100644 --- a/src/search/views.py +++ b/src/search/views.py @@ -1,58 +1,54 @@ # -*- coding:utf-8 -*- from django.conf import settings +from django.utils.translation import ugettext as _ + from haystack.views import SearchView class ColabSearchView(SearchView): def extra_context(self, *args, **kwargs): - # Retornar todos os campos de cada tipo a serem filtrados - # retornar os nomes dos campos - # retornar os ícones dos tipos - - # a critical point on the system types = { 'wiki': { 'icon': 'file', - 'fields': [ - 'title', 'description', 'author', 'collaborators', - 'created', 'modified', - ], + 'name': _(u'Wiki'), + 'fields': {'author': _(u'Author')}, }, - 'discussion': { + 'thread': { 'icon': 'thread', - 'fields': [ - 'title', 'description', 'created', 'modified', 'author', - 'tag', - ], + 'name': _(u'Discussion'), + 'fields': {'author': _(u'Author'), 'list': _(u'Mailinglist')}, }, 'ticket': { 'icon': 'ticket', - 'fields': [ - 'title', 'description', 'milestone', 'priority', - 'component', 'version', 'severity', 'reporter', 'author', - 'status', 'keywords', 'collaborators', 'created', - 'modified', - ], + 'name': _(u'Ticket'), + 'fields': { + 'milestone': _(u'Milestone'), 'priority': _(u'Priority'), + 'component': _(u'Component'), 'severity': _(u'Severity'), + 'reporter': _(u'Reporter'), 'author': _(u'Author'), + 'tag': _(u'Status'), 'keywords': _(u'Keywords'), + 'collaborators': _(u'Collaborators'), + }, }, 'changeset': { 'icon': 'changeset', - 'fields': [ - 'title', 'author', 'description', 'repository_name', - 'created', 'modified', - ], + 'name': _(u'Changeset'), + 'fields': {'author': _(u'Author'), 'repository_name': _(u'Repository')}, }, 'user': { 'icon': 'user', - 'fields': [ - 'title', 'description', 'username', 'name', - 'email', 'institution', 'role', 'google_talk', 'webpage', - ], + 'name': _(u'User'), + 'fields': {'username': _(u'Username'), 'name': _(u'Name'), 'institution': _(u'Institution'), 'role': _(u'Role')}, }, } - types = self.form.cleaned_data['type'] + + try: + type_chosen = self.form.cleaned_data.get('type') + except AttributeError: + type_chosen = '' + return dict( - types=types.split(), - types_str=types, + filters=types.get(type_chosen), + type_chosen=type_chosen, order_data=settings.ORDERING_DATA ) diff --git a/src/templates/search/search.html b/src/templates/search/search.html index e90dbda..be839c5 100644 --- a/src/templates/search/search.html +++ b/src/templates/search/search.html @@ -17,6 +17,45 @@
-- libgit2 0.21.2