Add additional filter backend for issues.
parent
286d697aac
commit
1368ebaed9
|
@ -7,6 +7,7 @@ from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.decorators import list_route
|
from rest_framework.decorators import list_route
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
from rest_framework import filters
|
||||||
|
|
||||||
from greenmine.base import filters
|
from greenmine.base import filters
|
||||||
from greenmine.base import exceptions as exc
|
from greenmine.base import exceptions as exc
|
||||||
|
@ -20,13 +21,46 @@ from . import models
|
||||||
from . import permissions
|
from . import permissions
|
||||||
from . import serializers
|
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):
|
class IssueViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
||||||
model = models.Issue
|
model = models.Issue
|
||||||
serializer_class = serializers.IssueSerializer
|
serializer_class = serializers.IssueSerializer
|
||||||
permission_classes = (IsAuthenticated, permissions.IssuePermission)
|
permission_classes = (IsAuthenticated, permissions.IssuePermission)
|
||||||
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
filter_backends = (filters.IsProjectMemberFilterBackend, IssuesFilter)
|
||||||
filter_fields = ("project",)
|
filter_fields = ("project",)
|
||||||
order_by_fields = ("created_date", "modified_date")
|
order_by_fields = ("created_date", "modified_date")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue