Fixed bug #763: Now filter of us and issues filter by subject and reference

remotes/origin/enhancement/email-actions
Jesús Espino 2014-08-28 11:24:19 +02:00
parent 5975a0bc05
commit a9ecac7c1c
3 changed files with 9 additions and 25 deletions

View File

@ -242,26 +242,12 @@ class TagsFilter(FilterBackend):
return super().filter_queryset(request, queryset, view) return super().filter_queryset(request, queryset, view)
class SearchFieldFilter(filters.SearchFilter): class QFilter(FilterBackend):
"""Search filter that looks up the search param in the parameter named after the search field,
that is: ?<search field>=... 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()
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
search_fields = getattr(view, "search_fields", None) q = request.QUERY_PARAMS.get('q', None)
if not search_fields: if q:
return queryset qs_args = [Q(subject__icontains=x) for x in q.split()]
qs_args += [Q(ref=x) for x in q.split() if x.isdigit()]
lookups = dict((self.construct_search(field), self.get_search_terms(request, field)) queryset = queryset.filter(reduce(operator.or_, qs_args))
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))
return queryset return queryset

View File

@ -109,12 +109,11 @@ class IssueViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin,
list_serializer_class = serializers.IssueSerializer list_serializer_class = serializers.IssueSerializer
permission_classes = (permissions.IssuePermission, ) permission_classes = (permissions.IssuePermission, )
filter_backends = (filters.CanViewIssuesFilterBackend, filters.SearchFieldFilter, filter_backends = (filters.CanViewIssuesFilterBackend, filters.QFilter,
IssuesFilter, IssuesOrdering) IssuesFilter, IssuesOrdering,)
retrieve_exclude_filters = (IssuesFilter,) retrieve_exclude_filters = (IssuesFilter,)
filter_fields = ("project",) filter_fields = ("project",)
search_fields = ("subject",)
order_by_fields = ("type", order_by_fields = ("type",
"severity", "severity",
"status", "status",

View File

@ -46,10 +46,9 @@ class UserStoryViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMi
permission_classes = (permissions.UserStoryPermission,) permission_classes = (permissions.UserStoryPermission,)
filter_backends = (filters.CanViewUsFilterBackend, filters.TagsFilter, filter_backends = (filters.CanViewUsFilterBackend, filters.TagsFilter,
filters.SearchFieldFilter) filters.QFilter)
retrieve_exclude_filters = (filters.TagsFilter,) retrieve_exclude_filters = (filters.TagsFilter,)
filter_fields = ['project', 'milestone', 'milestone__isnull', 'status', 'is_archived'] filter_fields = ['project', 'milestone', 'milestone__isnull', 'status', 'is_archived']
search_fields = ('subject',)
# Specific filter used for filtering neighbor user stories # Specific filter used for filtering neighbor user stories
_neighbor_tags_filter = filters.TagsFilter('neighbor_tags') _neighbor_tags_filter = filters.TagsFilter('neighbor_tags')