From a39a5311c22cdee009b83d55edcdc242a6283650 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Fri, 24 Mar 2023 19:05:56 +0100
Subject: [PATCH 1/2] Introduce detail and edit URLs as properties in AK model

This way, the frontend views will be used when AKSubmission is installed and active, or otherwise the link to the built-in AK edit form in backend
This reduces the coupling between AKSubmission and other apps that previously needed that app
Use that new property in all places where previously an URL to the submission view was used (for consistency and to allow changes in one place in AKSubmission, too)
This implements #166
---
 AKDashboard/views.py                          |  6 ++---
 AKModel/admin.py                              |  2 +-
 AKModel/models.py                             | 13 +++++++++++
 .../admin/AKModel/render_ak_messages.html     |  2 +-
 .../admin/AKModel/requirements_overview.html  |  4 ++--
 AKPlan/templates/AKPlan/encode_events.html    |  2 +-
 AKPlan/templates/AKPlan/plan_room.html        |  2 +-
 AKPlan/templates/AKPlan/plan_track.html       |  2 +-
 AKPlan/templates/AKPlan/slots_table.html      |  2 +-
 .../admin/AKScheduling/special_attention.html |  8 +++----
 .../admin/AKScheduling/unscheduled.html       |  2 +-
 AKSubmission/models.py                        |  4 ++--
 .../templates/AKSubmission/ak_detail.html     |  2 +-
 .../templates/AKSubmission/ak_edit.html       |  2 +-
 .../templates/AKSubmission/ak_history.html    |  4 ++--
 .../AKSubmission/ak_linked_list_inline.html   |  2 +-
 .../templates/AKSubmission/ak_table.html      |  6 ++---
 .../templates/AKSubmission/akmessage_add.html |  4 ++--
 .../AKSubmission/akslot_add_update.html       |  4 ++--
 .../templates/AKSubmission/akslot_delete.html |  4 ++--
 AKSubmission/views.py                         | 22 ++++++++-----------
 21 files changed, 53 insertions(+), 46 deletions(-)

diff --git a/AKDashboard/views.py b/AKDashboard/views.py
index 5f2f5282..88e3443e 100644
--- a/AKDashboard/views.py
+++ b/AKDashboard/views.py
@@ -48,8 +48,7 @@ class DashboardEventView(DetailView):
                         text = _('AK "%(ak)s" deleted.') % {'ak': s.name}
                         icon = ('times', 'fas')
 
-                    recent_changes.append({'icon': icon, 'text': text, 'link': reverse_lazy('submit:ak_detail', kwargs={
-                        'event_slug': context['event'].slug, 'pk': s.id}), 'timestamp': s.history_date})
+                    recent_changes.append({'icon': icon, 'text': text, 'link': s.instance.detail_url, 'timestamp': s.history_date})
 
             # Changes in plan
             if apps.is_installed("AKPlan"):
@@ -59,8 +58,7 @@ class DashboardEventView(DetailView):
                     for changed_slot in last_changed_slots:
                         recent_changes.append({'icon': ('clock', 'far'),
                                                'text': _('AK "%(ak)s" (re-)scheduled.') % {'ak': changed_slot.ak.name},
-                                               'link': reverse_lazy('submit:ak_detail', kwargs={
-                                                   'event_slug': context['event'].slug, 'pk': changed_slot.ak.id}),
+                                               'link': changed_slot.ak.detail_url,
                                                'timestamp': changed_slot.updated})
 
             # Sort by change date...
diff --git a/AKModel/admin.py b/AKModel/admin.py
index a6e6b79e..ad8b7636 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -308,7 +308,7 @@ class AKSlotAdmin(admin.ModelAdmin):
     @display(description=_('AK Details'))
     def ak_details_link(self, akslot):
         if apps.is_installed("AKSubmission") and akslot.ak is not None:
-            link = f"<a href={reverse('submit:ak_detail', args=[akslot.event.slug, akslot.ak.pk])}>{str(akslot.ak)}</a>"
+            link = f"<a href={{ akslot.detail_url }}>{str(akslot.ak)}</a>"
             return mark_safe(link)
         return "-"
 
diff --git a/AKModel/models.py b/AKModel/models.py
index 5cf5fac7..45621af8 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -2,6 +2,7 @@ import itertools
 from datetime import timedelta
 
 from django.db import models
+from django.apps import apps
 from django.db.models import Count
 from django.urls import reverse_lazy
 from django.utils import timezone
@@ -326,6 +327,18 @@ class AK(models.Model):
     def availabilities(self):
         return "Availability".objects.filter(ak=self)
 
+    @property
+    def edit_url(self):
+        if apps.is_installed("AKScheduling"):
+            return reverse_lazy('submit:ak_edit', kwargs={'event_slug': self.event.slug, 'pk': self.id})
+        return reverse_lazy('admin:AKModel_ak_change', kwargs={'object_id': self.id})
+
+    @property
+    def detail_url(self):
+        if apps.is_installed("AKScheduling"):
+            return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.event.slug, 'pk': self.id})
+        return self.edit_url
+
 
 class Room(models.Model):
     """ A room describes where an AK can be held.
diff --git a/AKModel/templates/admin/AKModel/render_ak_messages.html b/AKModel/templates/admin/AKModel/render_ak_messages.html
index 9be788ec..e62ccbb7 100644
--- a/AKModel/templates/admin/AKModel/render_ak_messages.html
+++ b/AKModel/templates/admin/AKModel/render_ak_messages.html
@@ -4,7 +4,7 @@
         <span class="text-secondary float-end">
             {{ 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>
+        <h5><a href="{{ message.ak.detail_url }}">{{ message.ak }}</a></h5>
         <p>{{ message.text }}</p>
     </td></tr>
 {% endfor %}
diff --git a/AKModel/templates/admin/AKModel/requirements_overview.html b/AKModel/templates/admin/AKModel/requirements_overview.html
index b557a9c2..11d9ace2 100644
--- a/AKModel/templates/admin/AKModel/requirements_overview.html
+++ b/AKModel/templates/admin/AKModel/requirements_overview.html
@@ -23,11 +23,11 @@
                                 <td>{{ ak }}</td>
                                 {% if "AKSubmission"|check_app_installed %}
                                     <td class="text-end">
-                                        <a href="{% url 'submit:ak_detail' event_slug=ak.event.slug pk=ak.pk %}" data-bs-toggle="tooltip"
+                                        <a href="{{ ak.detail_url }}" data-bs-toggle="tooltip"
                                            title="{% trans 'Details' %}"
                                            class="btn btn-primary">{% fa6_icon 'info' 'fas' %}</a>
                                         {% if event.active %}
-                                            <a href="{% url 'submit:ak_edit' event_slug=event.slug pk=ak.pk %}" data-bs-toggle="tooltip"
+                                            <a href="{{ ak.edit_url }}" data-bs-toggle="tooltip"
                                                title="{% trans 'Edit' %}"
                                                class="btn btn-success">{% fa6_icon 'pencil-alt' 'fas' %}</a>
                                         {% endif %}
diff --git a/AKPlan/templates/AKPlan/encode_events.html b/AKPlan/templates/AKPlan/encode_events.html
index 10db556d..d9614f48 100644
--- a/AKPlan/templates/AKPlan/encode_events.html
+++ b/AKPlan/templates/AKPlan/encode_events.html
@@ -12,7 +12,7 @@
                 'resourceId': '{{ slot.room.title }}',
                 'backgroundColor': '{{ slot|highlight_change_colors }}',
                 'borderColor': '{{ slot.ak.category.color }}',
-                'url': '{% url 'submit:ak_detail' event_slug=event.slug pk=slot.ak.pk %}'
+                'url': '{{ slot.ak.detail_url }}'
             },
         {% endif %}
     {% endfor %}
diff --git a/AKPlan/templates/AKPlan/plan_room.html b/AKPlan/templates/AKPlan/plan_room.html
index 430fd9b0..c538e8b4 100644
--- a/AKPlan/templates/AKPlan/plan_room.html
+++ b/AKPlan/templates/AKPlan/plan_room.html
@@ -21,7 +21,7 @@
             {'title': '{{ slot.ak }}',
             'start': '{{ slot.start | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
             'end': '{{ slot.end | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
-            'url': '{% url 'submit:ak_detail' event_slug=event.slug pk=slot.ak.pk %}',
+            'url': '{{ slot.ak.detail_url }}',
             'borderColor': '{{ slot.ak.track.color }}',
             'color': '{{ slot.ak.category.color }}',
             },
diff --git a/AKPlan/templates/AKPlan/plan_track.html b/AKPlan/templates/AKPlan/plan_track.html
index 98e43078..bc4cfdd6 100644
--- a/AKPlan/templates/AKPlan/plan_track.html
+++ b/AKPlan/templates/AKPlan/plan_track.html
@@ -19,7 +19,7 @@
             {'title': '{{ slot.ak }} @ {{ slot.room }}',
             'start': '{{ slot.start | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
             'end': '{{ slot.end | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
-            'url': '{% url 'submit:ak_detail' event_slug=event.slug pk=slot.ak.pk %}',
+            'url': '{{ slot.ak.detail_url }}',
             'color': '{{ track.color }}',
             'borderColor': '{{ slot.ak.category.color }}',
             },
diff --git a/AKPlan/templates/AKPlan/slots_table.html b/AKPlan/templates/AKPlan/slots_table.html
index a9d0b7a6..5401126e 100644
--- a/AKPlan/templates/AKPlan/slots_table.html
+++ b/AKPlan/templates/AKPlan/slots_table.html
@@ -4,7 +4,7 @@
 <table class="table table-striped">
     {% for akslot in slots %}
     <tr>
-        <td class="breakWord"><b><a href="{% url 'submit:ak_detail' event_slug=event.slug pk=akslot.ak.pk %}">{{ akslot.ak.name }}</a></b></td>
+        <td class="breakWord"><b><a href="{{ akslot.ak.detail_url }}">{{ akslot.ak.name }}</a></b></td>
         <td>{{ akslot.start | time:"H:i" }} - {{ akslot.end | time:"H:i" }}</td>
         <td class="breakWord">{% if akslot.room and akslot.room.pk != '' %}
             <a href="{% url 'plan:plan_room' event_slug=event.slug pk=akslot.room.pk %}">{{ akslot.room }}</a>
diff --git a/AKScheduling/templates/admin/AKScheduling/special_attention.html b/AKScheduling/templates/admin/AKScheduling/special_attention.html
index f0cc5f58..7591cdb5 100644
--- a/AKScheduling/templates/admin/AKScheduling/special_attention.html
+++ b/AKScheduling/templates/admin/AKScheduling/special_attention.html
@@ -13,14 +13,14 @@
 {% block content %}
     <h4 class="mt-4 mb-4">{% trans "AKs with public notes" %}</h4>
     {% for ak in aks_with_comment %}
-        <a href="{% url "submit:ak_edit" event_slug=event.slug pk=ak.pk %}">{{ ak }}</a><br>{{ ak.notes }}<br><br>
+        <a href="{{ ak.edit_url }}">{{ ak }}</a><br>{{ ak.notes }}<br><br>
     {% empty %}
         -
     {% endfor %}
 
     <h4 class="mt-4 mb-4">{% trans "AKs without availabilities" %}</h4>
     {% for ak in aks_without_availabilities %}
-        <a href="{% url "submit:ak_edit" event_slug=event.slug pk=ak.pk %}">{{ ak }}</a><br>
+        <a href="{{ ak.edit_url }}">{{ ak }}</a><br>
     {% empty %}
         -<br>
     {% endfor %}
@@ -30,7 +30,7 @@
 
     <h4 class="mt-4 mb-4">{% trans "AK wishes with slots" %}</h4>
     {% for ak in ak_wishes_with_slots %}
-        <a href="{% url "submit:ak_detail" event_slug=event.slug pk=ak.pk %}">{{ ak }}</a> <a href="{% url "admin:AKModel_akslot_changelist" %}?ak={{ ak.pk }}">({{ ak.akslot__count }})</a><br>
+        <a href="{{ ak.detail_url }}">{{ ak }}</a> <a href="{% url "admin:AKModel_akslot_changelist" %}?ak={{ ak.pk }}">({{ ak.akslot__count }})</a><br>
     {% empty %}
         -<br>
     {% endfor %}
@@ -39,7 +39,7 @@
 
     <h4 class="mt-4 mb-4">{% trans "AKs without slots" %}</h4>
     {% for ak in aks_without_slots %}
-        <a href="{% url "submit:ak_detail" event_slug=event.slug pk=ak.pk %}">{{ ak }}</a><br>
+        <a href="{{ ak.detail_url }}">{{ ak }}</a><br>
     {% empty %}
         -<br>
     {% endfor %}
diff --git a/AKScheduling/templates/admin/AKScheduling/unscheduled.html b/AKScheduling/templates/admin/AKScheduling/unscheduled.html
index 18bbe051..f78d435d 100644
--- a/AKScheduling/templates/admin/AKScheduling/unscheduled.html
+++ b/AKScheduling/templates/admin/AKScheduling/unscheduled.html
@@ -17,7 +17,7 @@
         <li>
             {% with group.grouper as ak %}
                 {% if "AKSubmission"|check_app_installed %}
-                    <a href="{% url 'submit:ak_detail' event_slug=ak.event.slug pk=ak.pk %}">{{ ak }}</a>
+                    <a href="{{ ak.detail_url }}">{{ ak }}</a>
                 {% else %}
                     {{ ak }}
                 {% endif %}
diff --git a/AKSubmission/models.py b/AKSubmission/models.py
index cd8a855b..ef1bff7a 100644
--- a/AKSubmission/models.py
+++ b/AKSubmission/models.py
@@ -14,7 +14,7 @@ def orga_message_saved_handler(sender, instance: AKOrgaMessage, created, **kwarg
 
     if created and settings.SEND_MAILS:
         host = 'https://' + settings.ALLOWED_HOSTS[0] if len(settings.ALLOWED_HOSTS) > 0 else 'http://127.0.0.1:8000'
-        url = f"{host}{reverse_lazy('submit:ak_detail', kwargs={'pk': instance.ak.pk, 'event_slug': instance.ak.event.slug})}"
+        url = f"{host}{instance.ak.detail_url}"
 
         mail = EmailMessage(
             f"[AKPlanning] New message for AK '{instance.ak}' ({instance.ak.event})",
@@ -31,7 +31,7 @@ def slot_created_handler(sender, instance: AKSlot, created, **kwargs):
 
     if created and settings.SEND_MAILS and apps.is_installed("AKPlan") and not instance.event.plan_hidden and instance.room is None and instance.start is None:
         host = 'https://' + settings.ALLOWED_HOSTS[0] if len(settings.ALLOWED_HOSTS) > 0 else 'http://127.0.0.1:8000'
-        url = f"{host}{reverse_lazy('submit:ak_detail', kwargs={'pk': instance.ak.pk, 'event_slug': instance.ak.event.slug})}"
+        url = f"{host}{instance.ak.detail_url}"
 
         mail = EmailMessage(
             f"[AKPlanning] New slot for AK '{instance.ak}' ({instance.ak.event}) added",
diff --git a/AKSubmission/templates/AKSubmission/ak_detail.html b/AKSubmission/templates/AKSubmission/ak_detail.html
index eba22297..41433189 100644
--- a/AKSubmission/templates/AKSubmission/ak_detail.html
+++ b/AKSubmission/templates/AKSubmission/ak_detail.html
@@ -120,7 +120,7 @@
             <a href="{% url 'submit:akmessage_add' event_slug=ak.event.slug pk=ak.pk %}" data-bs-toggle="tooltip"
                title="{% trans 'Add confidential message to organizers' %}"
                class="btn btn-warning">{% fa6_icon 'envelope' 'fas' %}</a>
-            <a href="{% url 'submit:ak_edit' event_slug=ak.event.slug pk=ak.pk %}" data-bs-toggle="tooltip"
+            <a href="{{ ak.edit_url }}" data-bs-toggle="tooltip"
                title="{% trans 'Edit' %}"
                class="btn btn-success">{% fa6_icon 'pencil-alt' 'fas' %}</a>
         {% endif %}
diff --git a/AKSubmission/templates/AKSubmission/ak_edit.html b/AKSubmission/templates/AKSubmission/ak_edit.html
index 72dff0d1..4ef14eec 100644
--- a/AKSubmission/templates/AKSubmission/ak_edit.html
+++ b/AKSubmission/templates/AKSubmission/ak_edit.html
@@ -12,7 +12,7 @@
     <li class="breadcrumb-item"><a
             href="{% url 'submit:submission_overview' event_slug=event.slug %}">{% trans "AK Submission" %}</a></li>
     <li class="breadcrumb-item"><a
-            href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}">{{ ak.short_name }}</a></li>
+            href="{{ ak.detail_url }}">{{ ak.short_name }}</a></li>
     <li class="breadcrumb-item active">{% trans "Edit" %}</li>
 {% endblock %}
 
diff --git a/AKSubmission/templates/AKSubmission/ak_history.html b/AKSubmission/templates/AKSubmission/ak_history.html
index bcc8963c..b5306506 100644
--- a/AKSubmission/templates/AKSubmission/ak_history.html
+++ b/AKSubmission/templates/AKSubmission/ak_history.html
@@ -15,7 +15,7 @@
     <li class="breadcrumb-item"><a
             href="{% url 'submit:submission_overview' event_slug=ak.event.slug %}">{% trans "AK Submission" %}</a></li>
     <li class="breadcrumb-item"><a
-            href='{% url 'submit:ak_detail' event_slug=ak.event.slug pk=ak.pk %}'>{{ ak.short_name }}</a></li>
+            href='{{ ak.detail_url }}'>{{ ak.short_name }}</a></li>
     <li class="breadcrumb-item active">{% trans 'History' %}</li>
 {% endblock %}
 
@@ -23,7 +23,7 @@
     {% include "messages.html" %}
 
     <div class="float-end">
-        <a href='{% url 'submit:ak_detail' event_slug=ak.event.slug pk=ak.pk %}' data-bs-toggle="tooltip"
+        <a href='{{ ak.detail_url }}' data-bs-toggle="tooltip"
            title="{% trans 'Back' %}"
            class="btn btn-info">{% fa6_icon 'arrow-circle-left' 'fas' %}</a>
     </div>
diff --git a/AKSubmission/templates/AKSubmission/ak_linked_list_inline.html b/AKSubmission/templates/AKSubmission/ak_linked_list_inline.html
index f5b504f7..dd7f7cce 100644
--- a/AKSubmission/templates/AKSubmission/ak_linked_list_inline.html
+++ b/AKSubmission/templates/AKSubmission/ak_linked_list_inline.html
@@ -2,7 +2,7 @@
     {% if forloop.counter0 > 0 %}
         ,&nbsp;
     {% endif %}
-    <a href="{% url 'submit:ak_detail' event_slug=slug pk=ak.pk %}">{{ ak }}</a>
+    <a href="{{ ak.detail_url }}">{{ ak }}</a>
 {% empty %}
     -
 {% endfor %}
diff --git a/AKSubmission/templates/AKSubmission/ak_table.html b/AKSubmission/templates/AKSubmission/ak_table.html
index d856a896..775e95e0 100644
--- a/AKSubmission/templates/AKSubmission/ak_table.html
+++ b/AKSubmission/templates/AKSubmission/ak_table.html
@@ -16,7 +16,7 @@
     {% for ak in AKs %}
         <tr>
             <td>
-                <a href="{% url 'submit:ak_detail' event_slug=ak.event.slug pk=ak.pk %}"
+                <a href="{{ ak.detail_url }}"
                       class="text-dark text-decoration-none font-weight-bold">
                     {{ ak.name }}
                 </a>
@@ -38,7 +38,7 @@
             </td>
             <td>{% category_linked_badge ak.category event.slug %}</td>
             <td class="text-end" style="white-space: nowrap;">
-                <a href="{% url 'submit:ak_detail' event_slug=ak.event.slug pk=ak.pk %}" data-bs-toggle="tooltip"
+                <a href="{{ ak.detail_url }}" data-bs-toggle="tooltip"
                    title="{% trans 'Details' %}"
                    class="btn btn-primary">{% fa6_icon 'info' 'fas' %}</a>
                 {% if ak.link %}
@@ -47,7 +47,7 @@
                        class="btn btn-info">{% fa6_icon 'external-link-alt' 'fas' %}</a>
                 {% endif %}
                 {% if event.active %}
-                    <a href="{% url 'submit:ak_edit' event_slug=event.slug pk=ak.pk %}" data-bs-toggle="tooltip"
+                    <a href="{{ ak.edit_url }}" data-bs-toggle="tooltip"
                        title="{% trans 'Edit' %}"
                        class="btn btn-success">{% fa6_icon 'pencil-alt' 'fas' %}</a>
                     {% if interest_indication_active %}
diff --git a/AKSubmission/templates/AKSubmission/akmessage_add.html b/AKSubmission/templates/AKSubmission/akmessage_add.html
index ea85b8c9..2dd17e01 100644
--- a/AKSubmission/templates/AKSubmission/akmessage_add.html
+++ b/AKSubmission/templates/AKSubmission/akmessage_add.html
@@ -12,7 +12,7 @@
     <li class="breadcrumb-item"><a
             href="{% url 'submit:submission_overview' event_slug=event.slug %}">{% trans "AK Submission" %}</a></li>
     <li class="breadcrumb-item"><a
-            href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}">{{ ak.short_name }}</a></li>
+            href="{{ ak.detail_url }}">{{ ak.short_name }}</a></li>
     <li class="breadcrumb-item active">{% trans "Add confidential message to organizers" %}</li>
 {% endblock %}
 
@@ -31,7 +31,7 @@
             {% fa6_icon "undo-alt" 'fas' %} {% trans "Reset Form" %}
         </button>
 
-        <a href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}" class="btn btn-secondary">
+        <a href="{{ ak.detail_url }}" class="btn btn-secondary">
             {% fa6_icon "times" 'fas' %} {% trans "Cancel" %}
         </a>
     </form>
diff --git a/AKSubmission/templates/AKSubmission/akslot_add_update.html b/AKSubmission/templates/AKSubmission/akslot_add_update.html
index ac0d6d13..c650b084 100644
--- a/AKSubmission/templates/AKSubmission/akslot_add_update.html
+++ b/AKSubmission/templates/AKSubmission/akslot_add_update.html
@@ -11,7 +11,7 @@
     <li class="breadcrumb-item"><a
             href="{% url 'submit:submission_overview' event_slug=event.slug %}">{% trans "AK Submission" %}</a></li>
     <li class="breadcrumb-item"><a
-            href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}">{{ ak.short_name }}</a></li>
+            href="{{ ak.detail_url }}">{{ ak.short_name }}</a></li>
     <li class="breadcrumb-item active">{% trans "AK Duration(s)" %}</li>
 {% endblock %}
 
@@ -29,7 +29,7 @@
             {% fa6_icon "undo-alt" 'fas' %} {% trans "Reset Form" %}
         </button>
 
-        <a href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}" class="btn btn-secondary">
+        <a href="{{ ak.detail_url }}" class="btn btn-secondary">
             {% fa6_icon "times" 'fas' %} {% trans "Cancel" %}
         </a>
     </form>
diff --git a/AKSubmission/templates/AKSubmission/akslot_delete.html b/AKSubmission/templates/AKSubmission/akslot_delete.html
index 613d69a5..d2599872 100644
--- a/AKSubmission/templates/AKSubmission/akslot_delete.html
+++ b/AKSubmission/templates/AKSubmission/akslot_delete.html
@@ -11,7 +11,7 @@
     <li class="breadcrumb-item"><a
             href="{% url 'submit:submission_overview' event_slug=event.slug %}">{% trans "AK Submission" %}</a></li>
     <li class="breadcrumb-item"><a
-            href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}">{{ ak.short_name }}</a></li>
+            href="{{ ak.detail_url }}">{{ ak.short_name }}</a></li>
     <li class="breadcrumb-item active">{% trans "AK Duration(s)" %}</li>
 {% endblock %}
 
@@ -41,7 +41,7 @@
             {% fa6_icon "check" 'fas' %} {% trans "Confirm" %}
         </button>
 
-        <a href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}" class="btn btn-secondary">
+        <a href="{{ ak.detail_url }}" class="btn btn-secondary">
             {% fa6_icon "times" 'fas' %} {% trans "Cancel" %}
         </a>
     </form>
diff --git a/AKSubmission/views.py b/AKSubmission/views.py
index 5f3f42b9..1b865843 100644
--- a/AKSubmission/views.py
+++ b/AKSubmission/views.py
@@ -199,7 +199,7 @@ class AKAndAKWishSubmissionView(EventSlugMixin, EventInactiveRedirectMixin, Crea
 
     def get_success_url(self):
         messages.add_message(self.request, messages.SUCCESS, _("AK successfully created"))
-        return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.pk})
+        return self.object.detail_url
 
     def form_valid(self, form):
         if not form.cleaned_data["event"].active:
@@ -249,7 +249,7 @@ class AKEditView(EventSlugMixin, EventInactiveRedirectMixin, UpdateView):
 
     def get_success_url(self):
         messages.add_message(self.request, messages.SUCCESS, _("AK successfully updated"))
-        return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.pk})
+        return self.object.detail_url
 
     def form_valid(self, form):
         if not form.cleaned_data["event"].active:
@@ -287,7 +287,7 @@ class AKOwnerCreateView(EventSlugMixin, EventInactiveRedirectMixin, CreateView):
             ak.owners.add(self.object)
             messages.add_message(self.request, messages.SUCCESS,
                                  _("Added '{owner}' as new owner of '{ak.name}'").format(owner=self.object, ak=ak))
-            return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.kwargs['event_slug'], 'pk': ak.pk})
+            return ak.detail_url
         return reverse_lazy('submit:submit_ak',
                             kwargs={'event_slug': self.kwargs['event_slug'], 'owner_slug': self.object.slug})
 
@@ -375,8 +375,7 @@ class AKSlotAddView(EventSlugMixin, EventInactiveRedirectMixin, CreateView):
 
     def get_success_url(self):
         messages.add_message(self.request, messages.SUCCESS, _("AK Slot successfully added"))
-        return reverse_lazy('submit:ak_detail',
-                            kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.ak.pk})
+        return self.object.ak.detail_url
 
 
 class AKSlotEditView(EventSlugMixin, EventInactiveRedirectMixin, UpdateView):
@@ -389,7 +388,7 @@ class AKSlotEditView(EventSlugMixin, EventInactiveRedirectMixin, UpdateView):
         if akslot.start is not None:
             messages.add_message(self.request, messages.WARNING,
                                  _("You cannot edit a slot that has already been scheduled"))
-            return redirect('submit:ak_detail', event_slug=self.kwargs['event_slug'], pk=akslot.ak.pk)
+            return HttpResponseRedirect(akslot.ak.detail_url)
         return super().get(request, *args, **kwargs)
 
     def get_context_data(self, *, object_list=None, **kwargs):
@@ -399,8 +398,7 @@ class AKSlotEditView(EventSlugMixin, EventInactiveRedirectMixin, UpdateView):
 
     def get_success_url(self):
         messages.add_message(self.request, messages.SUCCESS, _("AK Slot successfully updated"))
-        return reverse_lazy('submit:ak_detail',
-                            kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.ak.pk})
+        return self.object.ak.detail_url
 
 
 class AKSlotDeleteView(EventSlugMixin, EventInactiveRedirectMixin, DeleteView):
@@ -412,7 +410,7 @@ class AKSlotDeleteView(EventSlugMixin, EventInactiveRedirectMixin, DeleteView):
         if akslot.start is not None:
             messages.add_message(self.request, messages.WARNING,
                                  _("You cannot delete a slot that has already been scheduled"))
-            return redirect('submit:ak_detail', event_slug=self.kwargs['event_slug'], pk=akslot.ak.pk)
+            return HttpResponseRedirect(akslot.ak.detail_url)
         return super().get(request, *args, **kwargs)
 
     def get_context_data(self, *, object_list=None, **kwargs):
@@ -422,8 +420,7 @@ class AKSlotDeleteView(EventSlugMixin, EventInactiveRedirectMixin, DeleteView):
 
     def get_success_url(self):
         messages.add_message(self.request, messages.SUCCESS, _("AK Slot successfully deleted"))
-        return reverse_lazy('submit:ak_detail',
-                            kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.ak.pk})
+        return self.object.ak.detail_url
 
 
 class AKAddOrgaMessageView(EventSlugMixin, CreateView):
@@ -444,5 +441,4 @@ class AKAddOrgaMessageView(EventSlugMixin, CreateView):
 
     def get_success_url(self):
         messages.add_message(self.request, messages.SUCCESS, _("Message to organizers successfully saved"))
-        return reverse_lazy('submit:ak_detail',
-                            kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.ak.pk})
+        return self.object.ak.detail_url
-- 
GitLab


From a867f11cfe500e79cfcc0878d6ec0663fa4c6969 Mon Sep 17 00:00:00 2001
From: Nadja Geisler <ngeisler@fachschaft.informatik.tu-darmstadt.de>
Date: Mon, 15 May 2023 17:53:44 +0000
Subject: [PATCH 2/2] fix faulty App requirement

---
 AKModel/models.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/AKModel/models.py b/AKModel/models.py
index 45621af8..d37a7d02 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -329,13 +329,13 @@ class AK(models.Model):
 
     @property
     def edit_url(self):
-        if apps.is_installed("AKScheduling"):
+        if apps.is_installed("AKSubmission"):
             return reverse_lazy('submit:ak_edit', kwargs={'event_slug': self.event.slug, 'pk': self.id})
         return reverse_lazy('admin:AKModel_ak_change', kwargs={'object_id': self.id})
 
     @property
     def detail_url(self):
-        if apps.is_installed("AKScheduling"):
+        if apps.is_installed("AKSubmission"):
             return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.event.slug, 'pk': self.id})
         return self.edit_url
 
-- 
GitLab