manager: add link to export page snapshot (#62023)

This commit is contained in:
Corentin Sechet 2022-05-06 12:04:28 +02:00
parent 2b68a863ed
commit 3d4f53fde3
4 changed files with 49 additions and 0 deletions

View File

@ -21,6 +21,7 @@
<li>{{ snapshot.timestamp }}, {{ snapshot.comment }}
{% if snapshot.user %} ({{ snapshot.user.get_full_name }}){% endif %}
<a href="{% url 'combo-snapshot-view' pk=snapshot.id %}">{% trans "view" %}</a>
<a href="{% url 'combo-manager-snapshot-export' page_pk=view.page.id pk=snapshot.id %}">{% trans "export" %}</a>
<a href="{% url 'combo-manager-snapshot-restore' page_pk=view.page.id pk=snapshot.id %}" rel="popup">{% trans "restore" %}</a>
</li>
{% endfor %}

View File

@ -96,6 +96,11 @@ urlpatterns = [
pages_admin_required(views.snapshot_restore),
name='combo-manager-snapshot-restore',
),
url(
r'^pages/(?P<page_pk>\d+)/history/(?P<pk>\d+)/export$',
pages_admin_required(views.snapshot_export),
name='combo-manager-snapshot-export',
),
url(
r'^pages/(?P<page_pk>\d+)/add-cell-to-(?P<ph_key>[\w_-]+)/(?P<cell_type>\w+)/(?P<variant>[\w-]+)/$',
views.page_add_cell,

View File

@ -632,6 +632,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

View File

@ -904,6 +904,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')