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 | ... | ... |