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