From 3d5f5de747f29f3d50edd1686cd83eae6f8a42e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Wed, 30 Sep 2020 01:30:08 +0200
Subject: [PATCH] Introduce view for bulk deletion of AK orga messages

---
 AKModel/admin.py                              |  4 +-
 AKModel/locale/de_DE/LC_MESSAGES/django.po    | 58 ++++++++++++++++---
 .../admin/AKModel/message_delete.html         | 24 ++++++++
 .../admin/AKModel/render_ak_messages.html     | 11 ++++
 AKModel/templates/admin/AKModel/status.html   | 13 +----
 AKModel/views.py                              | 23 +++++++-
 6 files changed, 110 insertions(+), 23 deletions(-)
 create mode 100644 AKModel/templates/admin/AKModel/message_delete.html
 create mode 100644 AKModel/templates/admin/AKModel/render_ak_messages.html

diff --git a/AKModel/admin.py b/AKModel/admin.py
index e871bac1..a039742d 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -11,7 +11,7 @@ from simple_history.admin import SimpleHistoryAdmin
 
 from AKModel.availability.models import Availability
 from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage
-from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView
+from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView
 
 
 @admin.register(Event)
@@ -28,6 +28,8 @@ class EventAdmin(admin.ModelAdmin):
             path('<slug:slug>/status/', self.admin_site.admin_view(EventStatusView.as_view()), name="event_status"),
             path('<slug:event_slug>/ak-csv-export/', self.admin_site.admin_view(AKCSVExportView.as_view()), name="ak_csv_export"),
             path('<slug:event_slug>/ak-wiki-export/', self.admin_site.admin_view(AKWikiExportView.as_view()), name="ak_wiki_export"),
+            path('<slug:slug>/delete-orga-messages/', self.admin_site.admin_view(AKMessageDeleteView.as_view()),
+                 name="ak_delete_orga_messages"),
         ]
         return custom_urls + urls
 
diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po
index 840db7b0..91b24597 100644
--- a/AKModel/locale/de_DE/LC_MESSAGES/django.po
+++ b/AKModel/locale/de_DE/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-09-29 22:27+0000\n"
+"POT-Creation-Date: 2020-09-29 23:27+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -11,24 +11,24 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: AKModel/admin.py:36 AKModel/admin.py:37
+#: AKModel/admin.py:38 AKModel/admin.py:39
 #: AKModel/templates/admin/AKModel/status.html:7
 msgid "Status"
 msgstr "Status"
 
-#: AKModel/admin.py:115
+#: AKModel/admin.py:117
 msgid "Wish"
 msgstr "AK-Wunsch"
 
-#: AKModel/admin.py:121
+#: AKModel/admin.py:123
 msgid "Is wish"
 msgstr "Ist ein Wunsch"
 
-#: AKModel/admin.py:122
+#: AKModel/admin.py:124
 msgid "Is not a wish"
 msgstr "Ist kein Wunsch"
 
-#: AKModel/admin.py:149
+#: AKModel/admin.py:151
 msgid "Export to wiki syntax"
 msgstr "In Wiki-Syntax exportieren"
 
@@ -568,6 +568,32 @@ msgstr ""
 msgid "Logout"
 msgstr "Ausloggen"
 
+#: AKModel/templates/admin/AKModel/message_delete.html:7
+msgid "Delete Orga-Messages"
+msgstr "Organachrichten löschen"
+
+#: AKModel/templates/admin/AKModel/message_delete.html:10
+msgid "Delete AK Orga Messages"
+msgstr "AK-Organachrichten löschen"
+
+#: AKModel/templates/admin/AKModel/message_delete.html:11
+#, fuzzy, python-format
+#| msgid "Are you sure you want to delete all orga messages for "
+msgid ""
+"Are you sure you want to delete all orga messages for %(event)s? This will "
+"permanently delete %(message_count)s message(s):"
+msgstr ""
+"Sollen wirklich alle Organachrichten für %(event)s gelöscht werden? Dadurch "
+"werden %(message_count)s Nachricht(en) dauerhaft gelöscht:"
+
+#: AKModel/templates/admin/AKModel/message_delete.html:17
+msgid "Delete"
+msgstr "Löschen"
+
+#: AKModel/templates/admin/AKModel/message_delete.html:21
+msgid "Cancel"
+msgstr "Abbrechen"
+
 #: AKModel/templates/admin/AKModel/status.html:16
 #, fuzzy
 #| msgid "AK Categories"
@@ -624,21 +650,35 @@ msgstr "Anforderungen hinzufügen"
 msgid "Messages"
 msgstr "Nachrichten"
 
+#: AKModel/templates/admin/AKModel/status.html:99
+msgid "Delete all messages"
+msgstr "Alle Nachrichten löschen"
+
 #: AKModel/templates/admin/ak_index.html:7
 msgid "Active Events"
 msgstr "Aktive Events"
 
-#: AKModel/views.py:129
+#: AKModel/views.py:130
 msgid "Event Status"
 msgstr "Eventstatus"
 
-#: AKModel/views.py:143
+#: AKModel/views.py:144
 msgid "AK CSV Export"
 msgstr "AK CSV Export"
 
-#: AKModel/views.py:157
+#: AKModel/views.py:158
 msgid "AK Wiki Export"
 msgstr "AK Wiki Export"
 
+#: AKModel/views.py:178
+msgid "AK Orga Messages successfully deleted"
+msgstr "AK-Organachrichten erfolgreich gelöscht"
+
+#~ msgid "Confirm"
+#~ msgstr "Bestätigen"
+
+#~ msgid "messages will be permanently deleted:"
+#~ msgstr "Nachrichten werden dauerhaft gelöscht:"
+
 #~ msgid "Notes to organizers"
 #~ msgstr "Notizen an die Organisator*innen"
diff --git a/AKModel/templates/admin/AKModel/message_delete.html b/AKModel/templates/admin/AKModel/message_delete.html
new file mode 100644
index 00000000..df8ac3cb
--- /dev/null
+++ b/AKModel/templates/admin/AKModel/message_delete.html
@@ -0,0 +1,24 @@
+{% extends "admin_base.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>
+    <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/render_ak_messages.html b/AKModel/templates/admin/AKModel/render_ak_messages.html
new file mode 100644
index 00000000..62dec082
--- /dev/null
+++ b/AKModel/templates/admin/AKModel/render_ak_messages.html
@@ -0,0 +1,11 @@
+<table class="table table-striped">
+{% for message in ak_messages %}
+    <tr><td>
+        <span class="text-secondary float-right">
+            {{ message.timestamp|date:"Y-m-d H:i:s" }}
+        </span>
+        <h5><a href="{% url 'submit:ak_detail' event_slug=message.ak.event.slug pk=message.ak.pk %}">{{ message.ak }}</a></h5>
+        <p>{{ message.text }}</p>
+    </td></tr>
+{% endfor %}
+</table>
diff --git a/AKModel/templates/admin/AKModel/status.html b/AKModel/templates/admin/AKModel/status.html
index 7f1ef31b..33870620 100644
--- a/AKModel/templates/admin/AKModel/status.html
+++ b/AKModel/templates/admin/AKModel/status.html
@@ -95,17 +95,8 @@
             </div>
             <div class="col-md-4">
                 <h3 class="block-header">{% trans "Messages" %}</h3>
-                <table class="table table-striped">
-                {% for message in ak_messages %}
-                    <tr><td>
-                        <span class="text-secondary float-right">
-                            {{ message.timestamp|date:"Y-m-d H:i:s" }}
-                        </span>
-                        <h5><a href="{% url 'submit:ak_detail' event_slug=message.ak.event.slug pk=message.ak.pk %}">{{ message.ak }}</a></h5>
-                        <p>{{ message.text }}</p>
-                    </td></tr>
-                {% endfor %}
-                </table>
+                {% 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>
             </div>
         </div>
     {% endtimezone %}
diff --git a/AKModel/views.py b/AKModel/views.py
index 277cca12..d560e9f6 100644
--- a/AKModel/views.py
+++ b/AKModel/views.py
@@ -1,9 +1,10 @@
-from django.contrib import admin
+from django.contrib import admin, messages
+from django.http import HttpResponseRedirect
 from django.shortcuts import get_object_or_404
 from django.urls import reverse_lazy
 from django.utils.translation import gettext_lazy as _
 
-from django.views.generic import TemplateView, DetailView, ListView
+from django.views.generic import TemplateView, DetailView, ListView, DeleteView
 from rest_framework import viewsets, permissions, mixins
 
 from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage
@@ -158,3 +159,21 @@ class AKWikiExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
 
     def get_queryset(self):
         return super().get_queryset().order_by("category")
+
+
+class AKMessageDeleteView(AdminViewMixin, DeleteView):
+    model = Event
+    template_name = "admin/AKModel/message_delete.html"
+
+    def get_orga_messages_for_event(self, event):
+        return AKOrgaMessage.objects.filter(ak__event=event)
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context["ak_messages"] = self.get_orga_messages_for_event(self.get_object())
+        return context
+
+    def post(self, request, *args, **kwargs):
+        self.get_orga_messages_for_event(self.get_object()).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}))
-- 
GitLab