diff --git a/taiga/base/filters.py b/taiga/base/filters.py index f8840111..154a074b 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -22,7 +22,7 @@ from dateutil.parser import parse as parse_date from django.apps import apps 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 taiga.base import exceptions as exc @@ -423,24 +423,19 @@ class AssignedToFilter(BaseRelatedFieldsFilter): class AssignedUsersFilter(BaseRelatedFieldsFilter): 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): param_name = self.param_name or self.filter_name raw_value = params.get(param_name, None) if raw_value: value = self._prepare_filter_data(raw_value) - assigned_user_filter = self.get_lookup_expression(param_name, value) - assigned_to_filter = self.get_lookup_expression('assigned_to', value) + UserStoryModel = apps.get_model("userstories", "UserStory") + + 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)