Skip to content

Commit f66ce84

Browse files
committed
OpenConceptLab/ocl_issues#2272 | API to get all expansions within the collection
1 parent d75afa7 commit f66ce84

File tree

4 files changed

+58
-2
lines changed

4 files changed

+58
-2
lines changed

core/collections/serializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,11 +546,13 @@ class ExpansionSerializer(ModelSerializer):
546546
summary = SerializerMethodField()
547547
url = CharField(source='uri', read_only=True)
548548
parameters = JSONField()
549+
collection_version = CharField(read_only=True, source='collection_version.version')
549550

550551
class Meta:
551552
model = Expansion
552553
fields = (
553554
'mnemonic', 'id', 'parameters', 'canonical_url', 'url', 'summary', 'is_processing',
555+
'collection_version'
554556
)
555557

556558
def __init__(self, *args, **kwargs):
@@ -587,12 +589,13 @@ class ExpansionDetailSerializer(ModelSerializer):
587589
explicit_source_versions = SourceVersionListSerializer(many=True, read_only=True)
588590
evaluated_collection_versions = CollectionVersionListSerializer(many=True, read_only=True)
589591
evaluated_source_versions = SourceVersionListSerializer(many=True, read_only=True)
592+
collection_version = CharField(read_only=True, source='collection_version.version')
590593

591594
class Meta:
592595
model = Expansion
593596
fields = (
594597
'mnemonic', 'id', 'parameters', 'canonical_url', 'url', 'summary', 'created_on', 'created_by',
595-
'is_processing', 'unresolved_repo_versions',
598+
'is_processing', 'unresolved_repo_versions', 'collection_version',
596599
'explicit_collection_versions', 'explicit_source_versions',
597600
'evaluated_collection_versions', 'evaluated_source_versions',
598601
)

core/collections/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@
121121
views.CollectionExtrasView.as_view(),
122122
name='collection-extras'
123123
),
124+
path(
125+
'<str:collection>/expansions/',
126+
views.CollectionExpansionsView.as_view(),
127+
name='expansion-list-collection'
128+
),
124129
path(
125130
'<str:collection>/<str:version>/',
126131
views.CollectionVersionRetrieveUpdateDestroyView.as_view(),

core/collections/views.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
SOURCE_MAPPINGS,
2626
UNKNOWN_REFERENCE_ADDED_TO_COLLECTION_FMT)
2727
from core.collections.documents import CollectionDocument
28-
from core.collections.models import Collection, CollectionReference
28+
from core.collections.models import Collection, CollectionReference, Expansion
2929
from core.collections.search import CollectionFacetedSearch
3030
from core.collections.serializers import (
3131
CollectionDetailSerializer, CollectionListSerializer,
@@ -807,6 +807,21 @@ def create(self, request, *args, **kwargs):
807807
headers=headers)
808808

809809

810+
class CollectionExpansionsView(CollectionBaseView, ListWithHeadersMixin):
811+
def get_serializer_class(self):
812+
if self.is_verbose():
813+
return ExpansionDetailSerializer
814+
return ExpansionSerializer
815+
816+
def get_queryset(self):
817+
instance = get_object_or_404(super().get_queryset())
818+
self.check_object_permissions(self.request, instance)
819+
return Expansion.objects.filter(collection_version_id__in=instance.versions.values_list('id', flat=True))
820+
821+
def get(self, request, *args, **kwargs):
822+
return self.list(request, *args, **kwargs)
823+
824+
810825
class CollectionVersionExpansionBaseView(CollectionBaseView):
811826
serializer_class = ExpansionSerializer
812827

core/integration_tests/tests_collections.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3857,3 +3857,36 @@ def test_get(self):
38573857
self.assertEqual(response.data[0]['mnemonic'], 'e1')
38583858
self.assertEqual(response.data[0]['parameters'], expansion.parameters)
38593859
self.assertEqual(response.data[0]['summary'], {'active_concepts': 0, 'active_mappings': 0})
3860+
3861+
3862+
class CollectionExpansionsViewTest(OCLAPITestCase):
3863+
def setUp(self):
3864+
super().setUp()
3865+
self.collection = OrganizationCollectionFactory()
3866+
self.token = self.collection.created_by.get_token()
3867+
3868+
def test_get(self):
3869+
collection_v1 = OrganizationCollectionFactory(
3870+
mnemonic=self.collection.mnemonic, organization=self.collection.organization, version='v1'
3871+
)
3872+
3873+
response = self.client.get(
3874+
self.collection.url + 'expansions/',
3875+
format='json'
3876+
)
3877+
3878+
self.assertEqual(response.status_code, 200)
3879+
self.assertEqual(response.data, [])
3880+
3881+
ExpansionFactory(mnemonic='e1-head', collection_version=self.collection)
3882+
ExpansionFactory(mnemonic='e1-v1', collection_version=collection_v1)
3883+
ExpansionFactory(mnemonic='e2-head', collection_version=self.collection)
3884+
3885+
response = self.client.get(
3886+
self.collection.url + 'expansions/',
3887+
format='json'
3888+
)
3889+
3890+
self.assertEqual(response.status_code, 200)
3891+
self.assertEqual(len(response.data), 3)
3892+
self.assertEqual([expansion['mnemonic'] for expansion in response.data], ['e2-head', 'e1-v1', 'e1-head'])

0 commit comments

Comments
 (0)