From c5678518a8f066c9f0b329c590d51a3a1bd3f931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20S=C3=A9chet?= Date: Fri, 6 May 2022 12:04:28 +0200 Subject: [PATCH] manager: add link to export page snapshot (#62023) --- .../manager/templates/combo/page_history.html | 1 + combo/manager/urls.py | 5 +++ combo/manager/views.py | 11 +++++++ tests/test_manager.py | 32 +++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/combo/manager/templates/combo/page_history.html b/combo/manager/templates/combo/page_history.html index e39df84c..de324f53 100644 --- a/combo/manager/templates/combo/page_history.html +++ b/combo/manager/templates/combo/page_history.html @@ -21,6 +21,7 @@
  • {{ snapshot.timestamp }}, {{ snapshot.comment }} {% if snapshot.user %} ({{ snapshot.user.get_full_name }}){% endif %} — {% trans "view" %} + — {% trans "export" %}{% trans "restore" %}
  • {% endfor %} diff --git a/combo/manager/urls.py b/combo/manager/urls.py index 716078f5..79ff209b 100644 --- a/combo/manager/urls.py +++ b/combo/manager/urls.py @@ -96,6 +96,11 @@ urlpatterns = [ pages_admin_required(views.snapshot_restore), name='combo-manager-snapshot-restore', ), + url( + r'^pages/(?P\d+)/history/(?P\d+)/export$', + pages_admin_required(views.snapshot_export), + name='combo-manager-snapshot-export', + ), url( r'^pages/(?P\d+)/add-cell-to-(?P[\w_-]+)/(?P\w+)/(?P[\w-]+)/$', views.page_add_cell, diff --git a/combo/manager/views.py b/combo/manager/views.py index 84b74b1e..7e6d32bd 100644 --- a/combo/manager/views.py +++ b/combo/manager/views.py @@ -625,6 +625,17 @@ class SnapshotRestoreView(ManagedPageMixin, DetailView): snapshot_restore = SnapshotRestoreView.as_view() +def snapshot_export(request, *args, **kwargs): + snapshot = PageSnapshot.objects.get(id=kwargs['pk']) + page = snapshot.get_page() + response = HttpResponse(content_type='application/json') + response['Content-Disposition'] = 'attachment; filename="export_page_{}_{}.json"'.format( + snapshot.get_page().slug, snapshot.timestamp.strftime('%Y%m%d') + ) + json.dump(page.get_serialized_page(), response, indent=2) + return response + + class PageRedirectToEditView(RedirectView): permanent = False diff --git a/tests/test_manager.py b/tests/test_manager.py index 56a6fc64..89868877 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -901,6 +901,38 @@ def test_export_page(freezer, app, admin_user): assert resp.json['pages'][0].get('fields').get('slug') == 'one' +def test_export_page_snapshot(freezer, app, admin_user): + Page.objects.all().delete() + page = Page(title='One', slug='one', template_name='standard') + page.save() + app = login(app) + + freezer.move_to('2020-07-16') + resp = app.get('/manage/pages/%s/' % page.id, status=200) + resp = resp.click(href='.*/title') + resp.form['title'].value = 'Initial Title' + resp = resp.form.submit() + resp = resp.follow() + + freezer.move_to('2020-07-17') + resp = resp.click(href='.*/title') + resp.form['title'].value = 'Updated Title' + resp = resp.form.submit() + + history = app.get('/manage/pages/%s/history' % page.id, status=200) + resp = history.click('export', index=0, verbose=True) + + assert resp.headers['content-type'] == 'application/json' + assert resp.headers['content-disposition'] == 'attachment; filename="export_page_one_20200717.json"' + assert resp.json['fields']['title'] == 'Updated Title' + + resp = history.click('export', index=1, verbose=True) + + assert resp.headers['content-type'] == 'application/json' + assert resp.headers['content-disposition'] == 'attachment; filename="export_page_one_20200716.json"' + assert resp.json['fields']['title'] == 'Initial Title' + + def test_export_page_without_child(freezer, app, admin_user): page = Page.objects.create(title='One', slug='one', template_name='standard') Page.objects.create(title='Two', slug='two', parent=page, template_name='standard') -- 2.35.1