Skip to content

Commit 4001072

Browse files
committed
OpenConceptLab/ocl_issues#2273 | Collection References filters
1 parent e9a96fd commit 4001072

File tree

3 files changed

+35
-9
lines changed

3 files changed

+35
-9
lines changed

core/collections/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
VERSION_ALREADY_EXISTS = "Collection version '{}' already exist."
2424
SOURCE_MAPPINGS = 'sourcemappings'
2525
SOURCE_TO_CONCEPTS = 'sourcetoconcepts'
26-
TRANSFORM_TO_RESOURCE_VERSIONS = 'resourceversions'
26+
TRANSFORM_TO_RESOURCE_VERSIONS = 'resourceversions' # intentional
2727
TRANSFORM_TO_EXTENSIONAL = 'extensional'
2828

2929
CONCEPT_REFERENCE_TYPE = 'concepts'

core/collections/views.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
MAPPING_VERSION_ADDED_TO_COLLECTION, CONCEPT_ADDED_TO_COLLECTION_FMT, MAPPING_ADDED_TO_COLLECTION_FMT,
2424
DELETE_FAILURE, DELETE_SUCCESS, NO_MATCH, VERSION_ALREADY_EXISTS,
2525
SOURCE_MAPPINGS,
26-
UNKNOWN_REFERENCE_ADDED_TO_COLLECTION_FMT)
26+
UNKNOWN_REFERENCE_ADDED_TO_COLLECTION_FMT, TRANSFORM_TO_RESOURCE_VERSIONS, TRANSFORM_TO_EXTENSIONAL)
2727
from core.collections.documents import CollectionDocument
2828
from core.collections.models import Collection, CollectionReference, Expansion
2929
from core.collections.search import CollectionFacetedSearch
@@ -382,9 +382,37 @@ def get_queryset(self):
382382
return super().get_queryset().mappings
383383

384384

385+
class CollectionReferencesMixin:
386+
def apply_filters(self, queryset):
387+
criterion = []
388+
for key, value in self.request.query_params.dict().items():
389+
if key == 'resource_versioned':
390+
criterion.append(Q(resource_versioned__isnull=not (value.lower() == 'true')))
391+
elif key == 'repo_versioned':
392+
if value.lower() in ['true', 'false']:
393+
criterion.append(Q(version__isnull=not (value.lower() == 'true')))
394+
elif isinstance(value, str):
395+
criterion.append(Q(version__iexact=value))
396+
elif key == 'cascade':
397+
if value.lower() in ['true', 'false']:
398+
criterion.append(Q(cascade__isnull=not (value.lower() == 'true')))
399+
elif isinstance(value, str):
400+
criterion.append(Q(cascade__iexact=value) | Q(cascade__method__iexact=value))
401+
else:
402+
criterion.append(Q(cascade=value))
403+
elif key == 'extensional':
404+
criterion.append(Q(transform=TRANSFORM_TO_RESOURCE_VERSIONS))
405+
elif key == 'intensional':
406+
criterion.append(Q(transform=TRANSFORM_TO_EXTENSIONAL))
407+
if criterion:
408+
for criteria in criterion:
409+
queryset = queryset.filter(criteria)
410+
return queryset
411+
412+
385413
class CollectionReferencesView(
386414
CollectionBaseView, ConceptDictionaryUpdateMixin, RetrieveAPIView, DestroyAPIView, ListWithHeadersMixin,
387-
TaskMixin
415+
TaskMixin, CollectionReferencesMixin
388416
):
389417
def get_serializer_class(self):
390418
if self.is_verbose():
@@ -410,10 +438,7 @@ def get_object(self, queryset=None):
410438
def get_queryset(self):
411439
search_query = self.request.query_params.get('q', '')
412440
sort = self.request.query_params.get('search_sort', 'ASC')
413-
if sort == 'ASC':
414-
sort = ''
415-
else:
416-
sort = '-'
441+
sort = '' if sort == 'ASC' else '-'
417442

418443
instance = self.get_object()
419444
queryset = instance.references
@@ -423,7 +448,7 @@ def get_queryset(self):
423448
else:
424449
queryset = queryset.order_by('-id')
425450

426-
return queryset
451+
return self.apply_filters(queryset)
427452

428453
def retrieve(self, request, *args, **kwargs):
429454
return self.list(request, *args, **kwargs)
@@ -611,7 +636,7 @@ def post(self, request, **kwargs): # pylint: disable=unused-argument
611636
return self.get_preview()
612637

613638

614-
class CollectionVersionReferencesView(CollectionVersionBaseView, ListWithHeadersMixin):
639+
class CollectionVersionReferencesView(CollectionVersionBaseView, ListWithHeadersMixin, CollectionReferencesMixin):
615640
def get_serializer_class(self):
616641
if self.is_verbose():
617642
return CollectionReferenceDetailSerializer
@@ -625,6 +650,7 @@ def get(self, request, *args, **kwargs):
625650
if not object_version:
626651
raise Http404()
627652
references = object_version.references.filter(expression__icontains=search_query)
653+
references = self.apply_filters(references)
628654
self.object_list = references if sort == 'ASC' else list(reversed(references))
629655
return self.list(request, *args, **kwargs)
630656

core/services/analytics_event_emitter.py

Whitespace-only changes.

0 commit comments

Comments
 (0)