From 1368ebaed9f1a5d91497686c1d4bddd57cf47182 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 12 Nov 2013 12:51:17 +0100 Subject: [PATCH] Add additional filter backend for issues. --- greenmine/projects/issues/api.py | 36 +++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/greenmine/projects/issues/api.py b/greenmine/projects/issues/api.py index 249d3f54..8eb8f924 100644 --- a/greenmine/projects/issues/api.py +++ b/greenmine/projects/issues/api.py @@ -7,6 +7,7 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.decorators import list_route from rest_framework.response import Response from rest_framework import status +from rest_framework import filters from greenmine.base import filters from greenmine.base import exceptions as exc @@ -20,13 +21,46 @@ from . import models from . import permissions from . import serializers +class IssuesFilter(filters.FilterBackend): + filter_fields = ("assigned_to", "status", "severity", + "priority", "tags") + + def _prepare_filters_data(self, request): + data = {} + for filtername in self.filter_fields: + if filtername not in request.QUERY_PARAMS: + continue + + raw_value = request.QUERY_PARAMS[filtername] + values = (x.strip() for x in raw_value.split(",")) + + if filtername != "tags": + values = map(int, values) + + data[filtername] = list(values) + return data + + def filter_queryset(self, request, queryset, view): + filterdata = self._prepare_filters_data(request) + + if "tags" in filterdata: + where_sql = ["unpickle(issues_issue.tags) @> %s"] + params = [filterdata["tags"]] + queryset = queryset.extra(where=where_sql, params=params) + + for name, value in filter(lambda x: x[0] != "tags", filterdata.items()): + qs_kwargs = {"{0}_id__in".format(name): value} + queryset = queryset.filter(**qs_kwargs) + + return queryset + class IssueViewSet(NotificationSenderMixin, ModelCrudViewSet): model = models.Issue serializer_class = serializers.IssueSerializer permission_classes = (IsAuthenticated, permissions.IssuePermission) - filter_backends = (filters.IsProjectMemberFilterBackend,) + filter_backends = (filters.IsProjectMemberFilterBackend, IssuesFilter) filter_fields = ("project",) order_by_fields = ("created_date", "modified_date")