From 2f9789a89c619d8a820344a247e33a973cbfaefd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Tue, 27 Sep 2022 13:24:08 +0200
Subject: [PATCH] Introduce generic admin action view with form & adapt orga
 message deletion

Introduce a new generic view that can be used for all admin actions that require a preview/confirmation or a form to specify parameters
Change AK Orga Message deletion view to use this generic view instead of a manually adapted delete view
---
 AKModel/forms.py                              |  4 +++
 .../admin/AKModel/action_intermediate.html    | 30 ++++++++++++++++
 .../admin/AKModel/message_delete.html         | 17 ++-------
 AKModel/templates/admin/AKModel/status.html   |  2 +-
 AKModel/urls.py                               |  2 +-
 AKModel/views.py                              | 36 +++++++++++++++----
 6 files changed, 67 insertions(+), 24 deletions(-)
 create mode 100644 AKModel/templates/admin/AKModel/action_intermediate.html

diff --git a/AKModel/forms.py b/AKModel/forms.py
index 43dcfa96..1f5c07ee 100644
--- a/AKModel/forms.py
+++ b/AKModel/forms.py
@@ -68,3 +68,7 @@ class NewEventWizardActivateForm(forms.ModelForm):
     class Meta:
         fields = ["active"]
         model = Event
+
+
+class AdminIntermediateForm(forms.Form):
+    pass
diff --git a/AKModel/templates/admin/AKModel/action_intermediate.html b/AKModel/templates/admin/AKModel/action_intermediate.html
new file mode 100644
index 00000000..0c211ecb
--- /dev/null
+++ b/AKModel/templates/admin/AKModel/action_intermediate.html
@@ -0,0 +1,30 @@
+{% extends "admin/base_site.html" %}
+{% load tags_AKModel %}
+
+{% load i18n %}
+{% load bootstrap4 %}
+{% load fontawesome_5 %}
+
+
+{% block title %}{{event}}: {{ title }}{% endblock %}
+
+{% block content %}
+    {% block action_preview %}
+        <p>
+            {{ preview|linebreaksbr }}
+        </p>
+    {% endblock %}
+
+    <form method="post">{% csrf_token %}
+        {% bootstrap_form form %}
+
+        <div class="float-right">
+            <button type="submit" class="save btn btn-success" value="Submit">
+                {% fa5_icon "check" 'fas' %} {% trans "Confirm" %}
+            </button>
+        </div>
+        <a href="javascript:history.back()" class="btn btn-info">
+            {% fa5_icon "times" 'fas' %} {% trans "Cancel" %}
+        </a>
+    </form>
+{% endblock %}
diff --git a/AKModel/templates/admin/AKModel/message_delete.html b/AKModel/templates/admin/AKModel/message_delete.html
index 03b5899b..1bdbf0a5 100644
--- a/AKModel/templates/admin/AKModel/message_delete.html
+++ b/AKModel/templates/admin/AKModel/message_delete.html
@@ -1,24 +1,11 @@
-{% extends "admin/base_site.html" %}
+{% extends "admin/AKModel/action_intermediate.html" %}
 {% load tags_AKModel %}
 
 {% load i18n %}
 {% load fontawesome_5 %}
 
-{% block title %}{{event}}: {% trans "Delete Orga-Messages" %}{% endblock %}
-
-{% block content %}
-    <h2>{% trans "Delete AK Orga Messages" %}</h2>
+{% block action_preview %}
     <p>{% blocktrans with message_count=ak_messages.count %}Are you sure you want to delete all orga messages for {{ event }}? This will permanently delete {{ message_count }} message(s):{% endblocktrans %}</p>
 
     {% include "admin/AKModel/render_ak_messages.html" %}
-
-    <form method="post">{% csrf_token %}
-        <button type="submit" class="save btn btn-danger float-right" value="Confirm">
-            {% fa5_icon "check" 'fas' %} {% trans "Delete" %}
-        </button>
-
-        <a href="{% url 'admin:event_status' slug=event.slug %}" class="btn btn-info">
-            {% fa5_icon "times" 'fas' %} {% trans "Cancel" %}
-        </a>
-    </form>
 {% endblock %}
diff --git a/AKModel/templates/admin/AKModel/status.html b/AKModel/templates/admin/AKModel/status.html
index f64a5a0c..362c7240 100644
--- a/AKModel/templates/admin/AKModel/status.html
+++ b/AKModel/templates/admin/AKModel/status.html
@@ -115,7 +115,7 @@
             <div class="col-md-4">
                 <h3 class="block-header">{% trans "Messages" %}</h3>
                 {% include "admin/AKModel/render_ak_messages.html" %}
-                <a class="btn btn-danger" href="{% url 'admin:ak_delete_orga_messages' slug=event.slug %}">{% trans "Delete all messages" %}</a>
+                <a class="btn btn-danger" href="{% url 'admin:ak_delete_orga_messages' event_slug=event.slug %}">{% trans "Delete all messages" %}</a>
             </div>
         </div>
     {% endtimezone %}
diff --git a/AKModel/urls.py b/AKModel/urls.py
index 2071acc9..ca9cfe67 100644
--- a/AKModel/urls.py
+++ b/AKModel/urls.py
@@ -79,7 +79,7 @@ def get_admin_urls_event(admin_site):
              name="ak_csv_export"),
         path('<slug:slug>/ak-wiki-export/', admin_site.admin_view(AKWikiExportView.as_view()),
              name="ak_wiki_export"),
-        path('<slug:slug>/delete-orga-messages/', admin_site.admin_view(AKMessageDeleteView.as_view()),
+        path('<slug:event_slug>/delete-orga-messages/', admin_site.admin_view(AKMessageDeleteView.as_view()),
              name="ak_delete_orga_messages"),
         path('<slug:event_slug>/ak-slide-export/', export_slides, name="ak_slide_export"),
 
diff --git a/AKModel/views.py b/AKModel/views.py
index 2729bdb6..08f054f1 100644
--- a/AKModel/views.py
+++ b/AKModel/views.py
@@ -1,3 +1,4 @@
+from abc import ABC, abstractmethod
 from itertools import zip_longest
 
 from django.contrib import admin, messages
@@ -11,7 +12,7 @@ from django_tex.shortcuts import render_to_pdf
 from rest_framework import viewsets, permissions, mixins
 
 from AKModel.forms import NewEventWizardStartForm, NewEventWizardSettingsForm, NewEventWizardPrepareImportForm, \
-    NewEventWizardImportForm, NewEventWizardActivateForm
+    NewEventWizardImportForm, NewEventWizardActivateForm, AdminIntermediateForm
 from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage, AKRequirement
 from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \
     AKOwnerSerializer
@@ -194,22 +195,43 @@ class AKWikiExportView(AdminViewMixin, DetailView):
         return context
 
 
-class AKMessageDeleteView(AdminViewMixin, DeleteView):
-    model = Event
+class IntermediateAdminView(AdminViewMixin, FormView, ABC):
+    template_name = "admin/AKModel/action_intermediate.html"
+    form_class = AdminIntermediateForm
+
+    @abstractmethod
+    def get_preview(self):
+        pass
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context["title"] = self.title
+        context["preview"] = self.get_preview()
+        return context
+
+
+class AKMessageDeleteView(EventSlugMixin, IntermediateAdminView):
     template_name = "admin/AKModel/message_delete.html"
+    title = _("Delete AK Orga Messages")
 
     def get_orga_messages_for_event(self, event):
         return AKOrgaMessage.objects.filter(ak__event=event)
 
+    def get_preview(self):
+        return None
+
+    def get_success_url(self):
+        return reverse_lazy('admin:event_status', kwargs={'slug': self.event.slug})
+
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
-        context["ak_messages"] = self.get_orga_messages_for_event(self.get_object())
+        context["ak_messages"] = self.get_orga_messages_for_event(self.event)
         return context
 
-    def post(self, request, *args, **kwargs):
-        self.get_orga_messages_for_event(self.get_object()).delete()
+    def form_valid(self, form):
+        self.get_orga_messages_for_event(self.event).delete()
         messages.add_message(self.request, messages.SUCCESS, _("AK Orga Messages successfully deleted"))
-        return HttpResponseRedirect(reverse_lazy('admin:event_status', kwargs={'slug': self.get_object().slug}))
+        return super().form_valid(form)
 
 
 class WizardViewMixin:
-- 
GitLab