From 4f6cf66161268e8f8d48de516ebe5378a466e383 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Wed, 15 Apr 2026 13:19:48 +0530 Subject: [PATCH] OpenConceptLab/ocl_issues#1854 | References API can conditionally include resolved repo versions --- core/collections/models.py | 12 ++++++++++++ core/collections/serializers.py | 29 ++++++++++++++++++++++++++--- core/collections/views.py | 9 +-------- core/common/constants.py | 1 + 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/core/collections/models.py b/core/collections/models.py index e1fd667c..a0cf8f57 100644 --- a/core/collections/models.py +++ b/core/collections/models.py @@ -1108,6 +1108,18 @@ def get_related_uris(self): def translation(self): return CollectionReferenceTranslator(self).translate() + def get_resolved_repo_versions_serialized(self): + system_version = self.resolve_system_version + valueset_versions = self.resolve_valueset_versions + data = [] + if system_version: + from core.sources.serializers import SourceVersionListSerializer + data.append(SourceVersionListSerializer(system_version).data) + if valueset_versions: + from core.collections.serializers import CollectionVersionListSerializer + data += CollectionVersionListSerializer(valueset_versions, many=True).data + return data + def default_expansion_parameters(): return { diff --git a/core/collections/serializers.py b/core/collections/serializers.py index 239bd0eb..a0d58958 100644 --- a/core/collections/serializers.py +++ b/core/collections/serializers.py @@ -11,7 +11,7 @@ from core.client_configs.serializers import ClientConfigSerializer from core.collections.models import Collection, CollectionReference, Expansion from core.common.constants import HEAD, DEFAULT_ACCESS_TYPE, NAMESPACE_REGEX, ACCESS_TYPE_CHOICES, INCLUDE_SUMMARY, \ - INCLUDE_CLIENT_CONFIGS, INVALID_EXPANSION_URL, INCLUDE_STATES, INCLUDE_TASKS + INCLUDE_CLIENT_CONFIGS, INVALID_EXPANSION_URL, INCLUDE_STATES, INCLUDE_TASKS, INCLUDE_RESOLVED_REPO_VERSIONS from core.common.serializers import AbstractRepoResourcesSerializer, AbstractResourceSerializer from core.common.utils import get_truthy_values from core.orgs.models import Organization @@ -19,7 +19,6 @@ from core.sources.serializers import SourceVersionListSerializer from core.users.models import UserProfile - TRUTHY = get_truthy_values() @@ -514,10 +513,34 @@ class CollectionReferenceSerializer(ModelSerializer): reference_type = CharField(read_only=True) uuid = CharField(source='id', read_only=True) type = CharField(source='resource_type', read_only=True) + resolved_repo_versions = SerializerMethodField() class Meta: model = CollectionReference - fields = ('expression', 'reference_type', 'id', 'last_resolved_at', 'uri', 'uuid', 'include', 'type') + fields = ( + 'expression', 'reference_type', 'id', 'last_resolved_at', 'uri', 'uuid', 'include', 'type', + 'resolved_repo_versions' + ) + + def __init__(self, *args, **kwargs): + params = get(kwargs, 'context.request.query_params') + self.include_resolved_repo_versions = False + if params: + self.query_params = params.dict() + self.include_resolved_repo_versions = self.query_params.get(INCLUDE_RESOLVED_REPO_VERSIONS) in TRUTHY + + try: + if not self.include_resolved_repo_versions: + self.fields.pop('resolved_repo_versions', None) + except: # pylint: disable=bare-except + pass + + super().__init__(*args, **kwargs) + + def get_resolved_repo_versions(self, obj): + if not self.include_resolved_repo_versions: + return None + return obj.get_resolved_repo_versions_serialized() class CollectionReferenceDetailSerializer(CollectionReferenceSerializer): diff --git a/core/collections/views.py b/core/collections/views.py index 3edca3a4..faec5a29 100644 --- a/core/collections/views.py +++ b/core/collections/views.py @@ -344,14 +344,7 @@ def get_serializer_class(self): def get(self, request, *args, **kwargs): reference = self.get_queryset() - system_version = reference.resolve_system_version - valueset_versions = reference.resolve_valueset_versions - data = [] - if system_version: - from core.sources.serializers import SourceVersionListSerializer - data.append(SourceVersionListSerializer(system_version).data) - if valueset_versions: - data += CollectionVersionListSerializer(valueset_versions, many=True).data + data = reference.get_resolved_repo_versions_serialized() return Response(data) diff --git a/core/common/constants.py b/core/common/constants.py index 6a7a44d2..70bfc814 100644 --- a/core/common/constants.py +++ b/core/common/constants.py @@ -69,6 +69,7 @@ INCLUDE_INACTIVE = 'includeInactive' INCLUDE_SOURCE_VERSIONS = 'includeSourceVersions' INCLUDE_COLLECTION_VERSIONS = 'includeCollectionVersions' +INCLUDE_RESOLVED_REPO_VERSIONS = 'includeResolvedRepoVersions' MAPPING_LOOKUP_CONCEPTS = 'lookupConcepts' MAPPING_LOOKUP_FROM_CONCEPT = 'lookupFromConcept' MAPPING_LOOKUP_TO_CONCEPT = 'lookupToConcept'