From cdba72e962ded51da17789fc722168f1bfdd67d7 Mon Sep 17 00:00:00 2001
From: Felix Blanke <felixblanke@uni-bonn.de>
Date: Wed, 2 Apr 2025 22:14:49 +0200
Subject: [PATCH] Catch errors from export and show them as error msg

---
 AKModel/models.py   |  1 -
 AKModel/views/ak.py | 26 ++++++++++++++++++++++----
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/AKModel/models.py b/AKModel/models.py
index 01831210..93021945 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -104,7 +104,6 @@ def merge_blocks(
                 current_block[-1] = current_block[-1].merge(slot)
             else:
                 # partial overlap of interiors -> not supported
-                # TODO: Show comprehensive message in production
                 raise ValueError(
                     "Partially overlapping timeslots are not supported!"
                     f" ({current_block[-1].avail.simplified}, {slot.avail.simplified})"
diff --git a/AKModel/views/ak.py b/AKModel/views/ak.py
index 461edd3a..6d64a751 100644
--- a/AKModel/views/ak.py
+++ b/AKModel/views/ak.py
@@ -1,6 +1,7 @@
 import json
 
 from django.contrib import messages
+from django.shortcuts import redirect
 from django.urls import reverse_lazy
 from django.utils.translation import gettext_lazy as _
 from django.views.generic import ListView, DetailView
@@ -51,12 +52,29 @@ class AKJSONExportView(AdminViewMixin, DetailView):
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
+        try:
+            data = context["event"].as_json_dict()
+            context["json_data_oneline"] = json.dumps(data)
+            context["json_data"] = json.dumps(data, indent=2)
+            context["is_valid"] = False
+        except ValueError as ex:
+            messages.add_message(
+                self.request,
+                messages.ERROR,
+                _("Exporting AKs for the solver failed! Reason: ") + str(ex),
+            )
+        return context
 
-        data = context["event"].as_json_dict()
-        context["json_data_oneline"] = json.dumps(data)
-        context["json_data"] = json.dumps(data, indent=2)
+    def get(self, request, *args, **kwargs):
+        self.object = self.get_object()
+        context = self.get_context_data(object=self.object)
+
+        # if serialization failed in `get_context_data` we redirect to
+        #   the status page and show a message instead
+        if not context.get("is_valid", False):
+            return redirect("admin:event_status", context["event"].slug)
+        return self.render_to_response(context)
 
-        return context
 
 class AKWikiExportView(AdminViewMixin, DetailView):
     """
-- 
GitLab