From 2744aa52f09683dd8d35acbafefa351f70bfbef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa?= Date: Tue, 3 Jul 2018 15:10:47 +0200 Subject: [PATCH] User Stories Role Filter --- taiga/base/filters.py | 44 ++++++++++++++++++++++++------- taiga/projects/userstories/api.py | 2 +- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/taiga/base/filters.py b/taiga/base/filters.py index 8d91a444..23cee13e 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -140,6 +140,17 @@ class FilterBackend(OrderByFilterMixin): pass +class FilterModelAssignedUsers: + def get_assigned_users_filter(self, model, value): + assigned_users_ids = model.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) + + ##################################################################### # Permissions filters ##################################################################### @@ -420,18 +431,9 @@ class AssignedToFilter(BaseRelatedFieldsFilter): filter_name = 'assigned_to' -class AssignedUsersFilter(BaseRelatedFieldsFilter): +class AssignedUsersFilter(FilterModelAssignedUsers, BaseRelatedFieldsFilter): filter_name = 'assigned_users' - def get_assigned_users_filter(self, us_model, value): - assigned_users_ids = us_model.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) - def _get_queryparams(self, params): param_name = self.param_name or self.filter_name raw_value = params.get(param_name, None) @@ -643,3 +645,25 @@ class RoleFilter(BaseRelatedFieldsFilter): queryset = queryset.filter(assigned_to__in=memberships) return FilterBackend.filter_queryset(self, request, queryset, view) + + +class UserStoriesRoleFilter(FilterModelAssignedUsers, BaseRelatedFieldsFilter): + filter_name = "role_id" + param_name = "role" + + def filter_queryset(self, request, queryset, view): + Membership = apps.get_model('projects', 'Membership') + query = self._get_queryparams(request.QUERY_PARAMS) + + if query: + if isinstance(query, dict): + memberships = Membership.objects.filter(**query).values_list("user_id", flat=True) + else: + memberships = Membership.objects.filter(query).values_list("user_id", flat=True) + if memberships: + user_story_model = apps.get_model("userstories", "UserStory") + queryset = queryset.filter( + self.get_assigned_users_filter(user_story_model, memberships) + ) + + return FilterBackend.filter_queryset(self, request, queryset, view) diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 8a752171..8a36d54f 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -62,7 +62,7 @@ class UserStoryViewSet(OCCResourceMixin, VotedResourceMixin, HistoryResourceMixi permission_classes = (permissions.UserStoryPermission,) filter_backends = (base_filters.CanViewUsFilterBackend, filters.EpicFilter, - base_filters.RoleFilter, + base_filters.UserStoriesRoleFilter, base_filters.OwnersFilter, base_filters.AssignedToFilter, base_filters.AssignedUsersFilter,