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

Commit

Permalink
Merge pull request #262 from CSCfi/CSCMETAX-400-allow-etsin-pid-override
Browse files Browse the repository at this point in the history
CSCMETAX-400: [ADD] Datasets api: Add query param ?migration_override…
  • Loading branch information
junsk1 authored May 30, 2018
2 parents 8a816a2 + f8cec67 commit 92a4b96
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from rest_framework.serializers import ValidationError

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

def create(self, validated_data):
return super(CatalogRecordSerializer, self).create(validated_data)
if self._migration_override_requested():

# any custom stuff before create that my be necessary for migration purposes

if 'preferred_identifier' in validated_data['research_dataset']:
# store pid, since it will be overwritten during create otherwise
pid = validated_data['research_dataset']['preferred_identifier']

res = super().create(validated_data)

if self._migration_override_requested():

# any custom stuff after create that my be necessary for migration purposes

if 'preferred_identifier' in validated_data['research_dataset']:
# save original pid provided by the requestor
res.research_dataset['preferred_identifier'] = pid

# save, while bypassing normal save-related procedures in CatalogRecord model
super(Common, res).save()

return res

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

def _migration_override_requested(self):
"""
Check presence of query parameter ?migration_override, which enables some specific actions during
the request, at this point useful only for migration operations.
"""
if 'request' in self.context:
return CommonService.get_boolean_query_param(self.context['request'], 'migration_override')
return False

def _set_dataset_schema(self):
data_catalog = None
if self._operation_is_create():
Expand Down
4 changes: 2 additions & 2 deletions src/metax_api/models/catalog_record.py
Original file line number Diff line number Diff line change
Expand Up @@ -292,9 +292,9 @@ def save(self, *args, **kwargs):
self._post_create_operations()
_logger.info(
'Created a new <CatalogRecord id: %d, '
'metadata_version_identifier: %s, '
'identifier: %s, '
'preferred_identifier: %s >'
% (self.id, self.metadata_version_identifier, self.preferred_identifier)
% (self.id, self.identifier, self.preferred_identifier)
)
else:
self._pre_update_operations()
Expand Down
12 changes: 12 additions & 0 deletions src/metax_api/tests/api/rest/base/views/datasets/write.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,18 @@ def test_create_catalog_record_editor_field_is_optional(self):
response = self.client.put('/rest/datasets/%d' % new['id'], new, format="json")
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)

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


class CatalogRecordApiWriteIdentifierUniqueness(CatalogRecordApiWriteCommon):
"""
Expand Down

0 comments on commit 92a4b96

Please sign in to comment.