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 %}
-
+
+
+ {% trans 'Date' %} |
+ {% trans 'Description' %} |
+ {% trans 'User' %} |
+ {% trans 'Actions' %} |
+
+
+ {% for snapshot in object_list %}
+
+
+ {{ 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" %}
+ |
+
+ {% endfor %}
+
+
{% 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 %}
+
+{% 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 bde64776..d7771ee1 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 c50441b6..7dc7f68b 100644
--- a/tests/test_manager.py
+++ b/tests/test_manager.py
@@ -2513,6 +2513,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