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

Commit 224efb6

Browse files
authored
Merge pull request #260 from CSCfi/CSCMETAX-398-allow-file-uptade-from-0-to-n
CSCMETAX-398: [ADD] Datasets api: Allow the first addition of files t…
2 parents a46bc27 + daf89b4 commit 224efb6

File tree

2 files changed

+75
-2
lines changed

2 files changed

+75
-2
lines changed

src/metax_api/models/catalog_record.py

+33-2
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,14 @@ def _pre_update_operations(self):
788788
'back to 0.' % self.preservation_state
789789
]})
790790

791-
self._create_new_dataset_version()
791+
if self._files_added_for_first_time():
792+
# first update from 0 to n files should not create a dataset version. all later updates
793+
# will create new dataset versions normally.
794+
self.files.add(*self._get_dataset_selected_file_ids())
795+
self._calculate_total_ida_byte_size()
796+
self._handle_metadata_versioning()
797+
else:
798+
self._create_new_dataset_version()
792799

793800
else:
794801
if self.preservation_state in (
@@ -822,6 +829,29 @@ def _pre_update_operations(self):
822829
if self.catalog_is_harvested() and self.field_changed('research_dataset.preferred_identifier'):
823830
self._handle_preferred_identifier_changed()
824831

832+
def _files_added_for_first_time(self):
833+
"""
834+
Find out if this update is the first time files are being added/changed since the dataset's creation.
835+
"""
836+
if self.files.exists():
837+
# current version already has files
838+
return False
839+
840+
if self.dataset_version_set.records.count() > 1:
841+
# for versioned catalogs, when a record is first created, the record is appended
842+
# to dataset_version_set. more than one dataset versions existing implies files
843+
# have changed already in the past.
844+
return False
845+
846+
metadata_versions_with_files_exist = ResearchDatasetVersion.objects.filter(
847+
Q(Q(research_dataset__files__isnull=False) | Q(research_dataset__directories__isnull=False)),
848+
catalog_record_id=self.id) \
849+
.exists()
850+
851+
# metadata_versions_with_files_exist == True implies this "0 to n" update without
852+
# creating a new dataset version already occurred once
853+
return not metadata_versions_with_files_exist
854+
825855
def _calculate_total_ida_byte_size(self):
826856
rd = self.research_dataset
827857
if 'files' in rd or 'directories' in rd:
@@ -964,6 +994,7 @@ def _files_changed(self):
964994
temp_record.id = None
965995
temp_record.next_dataset_version = None
966996
temp_record.previous_dataset_version = None
997+
temp_record.dataset_version_set = None
967998
temp_record.identifier = generate_identifier()
968999
temp_record.research_dataset['metadata_version_identifier'] = generate_identifier()
9691000
super(Common, temp_record).save()
@@ -1035,7 +1066,7 @@ def _create_new_dataset_version(self):
10351066
new_version.service_created = old_version.service_modified or old_version.service_created
10361067
new_version.service_modified = None
10371068
new_version.alternate_record_set = None
1038-
new_version.dataset_version_set.records.add(new_version)
1069+
old_version.dataset_version_set.records.add(new_version)
10391070

10401071
# note: copying research_dataset from the currently open instance 'old_version',
10411072
# contains the new field data from the request. this effectively transfers

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

+42
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,48 @@ class CatalogRecordApiWriteDatasetVersioning(CatalogRecordApiWriteCommon):
13761376
Catalogs 1-2 should have dataset_versioning=True, while the rest should not.
13771377
"""
13781378

1379+
def test_update_from_0_to_n_files_does_not_create_new_version(self):
1380+
"""
1381+
The FIRST update from 0 to n files in a dataset should be permitted
1382+
without creating a new dataset version.
1383+
"""
1384+
data = self.client.get('/rest/datasets/1', format="json").data
1385+
data.pop('id')
1386+
data.pop('identifier')
1387+
data['research_dataset'].pop('preferred_identifier', None)
1388+
files = data['research_dataset'].pop('files', None)
1389+
data['research_dataset'].pop('directories', None)
1390+
self.assertEqual(isinstance(files, list), True)
1391+
1392+
# create test record
1393+
response = self.client.post('/rest/datasets', data, format="json")
1394+
self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data)
1395+
1396+
# modify a few times to create metadata versions
1397+
data = response.data
1398+
data['research_dataset']['title']['en'] = 'updated'
1399+
data = self.client.put('/rest/datasets/%d' % data['id'], data, format="json").data
1400+
data['research_dataset']['title']['en'] = 'updated again'
1401+
data = self.client.put('/rest/datasets/%d' % data['id'], data, format="json").data
1402+
1403+
# add files for the first time - should not create a new dataset version
1404+
data['research_dataset']['files'] = files
1405+
response = self.client.put('/rest/datasets/%d' % data['id'], data, format="json")
1406+
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
1407+
self.assertEqual('new_version_created' in response.data, False)
1408+
1409+
# remove files again... a new version is created normally
1410+
files = data['research_dataset'].pop('files')
1411+
response = self.client.put('/rest/datasets/%d' % data['id'], data, format="json")
1412+
new_version = self.get_next_version(response.data)
1413+
1414+
# ...and put the files back. this is another 0->n files update. this time
1415+
# should normally create new dataset version.
1416+
new_version['research_dataset']['files'] = files
1417+
response = self.client.put('/rest/datasets/%d' % new_version['id'], new_version, format="json")
1418+
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
1419+
self.assertEqual('new_version_created' in response.data, True)
1420+
13791421
def test_update_to_non_versioning_catalog_does_not_create_version(self):
13801422
self._set_cr_to_catalog(pk=self.pk, dc=3)
13811423
response = self._get_and_update_title(self.pk)

0 commit comments

Comments
 (0)