Refactor AssignedUsersFilter

remotes/origin/3.4.0rc
Álex Hermida 2018-06-04 14:36:51 +02:00 committed by Miguel Gonzalez
parent 1e9aaf1a82
commit 069a79a174
1 changed files with 8 additions and 13 deletions

View File

@ -22,7 +22,7 @@ from dateutil.parser import parse as parse_date
from django.apps import apps from django.apps import apps
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import Q from django.db.models import Q, OuterRef, Subquery
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from taiga.base import exceptions as exc from taiga.base import exceptions as exc
@ -423,24 +423,19 @@ class AssignedToFilter(BaseRelatedFieldsFilter):
class AssignedUsersFilter(BaseRelatedFieldsFilter): class AssignedUsersFilter(BaseRelatedFieldsFilter):
filter_name = 'assigned_users' filter_name = 'assigned_users'
def get_lookup_expression(self, field_name, value):
if None in value:
qs_in_kwargs = {
"{}__in".format(field_name): [v for v in value if
v is not None]}
qs_isnull_kwargs = {"{}__isnull".format(field_name): True}
return Q(**qs_in_kwargs) | Q(**qs_isnull_kwargs)
else:
return Q(**{"{}__in".format(field_name): value})
def _get_queryparams(self, params): def _get_queryparams(self, params):
param_name = self.param_name or self.filter_name param_name = self.param_name or self.filter_name
raw_value = params.get(param_name, None) raw_value = params.get(param_name, None)
if raw_value: if raw_value:
value = self._prepare_filter_data(raw_value) value = self._prepare_filter_data(raw_value)
assigned_user_filter = self.get_lookup_expression(param_name, value) UserStoryModel = apps.get_model("userstories", "UserStory")
assigned_to_filter = self.get_lookup_expression('assigned_to', value)
assigned_users_ids = UserStoryModel.objects.order_by().filter(
assigned_users__in=value, id=OuterRef('pk')).values('pk')
assigned_user_filter = Q(pk__in=Subquery(assigned_users_ids))
assigned_to_filter = Q(assigned_to__in=value)
return Q(assigned_user_filter | assigned_to_filter) return Q(assigned_user_filter | assigned_to_filter)