From 6c8476b2f26451257f94ad933943baa0931a05ee Mon Sep 17 00:00:00 2001 From: Agate Date: Wed, 6 Jul 2022 15:04:14 +0200 Subject: [PATCH] manager: support for saving a page snapshot with a label (#56519) --- .../migrations/0057_pagesnapshot_label.py | 18 +++++++++ combo/data/models.py | 5 ++- combo/manager/forms.py | 4 ++ .../manager/templates/combo/page_history.html | 40 ++++++++++++++----- combo/manager/templates/combo/page_view.html | 1 + .../templates/combo/snapshot_save.html | 24 +++++++++++ combo/manager/urls.py | 5 +++ combo/manager/views.py | 22 ++++++++++ tests/test_manager.py | 8 ++++ 9 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 combo/data/migrations/0057_pagesnapshot_label.py create mode 100644 combo/manager/templates/combo/snapshot_save.html diff --git a/combo/data/migrations/0057_pagesnapshot_label.py b/combo/data/migrations/0057_pagesnapshot_label.py new file mode 100644 index 00000000..886f7d26 --- /dev/null +++ b/combo/data/migrations/0057_pagesnapshot_label.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.26 on 2022-07-06 12:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('data', '0056_display_condition'), + ] + + operations = [ + migrations.AddField( + model_name='pagesnapshot', + name='label', + field=models.CharField(blank=True, max_length=150, verbose_name='Label'), + ), + ] diff --git a/combo/data/models.py b/combo/data/models.py index 92648b9e..61e349bd 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -717,13 +717,14 @@ class PageSnapshot(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True) comment = models.TextField(blank=True, null=True) serialization = JSONField(blank=True, default=dict) + label = models.CharField(_('Label'), max_length=150, blank=True) class Meta: ordering = ('-timestamp',) @classmethod - def take(cls, page, request=None, comment=None, deletion=False): - snapshot = cls(page=page, comment=comment) + def take(cls, page, request=None, comment=None, deletion=False, label=None): + snapshot = cls(page=page, comment=comment, label=label or '') if request and not request.user.is_anonymous: snapshot.user = request.user if not deletion: diff --git a/combo/manager/forms.py b/combo/manager/forms.py index 0baf6f8f..6d96ace3 100644 --- a/combo/manager/forms.py +++ b/combo/manager/forms.py @@ -408,3 +408,7 @@ class PlaceholderOptionsForm(forms.Form): ('fx-grid--t3', _('3 columns')), ], ) + + +class PageSnapshotSaveForm(forms.Form): + label = forms.CharField(label=_('Label'), max_length=150, required=True) diff --git a/combo/manager/templates/combo/page_history.html b/combo/manager/templates/combo/page_history.html index de324f53..8d62e613 100644 --- a/combo/manager/templates/combo/page_history.html +++ b/combo/manager/templates/combo/page_history.html @@ -16,16 +16,36 @@ {% block content %}
- + + + + + + + + + {% for snapshot in object_list %} + + + + + + + {% endfor %} + +
{% trans 'Date' %}{% trans 'Description' %}{% trans 'User' %}{% trans 'Actions' %}
+ {{ snapshot.timestamp }} + + {% if snapshot.label %} + {{ snapshot.label }} + {% elif snapshot.comment %} + {{ snapshot.comment }} + {% endif %} + {% if snapshot.user %} {{ snapshot.user.get_full_name }}{% endif %} + {% trans "view" %} + — {% trans "export" %} + — {% trans "restore" %} +
{% include "gadjo/pagination.html" %} diff --git a/combo/manager/templates/combo/page_view.html b/combo/manager/templates/combo/page_view.html index 705becaf..7fb02191 100644 --- a/combo/manager/templates/combo/page_view.html +++ b/combo/manager/templates/combo/page_view.html @@ -16,6 +16,7 @@
  • {% trans 'Add a child page' %}
  • {% trans 'Manage edit roles' %}
  • {% trans 'Duplicate' %}
  • +
  • {% trans 'Save snapshot' %}
  • {% trans 'Delete' %}
  • {% endif %} diff --git a/combo/manager/templates/combo/snapshot_save.html b/combo/manager/templates/combo/snapshot_save.html new file mode 100644 index 00000000..cca0fd5a --- /dev/null +++ b/combo/manager/templates/combo/snapshot_save.html @@ -0,0 +1,24 @@ +{% extends "combo/manager_base.html" %} +{% load i18n %} +{% load cells %} +{% load thumbnail %} + +{% block appbar %} +

    {% trans 'Save Page' %} - {{ page.title }}

    +{% endblock %} + +{% block breadcrumb %} + {{ block.super }} + {% trans 'Page' %} - {{page.title }} +{% endblock %} + +{% block content %} +
    + {% csrf_token %} + {{ form.as_p }} +
    + + {% trans 'Cancel' %} +
    +
    +{% endblock %} diff --git a/combo/manager/urls.py b/combo/manager/urls.py index 79ff209b..3178a8f6 100644 --- a/combo/manager/urls.py +++ b/combo/manager/urls.py @@ -85,6 +85,11 @@ urlpatterns = [ pages_admin_required(views.page_duplicate), name='combo-manager-page-duplicate', ), + url( + r'^pages/(?P\d+)/save', + pages_admin_required(views.snapshot_save), + name='combo-manager-page-save', + ), url( r'^pages/(?P\d+)/edit-roles/$', pages_admin_required(views.page_edit_roles), diff --git a/combo/manager/views.py b/combo/manager/views.py index a789008e..ae0f82e5 100644 --- a/combo/manager/views.py +++ b/combo/manager/views.py @@ -83,6 +83,7 @@ from .forms import ( PageExportForm, PageRestrictedAddForm, PageSelectTemplateForm, + PageSnapshotSaveForm, PageVisibilityForm, PlaceholderOptionsForm, SiteExportForm, @@ -644,6 +645,27 @@ def snapshot_export(request, *args, **kwargs): return response +class SnapshotSaveView(ManagedPageMixin, FormView): + form_class = PageSnapshotSaveForm + template_name = 'combo/snapshot_save.html' + + def get_success_url(self): + return reverse('combo-manager-page-view', kwargs={'pk': self.page.pk}) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['page'] = self.page + return context + + def form_valid(self, form): + PageSnapshot.take(self.page, request=self.request, label=form.cleaned_data['label']) + messages.info(self.request, _('Snapshot "%s" has been saved.') % form.cleaned_data['label']) + return super().form_valid(form) + + +snapshot_save = SnapshotSaveView.as_view() + + class PageRedirectToEditView(RedirectView): permanent = False diff --git a/tests/test_manager.py b/tests/test_manager.py index 2a655adc..edab8c03 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -2510,6 +2510,14 @@ def test_page_versionning(app, admin_user): resp2 = resp.click('See online') assert resp2.text.index('Foobar1') < resp2.text.index('Foobar2') < resp2.text.index('Foobar3') + # save snapshot with a label + app = login(app) + resp = app.get('/manage/pages/%s/' % page.id, status=200) + resp = resp.click('Save snapshot') + resp.form['label'] = 'CGUv1' + resp = resp.form.submit().follow() + assert page.pagesnapshot_set.latest('pk').label == 'CGUv1' + # clean it up Page.snapshots.all().delete() assert Page.objects.count() == 1 -- 2.36.1