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 | 9 | from haystack.inputs import AltParser |
10 | 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 | 15 | class ColabSearchForm(SearchForm): |
16 | 16 | q = forms.CharField(label=_('Search'), required=False) |
17 | 17 | order = forms.CharField(widget=forms.HiddenInput(), required=False) |
18 | 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 | 19 | since = forms.DateField(required=False, label=_(u'Since')) |
47 | 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 | 32 | def search(self): |
54 | 33 | if not self.is_valid(): |
... | ... | @@ -56,46 +35,22 @@ class ColabSearchForm(SearchForm): |
56 | 35 | |
57 | 36 | # filter_or goes here |
58 | 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 | 55 | if self.cleaned_data['q']: |
101 | 56 | q = unicodedata.normalize( |
... | ... | @@ -119,70 +74,15 @@ class ColabSearchForm(SearchForm): |
119 | 74 | else: |
120 | 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 | 77 | if self.cleaned_data['order']: |
126 | 78 | for option, dict_order in settings.ORDERING_DATA.items(): |
127 | 79 | if self.cleaned_data['order'] == option: |
128 | 80 | if dict_order['fields']: |
129 | 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 | 83 | if self.cleaned_data['since']: |
181 | 84 | sqs = sqs.filter(modified__gte=self.cleaned_data['since']) |
182 | 85 | if self.cleaned_data['until']: |
183 | 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 | 88 | return sqs | ... | ... |