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 )
2727from core .collections .documents import CollectionDocument
2828from core .collections .models import Collection , CollectionReference , Expansion
2929from 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+
385413class 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
0 commit comments