Skip to content
This repository was archived by the owner on Sep 16, 2022. It is now read-only.

Commit 92a4b96

Browse files
authored
Merge pull request #262 from CSCfi/CSCMETAX-400-allow-etsin-pid-override
CSCMETAX-400: [ADD] Datasets api: Add query param ?migration_override…
2 parents 8a816a2 + f8cec67 commit 92a4b96

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

src/metax_api/api/rest/base/serializers/catalog_record_serializer.py

+32-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from rest_framework.serializers import ValidationError
55

6-
from metax_api.models import CatalogRecord, DataCatalog, Contract
6+
from metax_api.models import CatalogRecord, DataCatalog, Contract, Common
77
from metax_api.services import CatalogRecordService as CRS, CommonService
88
from .common_serializer import CommonSerializer
99
from .contract_serializer import ContractSerializer
@@ -90,7 +90,28 @@ def update(self, instance, validated_data):
9090
return super(CatalogRecordSerializer, self).update(instance, validated_data)
9191

9292
def create(self, validated_data):
93-
return super(CatalogRecordSerializer, self).create(validated_data)
93+
if self._migration_override_requested():
94+
95+
# any custom stuff before create that my be necessary for migration purposes
96+
97+
if 'preferred_identifier' in validated_data['research_dataset']:
98+
# store pid, since it will be overwritten during create otherwise
99+
pid = validated_data['research_dataset']['preferred_identifier']
100+
101+
res = super().create(validated_data)
102+
103+
if self._migration_override_requested():
104+
105+
# any custom stuff after create that my be necessary for migration purposes
106+
107+
if 'preferred_identifier' in validated_data['research_dataset']:
108+
# save original pid provided by the requestor
109+
res.research_dataset['preferred_identifier'] = pid
110+
111+
# save, while bypassing normal save-related procedures in CatalogRecord model
112+
super(Common, res).save()
113+
114+
return res
94115

95116
def to_representation(self, instance):
96117
res = super(CatalogRecordSerializer, self).to_representation(instance)
@@ -341,6 +362,15 @@ def _get_data_catalog_relation(self, identifier_value):
341362
except DataCatalog.DoesNotExist:
342363
raise ValidationError({ 'data_catalog': ['identifier %s not found' % str(identifier_value)]})
343364

365+
def _migration_override_requested(self):
366+
"""
367+
Check presence of query parameter ?migration_override, which enables some specific actions during
368+
the request, at this point useful only for migration operations.
369+
"""
370+
if 'request' in self.context:
371+
return CommonService.get_boolean_query_param(self.context['request'], 'migration_override')
372+
return False
373+
344374
def _set_dataset_schema(self):
345375
data_catalog = None
346376
if self._operation_is_create():

src/metax_api/models/catalog_record.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,9 @@ def save(self, *args, **kwargs):
292292
self._post_create_operations()
293293
_logger.info(
294294
'Created a new <CatalogRecord id: %d, '
295-
'metadata_version_identifier: %s, '
295+
'identifier: %s, '
296296
'preferred_identifier: %s >'
297-
% (self.id, self.metadata_version_identifier, self.preferred_identifier)
297+
% (self.id, self.identifier, self.preferred_identifier)
298298
)
299299
else:
300300
self._pre_update_operations()

src/metax_api/tests/api/rest/base/views/datasets/write.py

+12
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,18 @@ def test_create_catalog_record_editor_field_is_optional(self):
289289
response = self.client.put('/rest/datasets/%d' % new['id'], new, format="json")
290290
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
291291

292+
def test_parameter_migration_override_preferred_identifier_when_creating(self):
293+
"""
294+
Normally, when saving to att/ida catalogs, providing a custom preferred_identifier is not
295+
permitted. Using the optional query parameter ?migration_override=bool a custom preferred_identifier
296+
can be passed.
297+
"""
298+
custom_pid = 'custom-pid-value'
299+
self.cr_test_data['research_dataset']['preferred_identifier'] = custom_pid
300+
response = self.client.post('/rest/datasets?migration_override', self.cr_test_data, format="json")
301+
self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data)
302+
self.assertEqual(response.data['research_dataset']['preferred_identifier'], custom_pid)
303+
292304

293305
class CatalogRecordApiWriteIdentifierUniqueness(CatalogRecordApiWriteCommon):
294306
"""

0 commit comments

Comments
 (0)