Skip to content

Commit a5c9fbf

Browse files
authored
Merge pull request #8765 from erinspace/feature/recursive_wb_move_copy_hooks
Recursively update most recent fileversion for folder contents [PLAT-1118]
2 parents cb53475 + 6c7e2be commit a5c9fbf

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

addons/osfstorage/models.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,16 @@ def delete(self, user=None, parent=None, **kwargs):
166166
self._materialized_path = self.materialized_path
167167
return super(OsfStorageFileNode, self).delete(user=user, parent=parent) if self._check_delete_allowed() else None
168168

169+
def update_region_from_latest_version(self, destination_parent):
170+
raise NotImplementedError
171+
169172
def move_under(self, destination_parent, name=None):
170173
if self.is_preprint_primary:
171174
if self.target != destination_parent.target or self.provider != destination_parent.provider:
172175
raise exceptions.FileNodeIsPrimaryFile()
173176
if self.is_checked_out:
174177
raise exceptions.FileNodeCheckedOutError()
175-
most_recent_fileversion = self.versions.select_related('region').order_by('-created').first()
176-
if most_recent_fileversion and most_recent_fileversion.region != destination_parent.target.osfstorage_region:
177-
most_recent_fileversion.region = destination_parent.target.osfstorage_region
178-
most_recent_fileversion.save()
178+
self.update_region_from_latest_version(destination_parent)
179179
return super(OsfStorageFileNode, self).move_under(destination_parent, name)
180180

181181
def check_in_or_out(self, user, checkout, save=False):
@@ -293,6 +293,12 @@ def serialize(self, include_full=None, version=None):
293293
})
294294
return ret
295295

296+
def update_region_from_latest_version(self, destination_parent):
297+
most_recent_fileversion = self.versions.select_related('region').order_by('-created').first()
298+
if most_recent_fileversion and most_recent_fileversion.region != destination_parent.target.osfstorage_region:
299+
most_recent_fileversion.region = destination_parent.target.osfstorage_region
300+
most_recent_fileversion.save()
301+
296302
def create_version(self, creator, location, metadata=None):
297303
latest_version = self.get_version()
298304
version = FileVersion(identifier=self.versions.count() + 1, creator=creator, location=location)
@@ -451,6 +457,9 @@ def serialize(self, include_full=False, version=None):
451457
ret['fullPath'] = self.materialized_path
452458
return ret
453459

460+
def update_region_from_latest_version(self, destination_parent):
461+
for child in self.children.all().prefetch_related('versions'):
462+
child.update_region_from_latest_version(destination_parent)
454463

455464
class Region(models.Model):
456465
_id = models.CharField(max_length=255, db_index=True)

addons/osfstorage/tests/test_models.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,30 @@ def test_move_nested(self):
334334
assert_equal(new_project, move_to.target)
335335
assert_equal(new_project, child.target)
336336

337+
def test_move_nested_between_regions(self):
338+
canada = RegionFactory()
339+
new_component = NodeFactory(parent=self.project)
340+
component_node_settings = new_component.get_addon('osfstorage')
341+
component_node_settings.region = canada
342+
component_node_settings.save()
343+
344+
move_to = component_node_settings.get_root()
345+
to_move = self.node_settings.get_root().append_folder('Aaah').append_folder('Woop')
346+
child = to_move.append_file('There it is')
347+
348+
for _ in range(2):
349+
version = factories.FileVersionFactory(region=self.node_settings.region)
350+
child.versions.add(version)
351+
child.save()
352+
353+
moved = to_move.move_under(move_to)
354+
child.reload()
355+
356+
assert new_component == child.target
357+
versions = child.versions.order_by('-created')
358+
assert versions.first().region == component_node_settings.region
359+
assert versions.last().region == self.node_settings.region
360+
337361
def test_copy_rename(self):
338362
to_copy = self.node_settings.get_root().append_file('Carp')
339363
copy_to = self.node_settings.get_root().append_folder('Cloud')

0 commit comments

Comments
 (0)