From 54b6017027a580cd4b09e2aa568a08dc43aa882e Mon Sep 17 00:00:00 2001
From: Grollicus <cccvgitlab.db5c7b60@grollmann.eu>
Date: Fri, 18 Aug 2023 23:34:45 +0200
Subject: [PATCH] Delete Revisions

---
 .../locale/de/LC_MESSAGES/django.po           | 21 +++++++++++++
 .../locale/en/LC_MESSAGES/django.po           | 25 +++++++++++++--
 .../backoffice/staticpage_detail.html         | 31 +++++++++++++++++++
 src/backoffice/urls.py                        |  1 +
 src/backoffice/views/pages.py                 | 20 ++++++++++++
 5 files changed, 96 insertions(+), 2 deletions(-)

diff --git a/src/backoffice/locale/de/LC_MESSAGES/django.po b/src/backoffice/locale/de/LC_MESSAGES/django.po
index 3f43e97c3..7bd838090 100644
--- a/src/backoffice/locale/de/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/de/LC_MESSAGES/django.po
@@ -851,9 +851,27 @@ msgstr "statische Seite"
 msgid "StaticPage--delete-page"
 msgstr "Seite löschen"
 
+msgid "StaticPageRevision--delete-confirm"
+msgstr "Diesen Historieneintrag wirklich löschen?"
+
 msgid "StaticPage--revisions"
 msgstr "Versionen"
 
+msgid "StaticPageRevision--revision"
+msgstr "Version"
+
+msgid "StaticPageRevision--title"
+msgstr "Titel"
+
+msgid "StaticPageRevision--author"
+msgstr "Author"
+
+msgid "StaticPageRevision--date"
+msgstr "Datum"
+
+msgid "StaticPageRevision--delete"
+msgstr "Historieneintrag löschen"
+
 #, python-format
 msgid "StaticPage--preview %(object.public_revision)s"
 msgstr "Aktuell veröffentlichte Version: %(object.public_revision)s"
@@ -1270,6 +1288,9 @@ msgstr "Dieser Kurzname wird bereits verwendet."
 msgid "StaticPage--deleted"
 msgstr "Statische Seite und zugehörige Historie gelöscht."
 
+msgid "StaticPageRevision--deleted"
+msgstr "Historieneintrag gelöscht."
+
 msgid "userprofile_updated"
 msgstr "Benutzerprofil aktualisiert"
 
diff --git a/src/backoffice/locale/en/LC_MESSAGES/django.po b/src/backoffice/locale/en/LC_MESSAGES/django.po
index 80fb5e090..26df3953d 100644
--- a/src/backoffice/locale/en/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/en/LC_MESSAGES/django.po
@@ -842,7 +842,7 @@ msgid "Event--sos-delete-confirm"
 msgstr "Are you sure you want to remove this selforganized session?"
 
 msgid "StaticPage--delete-confirm"
-msgstr "Are you sure you want to remove this Static Page session? All revisions and all stored history will be removed as well!"
+msgstr "Are you sure you want to remove this Static Page? All revisions and all stored history will be removed as well!"
 
 msgid "StaticPage"
 msgstr "static page"
@@ -850,8 +850,26 @@ msgstr "static page"
 msgid "StaticPage--delete-page"
 msgstr "Delete Page"
 
+msgid "StaticPageRevision--delete-confirm"
+msgstr "Are you sure you want to remove this Static Page Revision?"
+
 msgid "StaticPage--revisions"
-msgstr "Versionen"
+msgstr "Versions"
+
+msgid "StaticPageRevision--revision"
+msgstr "Version"
+
+msgid "StaticPageRevision--title"
+msgstr "Title"
+
+msgid "StaticPageRevision--author"
+msgstr "Author"
+
+msgid "StaticPageRevision--date"
+msgstr "Date"
+
+msgid "StaticPageRevision--delete"
+msgstr "Delete Version"
 
 #, python-format
 msgid "StaticPage--preview %(object.public_revision)s"
@@ -1268,6 +1286,9 @@ msgstr "This slug is already in use on another page."
 msgid "StaticPage--deleted"
 msgstr "StaticPage and all corresponding revisions deleted."
 
+msgid "StaticPageRevision--deleted"
+msgstr "StaticPageRevision deleted."
+
 msgid "userprofile_updated"
 msgstr "user profile updated"
 
diff --git a/src/backoffice/templates/backoffice/staticpage_detail.html b/src/backoffice/templates/backoffice/staticpage_detail.html
index a55697db5..c2fd9e739 100644
--- a/src/backoffice/templates/backoffice/staticpage_detail.html
+++ b/src/backoffice/templates/backoffice/staticpage_detail.html
@@ -32,6 +32,37 @@
 </div>
 </form>
 
+<form method="POST" action="{% url 'backoffice:page-revision-delete' pk=object.pk %}" onsubmit="return confirm('{% trans 'StaticPageRevision--delete-confirm' %}')">
+{% csrf_token %}
+
+<div class="card mt-2">
+  <div class="card-header">{% trans 'StaticPage--revisions' %}</div>
+  <div class="card-body">
+    <table class="table table-sm">
+      <thead><tr>
+        <th>{% trans "StaticPageRevision--revision" %}</th>
+        <th>{% trans "StaticPageRevision--title" %}</th>
+        <th>{% trans "StaticPageRevision--author" %}</th>
+        <th>{% trans "StaticPageRevision--date" %}</th>
+        <th>&nbsp;</th>
+      </tr></thead>
+      <tbody>
+        {% for revision in revisions %}
+          <tr>
+            <td>{{ revision.revision }}</td>
+            <td>{{ revision.title }}</td>
+            <td>{{ revision.author | default:"-" }}</td>
+            <td>{{ revision.timestamp | date:"DATETIME_FORMAT" }}</td>
+            <td><button class="btn btn-danger btn-sm" type="submit" name="revision" value="{{ revision.revision }}">{% trans "StaticPageRevision--delete" %}</button></td>
+          </tr>
+      {% endfor %}
+      </tbody>
+    </table>
+  </div>
+</div>
+</form>
+
+
 {% if object.public_revision > 0 %}
 <div class="card mt-3">
   <div class="card-header">{% blocktranslate %}StaticPage--preview {{ object.public_revision }}{% endblocktranslate%}</div>
diff --git a/src/backoffice/urls.py b/src/backoffice/urls.py
index ae8275233..4c23b967f 100644
--- a/src/backoffice/urls.py
+++ b/src/backoffice/urls.py
@@ -46,6 +46,7 @@ urlpatterns = [
     path('page/new', pages.NewPageView.as_view(), name='page-new'),
     path('page/<uuid:pk>', pages.PageView.as_view(), name='page-detail'),
     path('page/<uuid:pk>/delete', pages.PageDeleteView.as_view(), name='page-delete'),
+    path('page/<uuid:pk>/delete-revision', pages.PageRevisionDeleteView.as_view(), name='page-revision-delete'),
 
     path('assemblies', assemblyteam.AssembliesView.as_view(), name='assemblies'),
     path('assemblies/list/<str:variant>', assemblyteam.AssembliesListsView.as_view(), name='assemblieslist'),
diff --git a/src/backoffice/views/pages.py b/src/backoffice/views/pages.py
index d040e329e..745d34450 100644
--- a/src/backoffice/views/pages.py
+++ b/src/backoffice/views/pages.py
@@ -108,6 +108,7 @@ class PageView(ConferenceMixin, UpdateView):
         context = super().get_context_data(**kwargs)
         context['active_page'] = 'pages'
         context['object'] = self.object
+        context['revisions'] = self.object.revisions.filter(is_draft=False).order_by('-timestamp', '-pk')
         return context
 
     def get_success_url(self, *args, **kwargs):
@@ -127,3 +128,22 @@ class PageDeleteView(ConferenceMixin, DeleteView):
         res = super().form_valid(form)
         messages.success(self.request, _("StaticPage--deleted"))
         return res
+
+
+class PageRevisionDeleteView(ConferenceMixin, DeleteView):
+    permission_required = ('core.static_pages')
+    model = StaticPage
+    success_url = reverse_lazy('backoffice:pages')
+    require_conference = True
+
+    def get_object(self):
+        page = StaticPage.objects.accessible_by_user(self.request.user, self.conference, language=None).get(pk=self.kwargs.get('pk'))
+        return page.revisions.filter(revision=self.request.POST.get('revision'))
+
+    def get_success_url(self) -> str:
+        return reverse('backoffice:page-detail', kwargs={'pk': self.kwargs.get('pk')})
+
+    def form_valid(self, form):
+        res = super().form_valid(form)
+        messages.success(self.request, _("StaticPageRevision--deleted"))
+        return res
-- 
GitLab