From c04e43d110cb81bd18975da9ff82847cce7bc290 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 24 Apr 2026 08:07:26 +0530 Subject: [PATCH] OpenConceptLab/ocl_issues#2485 | API to get project configurations --- core/map_projects/serializers.py | 23 +++++++++++++++------- core/map_projects/tests/tests.py | 33 ++++++++++++++++++++++++++++++++ core/map_projects/urls.py | 4 ++++ core/map_projects/views.py | 10 +++++++++- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/core/map_projects/serializers.py b/core/map_projects/serializers.py index ee85669a..9465eb1e 100644 --- a/core/map_projects/serializers.py +++ b/core/map_projects/serializers.py @@ -93,7 +93,16 @@ class Meta: ] -class MapProjectSerializer(serializers.ModelSerializer): +class MapProjectConfigurationsSerializer(serializers.ModelSerializer): + class Meta: + model = MapProject + fields = [ + 'id', 'url', 'algorithms', 'encoder_model', 'filters', 'include_retired', 'lookup_config', + 'score_configuration', 'target_repo_url' + ] + + +class MapProjectSerializer(MapProjectConfigurationsSerializer): created_by = CharField(source='created_by.username', read_only=True) updated_by = CharField(source='updated_by.username', read_only=True) owner = CharField(source='parent.mnemonic', read_only=True) @@ -105,13 +114,12 @@ class MapProjectSerializer(serializers.ModelSerializer): class Meta: model = MapProject - fields = [ - 'id', 'name', 'input_file_name', - 'created_by', 'updated_by', 'created_at', 'updated_at', 'url', 'is_active', + fields = MapProjectConfigurationsSerializer.Meta.fields + [ + 'name', 'input_file_name', + 'created_by', 'updated_by', 'created_at', 'updated_at', 'is_active', 'owner', 'owner_type', 'owner_url', 'public_access', - 'target_repo_url', 'summary', 'logs', 'include_retired', - 'score_configuration', 'filters', 'candidates', 'algorithms', 'lookup_config', 'analysis', - 'encoder_model' + 'summary', 'logs', 'include_retired', + 'candidates', 'analysis', ] def __init__(self, *args, **kwargs): @@ -138,6 +146,7 @@ class Meta: model = MapProject fields = MapProjectSerializer.Meta.fields + ['file_url', 'matches', 'columns'] + class MapProjectLogsSerializer(serializers.ModelSerializer): class Meta: model = MapProject diff --git a/core/map_projects/tests/tests.py b/core/map_projects/tests/tests.py index 390635a6..d4545552 100644 --- a/core/map_projects/tests/tests.py +++ b/core/map_projects/tests/tests.py @@ -19,6 +19,7 @@ def setUp(self): self.file = SimpleUploadedFile('input.csv', b'content', "application/csv") + class MapProjectListViewTest(MapProjectAbstractViewTest): @patch('core.services.storages.cloud.aws.S3.upload') def test_post(self, upload_mock): @@ -120,3 +121,35 @@ def test_put(self, upload_mock): self.assertEqual(len(response.data['columns']), 1) upload_mock.assert_called_once_with( key=f"map_projects/{response.data['id']}/input.csv", file_content=ANY) + + +class MapProjectConfigurationsViewTest(MapProjectAbstractViewTest): + def test_get(self): + project = MapProjectFactory( + organization=self.org, + algorithms=[{'name': 'exact-match', 'enabled': True}], + encoder_model='snowflake-arctic-embed-l-v2.0', + filters={'retired': False, 'class': ['LabSet']}, + include_retired=True, + lookup_config={'concepts': {'limit': 20}}, + score_configuration={'recommended': 95, 'available': 75}, + target_repo_url='/orgs/CIEL/sources/CIEL/', + ) + project.save() + + response = self.client.get( + f'/orgs/CIEL/map-projects/{project.id}/configurations/', + HTTP_AUTHORIZATION='Token ' + self.user.get_token(), + ) + + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data['id'], project.id) + self.assertIsNotNone(response.data['id']) + self.assertEqual(response.data['url'], f'/orgs/CIEL/map-projects/{project.id}/') + self.assertEqual(response.data['algorithms'], [{'name': 'exact-match', 'enabled': True}]) + self.assertEqual(response.data['encoder_model'], 'snowflake-arctic-embed-l-v2.0') + self.assertEqual(response.data['filters'], {'retired': False, 'class': ['LabSet']}) + self.assertTrue(response.data['include_retired']) + self.assertEqual(response.data['lookup_config'], {'concepts': {'limit': 20}}) + self.assertEqual(response.data['score_configuration'], {'recommended': 95, 'available': 75}) + self.assertEqual(response.data['target_repo_url'], '/orgs/CIEL/sources/CIEL/') diff --git a/core/map_projects/urls.py b/core/map_projects/urls.py index 5f68df07..1aa5a87f 100644 --- a/core/map_projects/urls.py +++ b/core/map_projects/urls.py @@ -7,4 +7,8 @@ path('/', views.MapProjectView.as_view(), name='map-project'), path('/summary/', views.MapProjectSummaryView.as_view(), name='map-project-summary'), path('/logs/', views.MapProjectLogsView.as_view(), name='map-project-logs'), + path( + '/configurations/', views.MapProjectConfigurationsView.as_view(), + name='map-project-configurations' + ), ] diff --git a/core/map_projects/views.py b/core/map_projects/views.py index 9569bcc1..0bdd1b9d 100644 --- a/core/map_projects/views.py +++ b/core/map_projects/views.py @@ -7,7 +7,8 @@ from core.common.views import BaseAPIView from core.map_projects.models import MapProject from core.map_projects.serializers import MapProjectCreateUpdateSerializer, \ - MapProjectDetailSerializer, MapProjectSummarySerializer, MapProjectLogsSerializer, MapProjectListSerializer + MapProjectDetailSerializer, MapProjectSummarySerializer, MapProjectLogsSerializer, MapProjectListSerializer, \ + MapProjectConfigurationsSerializer class MapProjectBaseView(BaseAPIView): @@ -61,6 +62,13 @@ def get_serializer_class(self): return self.serializer_class +class MapProjectConfigurationsView(MapProjectBaseView, RetrieveAPIView): + serializer_class = MapProjectConfigurationsSerializer + lookup_url_kwarg = 'project' + lookup_field = 'project' + pk_field = 'id' + + class MapProjectSummaryView(MapProjectBaseView, RetrieveAPIView): serializer_class = MapProjectSummarySerializer lookup_url_kwarg = 'project'