manager: keep some page attributes when snapshot restoration (#45243)

This commit is contained in:
Lauréline Guérin 2020-07-23 10:06:52 +02:00
parent 04ad825760
commit d62dc92037
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 60 additions and 2 deletions

View File

@ -524,9 +524,17 @@ class PageSnapshot(models.Model):
return page
def restore(self):
json_page = self.serialization
# keep current page order
json_page['fields']['order'] = self.page.order
# and current parent
json_page['fields']['parent'] = [self.page.parent.slug] if self.page.parent else None
# and current exclude_from_navigation value
json_page['fields']['exclude_from_navigation'] = self.page.exclude_from_navigation
# restore snapshot
with transaction.atomic():
page = Page.load_serialized_page(self.serialization)
page.load_serialized_cells(self.serialization['cells'])
page = Page.load_serialized_page(json_page)
page.load_serialized_cells(json_page['cells'])
return page

View File

@ -1732,6 +1732,56 @@ def test_page_versionning(app, admin_user):
app.get('/manage/pages/0/history', status=404)
def test_restore_page_attributes(app):
page1 = Page.objects.create(title='One', slug='one')
page2 = Page.objects.create(title='Two', slug='two', parent=page1, exclude_from_navigation=False)
page3 = Page.objects.create(title='Three', slug='three')
page4 = Page.objects.create(title='Four', slug='four')
assert page1.order == 1
assert page2.order == 2
assert page3.order == 3
assert page4.order == 4
PageSnapshot.take(page2)
snapshot = PageSnapshot.objects.latest('pk')
# move page2, remove page 1
page2.parent = page4
page2.order = 3
page2.save()
page1.delete()
page3.order = 1
page3.save()
page4.order = 2
page4.save()
assert page3.order == 1
assert page4.order == 2
assert page2.order == 3
# restore snapshot
page2 = snapshot.restore()
# check some attributes
assert page2.order == 3
assert page2.parent == page4
assert page2.exclude_from_navigation is False
PageSnapshot.take(page2)
snapshot = PageSnapshot.objects.latest('pk')
# exclude page2 from navigation
page2.exclude_from_navigation = True
page2.save()
# restore snapshot
page2 = snapshot.restore()
# check exclude_from_navigation param
assert page2.exclude_from_navigation is True
def test_view_old_snapshot(app, admin_user):
page = Page.objects.create(title='One', slug='one')
PageSnapshot.take(page)