Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#846 | Concept/Mapping queryset (without sea…
Browse files Browse the repository at this point in the history
…rch) | refactoring and combining filters in criterion | removes duplicate results
  • Loading branch information
snyaggarwal committed Jul 19, 2021
1 parent 22496a0 commit 1f70e20
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 58 deletions.
20 changes: 20 additions & 0 deletions core/common/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,26 @@ def get_parent_and_owner_filters_from_uri(uri):

return compact_dict_by_values(filters)

@classmethod
def get_filter_by_container_criterion( # pylint: disable=too-many-arguments
cls, container_prefix, parent, org, user, container_version, is_latest_released, latest_released_version
):
criteria = cls.get_iexact_or_criteria('{}__mnemonic'.format(container_prefix), parent)

if not container_version and not is_latest_released:
criteria &= Q(**{'{}__version'.format(container_prefix): HEAD})
if user:
criteria &= cls.get_iexact_or_criteria('{}__user__username'.format(container_prefix), user)
if org:
criteria &= cls.get_iexact_or_criteria('{}__organization__mnemonic'.format(container_prefix), org)
if is_latest_released:
criteria &= cls.get_iexact_or_criteria(
'{}__version'.format(container_prefix), get(latest_released_version, 'version'))
if container_version and not is_latest_released:
criteria &= cls.get_iexact_or_criteria('{}__version'.format(container_prefix), container_version)

return criteria


class ConceptContainerExportMixin:
def get_object(self):
Expand Down
39 changes: 11 additions & 28 deletions core/concepts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,37 +337,20 @@ def get_base_queryset(cls, params): # pylint: disable=too-many-branches,too-man
return cls.objects.none()

if collection:
mnemonic_criteria = cls.get_iexact_or_criteria('collection_set__mnemonic', collection)
if not container_version and not is_latest_released:
queryset = queryset.filter(mnemonic_criteria, collection_set__version=HEAD)
else:
queryset = queryset.filter(mnemonic_criteria)
if user:
queryset = queryset.filter(cls.get_iexact_or_criteria('collection_set__user__username', user))
if org:
queryset = queryset.filter(cls.get_iexact_or_criteria('collection_set__organization__mnemonic', org))
if is_latest_released:
queryset = queryset.filter(
cls.get_iexact_or_criteria('collection_set__version', get(latest_released_version, 'version'))
queryset = queryset.filter(
cls.get_filter_by_container_criterion(
'collection_set', collection, org, user, container_version,
is_latest_released, latest_released_version,
)
if container_version and not is_latest_released:
queryset = queryset.filter(cls.get_iexact_or_criteria('collection_set__version', container_version))
)
if source:
mnemonic_criteria = cls.get_iexact_or_criteria('sources__mnemonic', source)
if not container_version and not is_latest_released:
queryset = queryset.filter(mnemonic_criteria, sources__version=HEAD)
else:
queryset = queryset.filter(mnemonic_criteria)
if user:
queryset = queryset.filter(cls.get_iexact_or_criteria('parent__user__username', user))
if org:
queryset = queryset.filter(cls.get_iexact_or_criteria('parent__organization__mnemonic', org))
if is_latest_released:
queryset = queryset.filter(
cls.get_iexact_or_criteria('sources__version', get(latest_released_version, 'version'))
queryset = queryset.filter(
cls.get_filter_by_container_criterion(
'sources', source, org, user, container_version,
is_latest_released, latest_released_version
)
if container_version and not is_latest_released:
queryset = queryset.filter(cls.get_iexact_or_criteria('sources__version', container_version))
)

if concept:
mnemonics = [concept, encode_string(concept, safe=' '), encode_string(concept, safe='+'),
encode_string(concept, safe='+%'), encode_string(concept, safe='% +'),
Expand Down
3 changes: 2 additions & 1 deletion core/concepts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ def get_serializer_class(self):
return ConceptListSerializer

def get_queryset(self):
is_latest_version = 'collection' not in self.kwargs and 'version' not in self.kwargs
is_latest_version = 'collection' not in self.kwargs and 'version' not in self.kwargs or \
get(self.kwargs, 'version') == HEAD
queryset = super().get_queryset()
if is_latest_version:
queryset = queryset.filter(is_latest_version=True)
Expand Down
38 changes: 10 additions & 28 deletions core/mappings/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -474,37 +474,19 @@ def get_base_queryset(cls, params): # pylint: disable=too-many-branches,too-man
return cls.objects.none()

if collection:
mnemonic_criteria = cls.get_iexact_or_criteria('collection_set__mnemonic', collection)
if not container_version and not is_latest_released:
queryset = queryset.filter(mnemonic_criteria, collection_set__version=HEAD)
else:
queryset = queryset.filter(mnemonic_criteria)
if user:
queryset = queryset.filter(cls.get_iexact_or_criteria('collection_set__user__username', user))
if org:
queryset = queryset.filter(cls.get_iexact_or_criteria('collection_set__organization__mnemonic', org))
if is_latest_released:
queryset = queryset.filter(
cls.get_iexact_or_criteria('collection_set__version', get(latest_released_version, 'version'))
queryset = queryset.filter(
cls.get_filter_by_container_criterion(
'collection_set', collection, org, user, container_version,
is_latest_released, latest_released_version,
)
if container_version and not is_latest_released:
queryset = queryset.filter(cls.get_iexact_or_criteria('collection_set__version', container_version))
)
if source:
mnemonic_criteria = cls.get_iexact_or_criteria('sources__mnemonic', source)
if not container_version and not is_latest_released:
queryset = queryset.filter(mnemonic_criteria, sources__version=HEAD)
else:
queryset = queryset.filter(mnemonic_criteria)
if user:
queryset = queryset.filter(cls.get_iexact_or_criteria('parent__user__username', user))
if org:
queryset = queryset.filter(cls.get_iexact_or_criteria('parent__organization__mnemonic', org))
if is_latest_released:
queryset = queryset.filter(
cls.get_iexact_or_criteria('sources__version', get(latest_released_version, 'version'))
queryset = queryset.filter(
cls.get_filter_by_container_criterion(
'sources', source, org, user, container_version,
is_latest_released, latest_released_version
)
if container_version and not is_latest_released:
queryset = queryset.filter(cls.get_iexact_or_criteria('sources__version', container_version))
)

if mapping:
queryset = queryset.filter(mnemonic__exact=mapping)
Expand Down
4 changes: 3 additions & 1 deletion core/mappings/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.http import QueryDict, Http404
from django.shortcuts import get_object_or_404
from drf_yasg.utils import swagger_auto_schema
from pydash import get
from rest_framework import status
from rest_framework.generics import DestroyAPIView, UpdateAPIView, RetrieveAPIView, ListAPIView
from rest_framework.mixins import CreateModelMixin
Expand Down Expand Up @@ -58,7 +59,8 @@ def get_serializer_class(self):
return MappingListSerializer

def get_queryset(self):
is_latest_version = 'collection' not in self.kwargs and 'version' not in self.kwargs
is_latest_version = 'collection' not in self.kwargs and 'version' not in self.kwargs or \
get(self.kwargs, 'version') == HEAD
queryset = super().get_queryset()
if is_latest_version:
queryset = queryset.filter(is_latest_version=True)
Expand Down

0 comments on commit 1f70e20

Please sign in to comment.