Commit 7728549e3f32b83c04de4e9e20b4c61a4baeac39
Committed by
Alexandre Barbosa
1 parent
b34940ed
Exists in
master
and in
5 other branches
Allow dynamic filters
Signed-off-by: Gustavo Jaruga <darksshades@gmail.com> Signed-off-by: Lucas Moura <lucas.moura128@gmail.com>
Showing
1 changed file
with
26 additions
and
126 deletions
Show diff stats
colab/search/forms.py
@@ -9,46 +9,25 @@ from haystack.forms import SearchForm | @@ -9,46 +9,25 @@ from haystack.forms import SearchForm | ||
9 | from haystack.inputs import AltParser | 9 | from haystack.inputs import AltParser |
10 | from haystack.inputs import AutoQuery | 10 | from haystack.inputs import AutoQuery |
11 | 11 | ||
12 | -from colab.super_archives.models import MailingList | 12 | +from colab.plugins.utils.filters_importer import import_plugin_filters |
13 | 13 | ||
14 | 14 | ||
15 | class ColabSearchForm(SearchForm): | 15 | class ColabSearchForm(SearchForm): |
16 | q = forms.CharField(label=_('Search'), required=False) | 16 | q = forms.CharField(label=_('Search'), required=False) |
17 | order = forms.CharField(widget=forms.HiddenInput(), required=False) | 17 | order = forms.CharField(widget=forms.HiddenInput(), required=False) |
18 | type = forms.CharField(required=False, label=_(u'Type')) | 18 | type = forms.CharField(required=False, label=_(u'Type')) |
19 | - author = forms.CharField(required=False, label=_(u'Author')) | ||
20 | - modified_by = forms.CharField(required=False, label=_(u'Modified by')) | ||
21 | - # ticket status | ||
22 | - tag = forms.CharField(required=False, label=_(u'Status')) | ||
23 | - # mailinglist tag | ||
24 | - list = forms.MultipleChoiceField( | ||
25 | - required=False, | ||
26 | - label=_(u'Mailinglist'), | ||
27 | - choices=[(v, v) for v in MailingList.objects.values_list( | ||
28 | - 'name', flat=True)] | ||
29 | - ) | ||
30 | - milestone = forms.CharField(required=False, label=_(u'Milestone')) | ||
31 | - priority = forms.CharField(required=False, label=_(u'Priority')) | ||
32 | - component = forms.CharField(required=False, label=_(u'Component')) | ||
33 | - severity = forms.CharField(required=False, label=_(u'Severity')) | ||
34 | - reporter = forms.CharField(required=False, label=_(u'Reporter')) | ||
35 | - keywords = forms.CharField(required=False, label=_(u'Keywords')) | ||
36 | - collaborators = forms.CharField(required=False, label=_(u'Collaborators')) | ||
37 | - repository_name = forms.CharField(required=False, label=_(u'Repository')) | ||
38 | - body = forms.CharField(required=False, label=_(u'Content')) | ||
39 | - description = forms.CharField(required=False, label=_(u'Description')) | ||
40 | - category = forms.CharField(required=False, label=_(u'Category')) | ||
41 | - title = forms.CharField(required=False, label=_(u'Title')) | ||
42 | - username = forms.CharField(required=False, label=_(u'Username')) | ||
43 | - name = forms.CharField(required=False, label=_(u'Name')) | ||
44 | - institution = forms.CharField(required=False, label=_(u'Institution')) | ||
45 | - role = forms.CharField(required=False, label=_(u'Role')) | ||
46 | since = forms.DateField(required=False, label=_(u'Since')) | 19 | since = forms.DateField(required=False, label=_(u'Since')) |
47 | until = forms.DateField(required=False, label=_(u'Until')) | 20 | until = forms.DateField(required=False, label=_(u'Until')) |
48 | - filename = forms.CharField(required=False, label=_(u'Filename')) | ||
49 | - used_by = forms.CharField(required=False, label=_(u'Used by')) | ||
50 | - mimetype = forms.CharField(required=False, label=_(u'File type')) | ||
51 | - size = forms.CharField(required=False, label=_(u'Size')) | 21 | + |
22 | + excluded_fields = [] | ||
23 | + | ||
24 | + def __init__(self, *args, **kwargs): | ||
25 | + super(ColabSearchForm, self).__init__(*args, **kwargs) | ||
26 | + extra = import_plugin_filters({}) | ||
27 | + for filter_types in extra.values(): | ||
28 | + for field in filter_types['fields']: | ||
29 | + self.fields[field[0]] = forms.CharField(required=False, | ||
30 | + label=field[1]) | ||
52 | 31 | ||
53 | def search(self): | 32 | def search(self): |
54 | if not self.is_valid(): | 33 | if not self.is_valid(): |
@@ -56,46 +35,22 @@ class ColabSearchForm(SearchForm): | @@ -56,46 +35,22 @@ class ColabSearchForm(SearchForm): | ||
56 | 35 | ||
57 | # filter_or goes here | 36 | # filter_or goes here |
58 | sqs = self.searchqueryset.all() | 37 | sqs = self.searchqueryset.all() |
59 | - mimetype = self.cleaned_data['mimetype'] | ||
60 | - if mimetype: | ||
61 | - filter_mimetypes = {'mimetype__in': []} | ||
62 | - for type_, display, mimelist in settings.FILE_TYPE_GROUPINGS: | ||
63 | - if type_ in mimetype: | ||
64 | - filter_mimetypes['mimetype__in'] += mimelist | ||
65 | - if not self.cleaned_data['size']: | ||
66 | - sqs = sqs.filter_or(mimetype__in=mimelist) | ||
67 | - | ||
68 | - if self.cleaned_data['size']: | ||
69 | - # (1024 * 1024) / 2 | ||
70 | - # (1024 * 1024) * 10 | ||
71 | - filter_sizes = {} | ||
72 | - filter_sizes_exp = {} | ||
73 | - if '<500KB' in self.cleaned_data['size']: | ||
74 | - filter_sizes['size__lt'] = 524288 | ||
75 | - if '500KB__10MB' in self.cleaned_data['size']: | ||
76 | - filter_sizes_exp['size__gte'] = 524288 | ||
77 | - filter_sizes_exp['size__lte'] = 10485760 | ||
78 | - if '>10MB' in self.cleaned_data['size']: | ||
79 | - filter_sizes['size__gt'] = 10485760 | ||
80 | - | ||
81 | - if self.cleaned_data['mimetype']: | ||
82 | - # Add the mimetypes filters to this dict and filter it | ||
83 | - if filter_sizes_exp: | ||
84 | - filter_sizes_exp.update(filter_mimetypes) | ||
85 | - sqs = sqs.filter_or(**filter_sizes_exp) | ||
86 | - for filter_or in filter_sizes.items(): | ||
87 | - filter_or = dict((filter_or, )) | ||
88 | - filter_or.update(filter_mimetypes) | ||
89 | - sqs = sqs.filter_or(**filter_or) | ||
90 | - else: | ||
91 | - for filter_or in filter_sizes.items(): | ||
92 | - filter_or = dict((filter_or, )) | ||
93 | - sqs = sqs.filter_or(**filter_or) | ||
94 | - sqs = sqs.filter_or(**filter_sizes_exp) | ||
95 | 38 | ||
96 | - if self.cleaned_data['used_by']: | ||
97 | - sqs = sqs.filter_or(used_by__in=self.cleaned_data['used_by'] | ||
98 | - .split()) | 39 | + kwargs = {} |
40 | + | ||
41 | + self.excluded_fields.extend(['q', 'type', 'since', 'until', 'order']) | ||
42 | + | ||
43 | + if self.cleaned_data['type']: | ||
44 | + all_types = self.cleaned_data['type'].split(' ') | ||
45 | + sqs = sqs.filter_or(type__in=all_types) | ||
46 | + | ||
47 | + for key in self.fields.keys(): | ||
48 | + value = self.cleaned_data[key] | ||
49 | + if value and key not in self.excluded_fields: | ||
50 | + print key, '-' + value | ||
51 | + kwargs[key] = self.cleaned_data[key] | ||
52 | + | ||
53 | + sqs = sqs.filter(**kwargs) | ||
99 | 54 | ||
100 | if self.cleaned_data['q']: | 55 | if self.cleaned_data['q']: |
101 | q = unicodedata.normalize( | 56 | q = unicodedata.normalize( |
@@ -119,70 +74,15 @@ class ColabSearchForm(SearchForm): | @@ -119,70 +74,15 @@ class ColabSearchForm(SearchForm): | ||
119 | else: | 74 | else: |
120 | sqs = sqs.filter(content=AutoQuery(q)) | 75 | sqs = sqs.filter(content=AutoQuery(q)) |
121 | 76 | ||
122 | - if self.cleaned_data['type']: | ||
123 | - sqs = sqs.filter(type=self.cleaned_data['type']) | ||
124 | - | ||
125 | if self.cleaned_data['order']: | 77 | if self.cleaned_data['order']: |
126 | for option, dict_order in settings.ORDERING_DATA.items(): | 78 | for option, dict_order in settings.ORDERING_DATA.items(): |
127 | if self.cleaned_data['order'] == option: | 79 | if self.cleaned_data['order'] == option: |
128 | if dict_order['fields']: | 80 | if dict_order['fields']: |
129 | sqs = sqs.order_by(*dict_order['fields']) | 81 | sqs = sqs.order_by(*dict_order['fields']) |
130 | 82 | ||
131 | - if self.cleaned_data['author']: | ||
132 | - sqs = sqs.filter( | ||
133 | - fullname_and_username__contains=self.cleaned_data['author'] | ||
134 | - ) | ||
135 | - | ||
136 | - if self.cleaned_data['modified_by']: | ||
137 | - modified_by_data = self.cleaned_date['modified_by'] | ||
138 | - sqs = sqs.filter( | ||
139 | - fullname_and_username__contains=modified_by_data | ||
140 | - ) | ||
141 | - | ||
142 | - if self.cleaned_data['milestone']: | ||
143 | - sqs = sqs.filter(milestone=self.cleaned_data['milestone']) | ||
144 | - if self.cleaned_data['priority']: | ||
145 | - sqs = sqs.filter(priority=self.cleaned_data['priority']) | ||
146 | - if self.cleaned_data['severity']: | ||
147 | - sqs = sqs.filter(severity=self.cleaned_data['severity']) | ||
148 | - if self.cleaned_data['reporter']: | ||
149 | - sqs = sqs.filter(reporter=self.cleaned_data['reporter']) | ||
150 | - if self.cleaned_data['keywords']: | ||
151 | - sqs = sqs.filter(keywords=self.cleaned_data['keywords']) | ||
152 | - if self.cleaned_data['collaborators']: | ||
153 | - sqs = sqs.filter(collaborators=self.cleaned_data['collaborators']) | ||
154 | - if self.cleaned_data['repository_name']: | ||
155 | - sqs = sqs.filter( | ||
156 | - repository_name=self.cleaned_data['repository_name'] | ||
157 | - ) | ||
158 | - if self.cleaned_data['body']: | ||
159 | - sqs = sqs.filter(body=self.cleaned_data['body']) | ||
160 | - if self.cleaned_data['description']: | ||
161 | - sqs = sqs.filter(description=self.cleaned_data['description']) | ||
162 | - if self.cleaned_data['category']: | ||
163 | - sqs = sqs.filter(category=self.cleaned_data['category']) | ||
164 | - if self.cleaned_data['title']: | ||
165 | - sqs = sqs.filter(title=self.cleaned_data['title']) | ||
166 | - if self.cleaned_data['username']: | ||
167 | - sqs = sqs.filter(username=self.cleaned_data['username']) | ||
168 | - if self.cleaned_data['name']: | ||
169 | - sqs = sqs.filter(name=self.cleaned_data['name']) | ||
170 | - if self.cleaned_data['institution']: | ||
171 | - sqs = sqs.filter(institution=self.cleaned_data['institution']) | ||
172 | - if self.cleaned_data['role']: | ||
173 | - sqs = sqs.filter(role=self.cleaned_data['role']) | ||
174 | - if self.cleaned_data['tag']: | ||
175 | - sqs = sqs.filter(tag=self.cleaned_data['tag']) | ||
176 | - | ||
177 | - if self.cleaned_data['list']: | ||
178 | - sqs = sqs.filter(tag__in=self.cleaned_data['list']) | ||
179 | - | ||
180 | if self.cleaned_data['since']: | 83 | if self.cleaned_data['since']: |
181 | sqs = sqs.filter(modified__gte=self.cleaned_data['since']) | 84 | sqs = sqs.filter(modified__gte=self.cleaned_data['since']) |
182 | if self.cleaned_data['until']: | 85 | if self.cleaned_data['until']: |
183 | sqs = sqs.filter(modified__lte=self.cleaned_data['until']) | 86 | sqs = sqs.filter(modified__lte=self.cleaned_data['until']) |
184 | 87 | ||
185 | - if self.cleaned_data['filename']: | ||
186 | - sqs = sqs.filter(filename=self.cleaned_data['filename']) | ||
187 | - | ||
188 | return sqs | 88 | return sqs |