code refactor

stable
Héctor Fernández Cascallar 2019-01-17 17:02:26 +01:00 committed by Alex Hermida
parent 2bdd652ea7
commit e736846562
1 changed files with 35 additions and 64 deletions

View File

@ -401,11 +401,7 @@ class BaseRelatedFieldsFilter(FilterBackend):
return list(values) return list(values)
def _get_queryparams(self, params, mode=''): def _get_queryparams(self, params, mode=''):
if mode == 'exclude': param_name = self.exclude_param_name if mode == 'exclude' else self.param_name or self.filter_name
param_name = self.exclude_param_name
else:
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)
@ -415,27 +411,20 @@ class BaseRelatedFieldsFilter(FilterBackend):
qs_isnull_kwargs = {"{}__isnull".format(self.filter_name): True} qs_isnull_kwargs = {"{}__isnull".format(self.filter_name): True}
return Q(**qs_in_kwargs) | Q(**qs_isnull_kwargs) return Q(**qs_in_kwargs) | Q(**qs_isnull_kwargs)
else: else:
return {"{}__in".format(self.filter_name): value} return Q(**{"{}__in".format(self.filter_name): value})
return None return None
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
query = self._get_queryparams(request.QUERY_PARAMS) operations = {
exclude_query = None "filter": queryset.filter,
if self.exclude_param_name: "exclude": queryset.exclude,
exclude_query = self._get_queryparams(request.QUERY_PARAMS, mode='exclude') }
if query: for mode, qs_method in operations.items():
if isinstance(query, dict): query = self._get_queryparams(request.QUERY_PARAMS, mode=mode)
queryset = queryset.filter(**query) if query:
else: queryset = qs_method(query)
queryset = queryset.filter(query)
if exclude_query:
if isinstance(exclude_query, dict):
queryset = queryset.exclude(**exclude_query)
else:
queryset = queryset.exclude(exclude_query)
return super().filter_queryset(request, queryset, view) return super().filter_queryset(request, queryset, view)
@ -455,11 +444,7 @@ class AssignedUsersFilter(FilterModelAssignedUsers, BaseRelatedFieldsFilter):
exclude_param_name = 'exclude_assigned_users' exclude_param_name = 'exclude_assigned_users'
def _get_queryparams(self, params, mode=''): def _get_queryparams(self, params, mode=''):
if mode == 'exclude': param_name = self.exclude_param_name if mode == 'exclude' else self.param_name or self.filter_name
param_name = self.exclude_param_name
else:
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)
@ -487,7 +472,6 @@ class StatusesFilter(BaseRelatedFieldsFilter):
exclude_param_name = 'exclude_status' exclude_param_name = 'exclude_status'
class IssueTypesFilter(BaseRelatedFieldsFilter): class IssueTypesFilter(BaseRelatedFieldsFilter):
filter_name = 'type' filter_name = 'type'
param_name = 'type' param_name = 'type'
@ -516,10 +500,8 @@ class TagsFilter(FilterBackend):
self.exclude_param_name = exclude_param_name self.exclude_param_name = exclude_param_name
def _get_tags_queryparams(self, params, mode=''): def _get_tags_queryparams(self, params, mode=''):
if mode == 'exclude': param_name = self.exclude_param_name if mode == "exclude" else self.filter_name
tags = params.get(self.exclude_param_name, None) tags = params.get(param_name, None)
else:
tags = params.get(self.filter_name, None)
if tags: if tags:
return tags.split(",") return tags.split(",")
@ -527,14 +509,15 @@ class TagsFilter(FilterBackend):
return None return None
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
query_tags = self._get_tags_queryparams(request.QUERY_PARAMS) operations = {
exclude_query_tags = self._get_tags_queryparams(request.QUERY_PARAMS, mode='exclude') "filter": queryset.filter,
"exclude": queryset.exclude,
}
if query_tags: for mode, qs_method in operations.items():
queryset = queryset.filter(tags__contains=query_tags) query = self._get_tags_queryparams(request.QUERY_PARAMS, mode=mode)
if query:
if exclude_query_tags: queryset = qs_method(tags__contains=query)
queryset = queryset.exclude(tags__contains=exclude_query_tags)
return super().filter_queryset(request, queryset, view) return super().filter_queryset(request, queryset, view)
@ -677,25 +660,18 @@ class RoleFilter(BaseRelatedFieldsFilter):
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
Membership = apps.get_model('projects', 'Membership') Membership = apps.get_model('projects', 'Membership')
query = self._get_queryparams(request.QUERY_PARAMS)
exclude_query = self._get_queryparams(request.QUERY_PARAMS, mode='exclude')
if query: operations = {
if isinstance(query, dict): "filter": queryset.filter,
memberships = Membership.objects.filter(**query).values_list("user_id", flat=True) "exclude": queryset.exclude,
queryset = queryset.filter(assigned_to__in=memberships) }
else:
for mode, qs_method in operations.items():
query = self._get_queryparams(request.QUERY_PARAMS, mode=mode)
if query:
memberships = Membership.objects.filter(query).values_list("user_id", flat=True) memberships = Membership.objects.filter(query).values_list("user_id", flat=True)
if memberships: if memberships:
queryset = queryset.filter(assigned_to__in=memberships) queryset = qs_method(assigned_to__in=memberships)
if exclude_query:
if isinstance(exclude_query, dict):
memberships = Membership.objects.filter(**exclude_query).values_list("user_id", flat=True)
else:
memberships = Membership.objects.filter(exclude_query).values_list("user_id", flat=True)
if memberships:
queryset = queryset.exclude(assigned_to__in=memberships)
return FilterBackend.filter_queryset(self, request, queryset, view) return FilterBackend.filter_queryset(self, request, queryset, view)
@ -715,15 +691,10 @@ class UserStoriesRoleFilter(FilterModelAssignedUsers, BaseRelatedFieldsFilter):
for mode, qs_method in operations.items(): for mode, qs_method in operations.items():
query = self._get_queryparams(request.QUERY_PARAMS, mode=mode) query = self._get_queryparams(request.QUERY_PARAMS, mode=mode)
if not query: if query:
continue
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) memberships = Membership.objects.filter(query).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 = qs_method(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)