From 19e46342493e68d70f468bad625272f15dd8460f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sun, 23 Oct 2022 23:26:47 +0200
Subject: [PATCH] Fix admin action for wiki export

Looks like this was broken since the switch to individual boxes per category.
Fixed it and made it more robust (show error message when trying to export AKs from more than one event at the same time).
---
 AKModel/admin.py                           |  9 +++++-
 AKModel/locale/de_DE/LC_MESSAGES/django.po | 32 ++++++++++++----------
 AKModel/models.py                          |  8 ++++--
 3 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/AKModel/admin.py b/AKModel/admin.py
index 3bfa7af5..1bc4a653 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -196,7 +196,14 @@ class AKAdmin(SimpleHistoryAdmin):
 
     @action(description=_("Export to wiki syntax"))
     def wiki_export(self, request, queryset):
-        return render(request, 'admin/AKModel/wiki_export.html', context={"AKs": queryset})
+        # Only export when all AKs belong to the same event
+        if queryset.values("event").distinct().count() == 1:
+            event = queryset.first().event
+            pks = set(ak.pk for ak in queryset.all())
+            categories_with_aks = event.get_categories_with_aks(wishes_seperately=False, filter=lambda ak: ak.pk in pks,
+                                                                hide_empty_categories=True)
+            return render(request, 'admin/AKModel/wiki_export.html', context={"categories_with_aks": categories_with_aks})
+        self.message_user(request, _("Cannot export AKs from more than one event at the same time."), messages.ERROR)
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'event':
diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po
index 63f87879..ea136ff1 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-10-23 19:20+0000\n"
+"POT-Creation-Date: 2022-10-23 23:19+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:61 AKModel/admin.py:63
+#: AKModel/admin.py:59 AKModel/admin.py:62
 #: 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,38 +21,42 @@ msgstr ""
 msgid "Status"
 msgstr "Status"
 
-#: AKModel/admin.py:70
+#: AKModel/admin.py:69
 msgid "Publish plan"
 msgstr "Plan veröffentlichen"
 
-#: AKModel/admin.py:73
+#: AKModel/admin.py:72
 msgid "Plan published"
 msgstr "Plan veröffentlicht"
 
-#: AKModel/admin.py:75
+#: AKModel/admin.py:74
 msgid "Unpublish plan"
 msgstr "Plan verbergen"
 
-#: AKModel/admin.py:78
+#: AKModel/admin.py:77
 msgid "Plan unpublished"
 msgstr "Plan verborgen"
 
-#: AKModel/admin.py:147
+#: AKModel/admin.py:146
 msgid "Wish"
 msgstr "AK-Wunsch"
 
-#: AKModel/admin.py:153
+#: AKModel/admin.py:152
 msgid "Is wish"
 msgstr "Ist ein Wunsch"
 
-#: AKModel/admin.py:154
+#: AKModel/admin.py:153
 msgid "Is not a wish"
 msgstr "Ist kein Wunsch"
 
-#: AKModel/admin.py:200
+#: AKModel/admin.py:197
 msgid "Export to wiki syntax"
 msgstr "In Wiki-Syntax exportieren"
 
+#: AKModel/admin.py:205
+msgid "Cannot export AKs from more than one event at the same time."
+msgstr "Kann nicht AKs von mehreren Events zur selben Zeit exportieren."
+
 #: AKModel/admin.py:220 AKModel/views.py:442
 msgid "Reset interest in AKs"
 msgstr "Interesse an AKs zurücksetzen"
@@ -61,19 +65,19 @@ msgstr "Interesse an AKs zurücksetzen"
 msgid "Reset AKs' interest counters"
 msgstr "Interessenszähler der AKs zurücksetzen"
 
-#: AKModel/admin.py:312
+#: AKModel/admin.py:309
 msgid "AK Details"
 msgstr "AK-Details"
 
-#: AKModel/admin.py:367 AKModel/views.py:412
+#: AKModel/admin.py:366 AKModel/views.py:412
 msgid "Mark Constraint Violations as manually resolved"
 msgstr "Markiere Constraintverletzungen als manuell behoben"
 
-#: AKModel/admin.py:372 AKModel/views.py:422
+#: AKModel/admin.py:371 AKModel/views.py:422
 msgid "Set Constraint Violations to level \"violation\""
 msgstr "Constraintverletzungen auf Level \"Violation\" setzen"
 
-#: AKModel/admin.py:377 AKModel/views.py:432
+#: AKModel/admin.py:376 AKModel/views.py:432
 msgid "Set Constraint Violations to level \"warning\""
 msgstr "Constraintverletzungen auf Level \"Warning\" setzen"
 
diff --git a/AKModel/models.py b/AKModel/models.py
index dee3b93e..a1896eac 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -73,7 +73,7 @@ class Event(models.Model):
             event = Event.objects.order_by('start').filter(start__gt=datetime.now()).first()
         return event
 
-    def get_categories_with_aks(self, wishes_seperately=False, filter=lambda ak: True):
+    def get_categories_with_aks(self, wishes_seperately=False, filter=lambda ak: True, hide_empty_categories=False):
         """
         Get AKCategories as well as a list of AKs belonging to the category for this event
 
@@ -97,7 +97,8 @@ class Event(models.Model):
                     else:
                         if filter(ak):
                             ak_list.append(ak)
-                categories_with_aks.append((category, ak_list))
+                if not hide_empty_categories or len(ak_list) > 0:
+                    categories_with_aks.append((category, ak_list))
             return categories_with_aks, ak_wishes
         else:
             for category in categories:
@@ -105,7 +106,8 @@ class Event(models.Model):
                 for ak in category.ak_set.all():
                     if filter(ak):
                         ak_list.append(ak)
-                categories_with_aks.append((category, ak_list))
+                if not hide_empty_categories or len(ak_list) > 0:
+                    categories_with_aks.append((category, ak_list))
             return categories_with_aks
 
     def get_unscheduled_wish_slots(self):
-- 
GitLab