refactor exclude filter mode implementation

stable
Héctor Fernández Cascallar 2019-01-18 14:23:18 +01:00 committed by Alex Hermida
parent 7c5ba16d24
commit 2b38fefa13
1 changed files with 22 additions and 14 deletions

View File

@ -414,16 +414,22 @@ class BaseRelatedFieldsFilter(FilterBackend):
return None return None
def _prepare_filter_query(self, query):
return query
def _prepare_exclude_query(self, query):
return ~Q(query)
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
operations = { operations = {
"filter": queryset.filter, "filter": self._prepare_filter_query,
"exclude": queryset.exclude, "exclude": self._prepare_exclude_query,
} }
for mode, qs_method in operations.items(): for mode, prepare_method in operations.items():
query = self._get_queryparams(request.QUERY_PARAMS, mode=mode) query = self._get_queryparams(request.QUERY_PARAMS, mode=mode)
if query: if query:
queryset = qs_method(query) queryset = queryset.filter(prepare_method(query))
return super().filter_queryset(request, queryset, view) return super().filter_queryset(request, queryset, view)
@ -506,16 +512,16 @@ class TagsFilter(FilterBackend):
return None return None
def prepare_filter(self, query): def _prepare_filter_query(self, query):
return Q(tags__contains=query) return Q(tags__contains=query)
def prepare_exclude(self, query): def _prepare_exclude_query(self, query):
return ~Q(tags__contains=query) return ~Q(tags__contains=query)
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
operations = { operations = {
"filter": self.prepare_filter, "filter": self._prepare_filter_query,
"exclude": self.prepare_exclude, "exclude": self._prepare_exclude_query,
} }
for mode, prepare_method in operations.items(): for mode, prepare_method in operations.items():
@ -666,8 +672,8 @@ class RoleFilter(BaseRelatedFieldsFilter):
Membership = apps.get_model('projects', 'Membership') Membership = apps.get_model('projects', 'Membership')
operations = { operations = {
"filter": queryset.filter, "filter": self._prepare_filter_query,
"exclude": queryset.exclude, "exclude": self._prepare_exclude_query,
} }
for mode, qs_method in operations.items(): for mode, qs_method in operations.items():
@ -675,7 +681,7 @@ class RoleFilter(BaseRelatedFieldsFilter):
if query: if query:
memberships = Membership.objects.filter(query).exclude(user__isnull=True).values_list("user_id", flat=True) memberships = Membership.objects.filter(query).exclude(user__isnull=True).values_list("user_id", flat=True)
if memberships: if memberships:
queryset = qs_method(assigned_to__in=memberships) queryset = queryset.filter(qs_method(Q(assigned_to__in=memberships)))
return FilterBackend.filter_queryset(self, request, queryset, view) return FilterBackend.filter_queryset(self, request, queryset, view)
@ -689,8 +695,8 @@ class UserStoriesRoleFilter(FilterModelAssignedUsers, BaseRelatedFieldsFilter):
Membership = apps.get_model('projects', 'Membership') Membership = apps.get_model('projects', 'Membership')
operations = { operations = {
"filter": queryset.filter, "filter": self._prepare_filter_query,
"exclude": queryset.exclude, "exclude": self._prepare_exclude_query,
} }
for mode, qs_method in operations.items(): for mode, qs_method in operations.items():
@ -699,6 +705,8 @@ class UserStoriesRoleFilter(FilterModelAssignedUsers, BaseRelatedFieldsFilter):
memberships = Membership.objects.filter(query).exclude(user__isnull=True).values_list("user_id", flat=True) memberships = Membership.objects.filter(query).exclude(user__isnull=True).values_list("user_id", flat=True)
if memberships: if memberships:
user_story_model = apps.get_model("userstories", "UserStory") user_story_model = apps.get_model("userstories", "UserStory")
queryset = qs_method(self.get_assigned_users_filter(user_story_model, memberships)) queryset = queryset.filter(
qs_method(Q(self.get_assigned_users_filter(user_story_model, memberships)))
)
return FilterBackend.filter_queryset(self, request, queryset, view) return FilterBackend.filter_queryset(self, request, queryset, view)