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