diff --git a/taiga/base/filters.py b/taiga/base/filters.py index bea2ed3e..25287800 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -242,26 +242,12 @@ class TagsFilter(FilterBackend): return super().filter_queryset(request, queryset, view) -class SearchFieldFilter(filters.SearchFilter): - """Search filter that looks up the search param in the parameter named after the search field, - that is: ?=... instead of looking for the search param: ?search=... - This way you can search in a field-specific way. - """ - def get_search_terms(self, request, field): - params = request.QUERY_PARAMS.get(field, '') - return params.replace(',', ' ').split() - +class QFilter(FilterBackend): def filter_queryset(self, request, queryset, view): - search_fields = getattr(view, "search_fields", None) - if not search_fields: - return queryset - - lookups = dict((self.construct_search(field), self.get_search_terms(request, field)) - for field in search_fields) - - for lookup, values in lookups.items(): - or_queries = [Q(**{lookup: value}) for value in values] - if or_queries: - queryset = queryset.filter(reduce(operator.or_, or_queries)) + q = request.QUERY_PARAMS.get('q', None) + if q: + qs_args = [Q(subject__icontains=x) for x in q.split()] + qs_args += [Q(ref=x) for x in q.split() if x.isdigit()] + queryset = queryset.filter(reduce(operator.or_, qs_args)) return queryset diff --git a/taiga/projects/issues/api.py b/taiga/projects/issues/api.py index 540d60c7..661925d6 100644 --- a/taiga/projects/issues/api.py +++ b/taiga/projects/issues/api.py @@ -109,12 +109,11 @@ class IssueViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin, list_serializer_class = serializers.IssueSerializer permission_classes = (permissions.IssuePermission, ) - filter_backends = (filters.CanViewIssuesFilterBackend, filters.SearchFieldFilter, - IssuesFilter, IssuesOrdering) + filter_backends = (filters.CanViewIssuesFilterBackend, filters.QFilter, + IssuesFilter, IssuesOrdering,) retrieve_exclude_filters = (IssuesFilter,) filter_fields = ("project",) - search_fields = ("subject",) order_by_fields = ("type", "severity", "status", diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 53c2703d..91acfe98 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -46,10 +46,9 @@ class UserStoryViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMi permission_classes = (permissions.UserStoryPermission,) filter_backends = (filters.CanViewUsFilterBackend, filters.TagsFilter, - filters.SearchFieldFilter) + filters.QFilter) retrieve_exclude_filters = (filters.TagsFilter,) filter_fields = ['project', 'milestone', 'milestone__isnull', 'status', 'is_archived'] - search_fields = ('subject',) # Specific filter used for filtering neighbor user stories _neighbor_tags_filter = filters.TagsFilter('neighbor_tags')