@@ -788,7 +788,14 @@ def _pre_update_operations(self):
788
788
'back to 0.' % self .preservation_state
789
789
]})
790
790
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 ()
792
799
793
800
else :
794
801
if self .preservation_state in (
@@ -822,6 +829,29 @@ def _pre_update_operations(self):
822
829
if self .catalog_is_harvested () and self .field_changed ('research_dataset.preferred_identifier' ):
823
830
self ._handle_preferred_identifier_changed ()
824
831
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
+
825
855
def _calculate_total_ida_byte_size (self ):
826
856
rd = self .research_dataset
827
857
if 'files' in rd or 'directories' in rd :
@@ -964,6 +994,7 @@ def _files_changed(self):
964
994
temp_record .id = None
965
995
temp_record .next_dataset_version = None
966
996
temp_record .previous_dataset_version = None
997
+ temp_record .dataset_version_set = None
967
998
temp_record .identifier = generate_identifier ()
968
999
temp_record .research_dataset ['metadata_version_identifier' ] = generate_identifier ()
969
1000
super (Common , temp_record ).save ()
@@ -1035,7 +1066,7 @@ def _create_new_dataset_version(self):
1035
1066
new_version .service_created = old_version .service_modified or old_version .service_created
1036
1067
new_version .service_modified = None
1037
1068
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 )
1039
1070
1040
1071
# note: copying research_dataset from the currently open instance 'old_version',
1041
1072
# contains the new field data from the request. this effectively transfers
0 commit comments