User Stories Role Filter

remotes/origin/3.4.0rc
Daniel García 2018-07-03 15:10:47 +02:00 committed by Alex Hermida
parent 5974ca6ce3
commit 2744aa52f0
2 changed files with 35 additions and 11 deletions

View File

@ -140,6 +140,17 @@ class FilterBackend(OrderByFilterMixin):
pass 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 # Permissions filters
##################################################################### #####################################################################
@ -420,18 +431,9 @@ class AssignedToFilter(BaseRelatedFieldsFilter):
filter_name = 'assigned_to' filter_name = 'assigned_to'
class AssignedUsersFilter(BaseRelatedFieldsFilter): class AssignedUsersFilter(FilterModelAssignedUsers, BaseRelatedFieldsFilter):
filter_name = 'assigned_users' 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): 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)
@ -643,3 +645,25 @@ class RoleFilter(BaseRelatedFieldsFilter):
queryset = queryset.filter(assigned_to__in=memberships) queryset = queryset.filter(assigned_to__in=memberships)
return FilterBackend.filter_queryset(self, request, queryset, view) 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)

View File

@ -62,7 +62,7 @@ class UserStoryViewSet(OCCResourceMixin, VotedResourceMixin, HistoryResourceMixi
permission_classes = (permissions.UserStoryPermission,) permission_classes = (permissions.UserStoryPermission,)
filter_backends = (base_filters.CanViewUsFilterBackend, filter_backends = (base_filters.CanViewUsFilterBackend,
filters.EpicFilter, filters.EpicFilter,
base_filters.RoleFilter, base_filters.UserStoriesRoleFilter,
base_filters.OwnersFilter, base_filters.OwnersFilter,
base_filters.AssignedToFilter, base_filters.AssignedToFilter,
base_filters.AssignedUsersFilter, base_filters.AssignedUsersFilter,