From f4de84d334408d1153a1f53977990986b0cf1ce6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sun, 2 Oct 2022 14:57:06 +0200
Subject: [PATCH] Implement admin actions for AKs

Add two admin actions to reset interest and interest counter of AKs -- each including a preview/confirmation step
This implements #153
---
 AKModel/admin.py                           | 23 ++++++++++-
 AKModel/locale/de_DE/LC_MESSAGES/django.po | 44 +++++++++++++++++-----
 AKModel/views.py                           | 20 ++++++++++
 3 files changed, 75 insertions(+), 12 deletions(-)

diff --git a/AKModel/admin.py b/AKModel/admin.py
index 4675d842..33374fc5 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -18,7 +18,8 @@ from AKModel.availability.models import Availability
 from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage, \
     ConstraintViolation
 from AKModel.urls import get_admin_urls_event_wizard, get_admin_urls_event
-from AKModel.views import CVMarkResolvedView, CVSetLevelViolationView, CVSetLevelWarningView
+from AKModel.views import CVMarkResolvedView, CVSetLevelViolationView, CVSetLevelWarningView, AKResetInterestView, \
+    AKResetInterestCounterView
 
 
 class EventRelatedFieldListFilter(RelatedFieldListFilter):
@@ -175,7 +176,7 @@ class AKAdmin(SimpleHistoryAdmin):
     list_filter = ['event', WishFilter, ('category', EventRelatedFieldListFilter), ('requirements', EventRelatedFieldListFilter)]
     list_editable = ['short_name', 'track', 'interest_counter']
     ordering = ['pk']
-    actions = ['wiki_export']
+    actions = ['wiki_export', 'reset_interest', 'reset_interest_counter']
     form = AKAdminForm
 
     def is_wish(self, obj):
@@ -193,6 +194,24 @@ class AKAdmin(SimpleHistoryAdmin):
             kwargs['initial'] = Event.get_next_active()
         return super(AKAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
+    def get_urls(self):
+        urls = [
+            path('reset-interest/', AKResetInterestView.as_view(), name="ak-reset-interest"),
+            path('reset-interest-counter/', AKResetInterestCounterView.as_view(), name="ak-reset-interest-counter"),
+        ]
+        urls.extend(super().get_urls())
+        return urls
+
+    def reset_interest(self, request, queryset):
+        selected = queryset.values_list('pk', flat=True)
+        return HttpResponseRedirect(f"{reverse_lazy('admin:ak-reset-interest')}?pks={','.join(str(pk) for pk in selected)}")
+    reset_interest.short_description = _("Reset interest in AKs")
+
+    def reset_interest_counter(self, request, queryset):
+        selected = queryset.values_list('pk', flat=True)
+        return HttpResponseRedirect(f"{reverse_lazy('admin:ak-reset-interest-counter')}?pks={','.join(str(pk) for pk in selected)}")
+    reset_interest_counter.short_description = _("Reset AKs' interest counters")
+
 
 class RoomForm(AvailabilitiesFormMixin, forms.ModelForm):
     class Meta:
diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po
index 25980a44..e8656afa 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: 2022-09-28 01:20+0200\n"
+"POT-Creation-Date: 2022-10-02 15:00+0200\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,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: .\AKModel\admin.py:58 .\AKModel\admin.py:60
+#: .\AKModel\admin.py:59 .\AKModel\admin.py:61
 #: .\AKModel\templates\admin\AKModel\event_wizard\activate.html:32
 #: .\AKModel\templates\admin\AKModel\event_wizard\created_prepare_import.html:48
 #: .\AKModel\templates\admin\AKModel\event_wizard\finish.html:21
@@ -21,35 +21,43 @@ msgstr ""
 msgid "Status"
 msgstr "Status"
 
-#: .\AKModel\admin.py:134
+#: .\AKModel\admin.py:135
 msgid "Wish"
 msgstr "AK-Wunsch"
 
-#: .\AKModel\admin.py:140
+#: .\AKModel\admin.py:141
 msgid "Is wish"
 msgstr "Ist ein Wunsch"
 
-#: .\AKModel\admin.py:141
+#: .\AKModel\admin.py:142
 msgid "Is not a wish"
 msgstr "Ist kein Wunsch"
 
-#: .\AKModel\admin.py:187
+#: .\AKModel\admin.py:188
 msgid "Export to wiki syntax"
 msgstr "In Wiki-Syntax exportieren"
 
-#: .\AKModel\admin.py:281
+#: .\AKModel\admin.py:208 .\AKModel\views.py:442
+msgid "Reset interest in AKs"
+msgstr "Interesse an AKs zurücksetzen"
+
+#: .\AKModel\admin.py:213 .\AKModel\views.py:452
+msgid "Reset AKs' interest counters"
+msgstr "Interessenszähler der AKs zurücksetzen"
+
+#: .\AKModel\admin.py:300
 msgid "AK Details"
 msgstr "AK-Details"
 
-#: .\AKModel\admin.py:336 .\AKModel\views.py:412
+#: .\AKModel\admin.py:355 .\AKModel\views.py:412
 msgid "Mark Constraint Violations as manually resolved"
 msgstr "Markiere Constraintverletzungen manuell als behoben"
 
-#: .\AKModel\admin.py:341
+#: .\AKModel\admin.py:360
 msgid "Set to Constraint Violations to level \"violation\""
 msgstr "Constraintverletzungen auf Level \"Violation\" setzen"
 
-#: .\AKModel\admin.py:346 .\AKModel\views.py:432
+#: .\AKModel\admin.py:365 .\AKModel\views.py:432
 msgid "Set Constraint Violations to level \"warning\""
 msgstr "Constraintverletzungen auf Level \"Warning\" setzen"
 
@@ -1141,6 +1149,22 @@ msgstr ""
 msgid "Constraint Violations set to level 'warning'"
 msgstr "Constraintverletzungen auf Level \"Warning\" gesetzt"
 
+#: .\AKModel\views.py:444
+msgid "Interest of the following AKs will be set to not filled (-1):"
+msgstr "Interesse an den folgenden AKs wird auf nicht ausgefüllt (-1) gesetzt:"
+
+#: .\AKModel\views.py:445
+msgid "Reset of interest in AKs successful."
+msgstr "Zurücksetzen des Interesses an den AKs erfolgreich."
+
+#: .\AKModel\views.py:454
+msgid "Interest counter of the following AKs will be set to 0:"
+msgstr "Interessensbekundungszähler der folgenden AKs wird auf 0 gesetzt:"
+
+#: .\AKModel\views.py:455
+msgid "AKs' interest counters set back to 0."
+msgstr "Interessensbekundungszähler der AKs auf 0 gesetzt."
+
 #, fuzzy
 #~| msgid "Export AK Slides"
 #~ msgid "Export Slides"
diff --git a/AKModel/views.py b/AKModel/views.py
index b6311f3f..a766d896 100644
--- a/AKModel/views.py
+++ b/AKModel/views.py
@@ -436,3 +436,23 @@ class CVSetLevelWarningView(IntermediateAdminActionView):
 
     def perform_action(self, entity):
         entity.level = ConstraintViolation.ViolationLevel.WARNING
+
+
+class AKResetInterestView(IntermediateAdminActionView):
+    title = _("Reset interest in AKs")
+    model = AK
+    confirmation_message = _("Interest of the following AKs will be set to not filled (-1):")
+    success_message = _("Reset of interest in AKs successful.")
+
+    def perform_action(self, entity):
+        entity.interest = -1
+
+
+class AKResetInterestCounterView(IntermediateAdminActionView):
+    title = _("Reset AKs' interest counters")
+    model = AK
+    confirmation_message = _("Interest counter of the following AKs will be set to 0:")
+    success_message = _("AKs' interest counters set back to 0.")
+
+    def perform_action(self, entity):
+        entity.interest_counter = 0
-- 
GitLab