Bug #135: Now we can filter unassigned issues

remotes/origin/enhancement/email-actions
David Barragán Merino 2014-01-29 14:55:15 +01:00
parent 99b9066965
commit fffa8762c5
1 changed files with 24 additions and 4 deletions

View File

@ -3,6 +3,7 @@
import reversion import reversion
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.db.models import Q
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import list_route from rest_framework.decorators import list_route
@ -22,20 +23,34 @@ from . import models
from . import permissions from . import permissions
from . import serializers from . import serializers
class IssuesFilter(filters.FilterBackend): class IssuesFilter(filters.FilterBackend):
filter_fields = ( "status", "severity", "priority", "owner", "assigned_to", "tags") filter_fields = ( "status", "severity", "priority", "owner", "assigned_to", "tags")
_special_values_dict = {
'true': True,
'false': False,
'null': None,
}
def _prepare_filters_data(self, request): def _prepare_filters_data(self, request):
def _transform_value(value):
try:
return int(value)
except:
if value in self._special_values_dict.keys():
return self._special_values_dict[value]
raise exc.BadRequest()
data = {} data = {}
for filtername in self.filter_fields: for filtername in self.filter_fields:
if filtername not in request.QUERY_PARAMS: if filtername not in request.QUERY_PARAMS:
continue continue
raw_value = request.QUERY_PARAMS[filtername] raw_value = request.QUERY_PARAMS[filtername]
values = (x.strip() for x in raw_value.split(",")) values = set([x.strip() for x in raw_value.split(",")])
if filtername != "tags": if filtername != "tags":
values = map(int, values) values = map(_transform_value, values)
data[filtername] = list(values) data[filtername] = list(values)
return data return data
@ -49,7 +64,12 @@ class IssuesFilter(filters.FilterBackend):
queryset = queryset.extra(where=where_sql, params=params) queryset = queryset.extra(where=where_sql, params=params)
for name, value in filter(lambda x: x[0] != "tags", filterdata.items()): for name, value in filter(lambda x: x[0] != "tags", filterdata.items()):
qs_kwargs = {"{0}_id__in".format(name): value} if None in value:
qs_in_kwargs = {"{0}__in".format(name): [v for v in value if v != None]}
qs_isnull_kwargs = {"{0}__isnull".format(name): True}
queryset = queryset.filter(Q(**qs_in_kwargs) | Q(**qs_isnull_kwargs))
else:
qs_kwargs = {"{0}__in".format(name): value}
queryset = queryset.filter(**qs_kwargs) queryset = queryset.filter(**qs_kwargs)
return queryset return queryset