From dcafb7699896b11947e7da917b6fc7749a27d4f3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sun, 21 Apr 2024 17:28:36 +0200
Subject: [PATCH] Move link-autogeneration from submission form to model and
 disable frontend editing

This ensures that it is always called when new AKs are created.
Additionally, editing of links in frontend is disabled, preventing diverging links between our tool and the wiki export.
This fixes #193 and #204.
---
 AKModel/models.py     | 13 ++++++++++++-
 AKSubmission/forms.py |  9 +--------
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/AKModel/models.py b/AKModel/models.py
index 3908a1a1..6d484989 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -317,7 +317,7 @@ class AK(models.Model):
     owners = models.ManyToManyField(to=AKOwner, blank=True, verbose_name=_('Owners'),
                                     help_text=_('Those organizing the AK'))
 
-    # TODO generate automatically
+    # Will be automatically generated in save method if not set
     link = models.URLField(blank=True, verbose_name=_('Web Link'), help_text=_('Link to wiki page'))
     protocol_link = models.URLField(blank=True, verbose_name=_('Protocol Link'), help_text=_('Link to protocol'))
 
@@ -466,6 +466,17 @@ class AK(models.Model):
             return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.event.slug, 'pk': self.id})
         return self.edit_url
 
+    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
+        # Auto-Generate Link if not set yet
+        if self.link == "":
+            link = self.event.base_url + self.name.replace(" ", "_")
+            # Truncate links longer than 200 characters (default length of URL fields in django)
+            self.link = link[:200]
+            # Tell Django that we have updated the link field
+            if update_fields is not None:
+                update_fields = {"link"}.union(update_fields)
+        super().save(force_insert, force_update, using, update_fields)
+
 
 class Room(models.Model):
     """ A room describes where an AK can be held.
diff --git a/AKSubmission/forms.py b/AKSubmission/forms.py
index 1ee786d2..f7187ade 100644
--- a/AKSubmission/forms.py
+++ b/AKSubmission/forms.py
@@ -33,7 +33,6 @@ class AKForm(AvailabilitiesFormMixin, forms.ModelForm):
         model = AK
         fields = ['name',
                   'short_name',
-                  'link',
                   'protocol_link',
                   'owners',
                   'description',
@@ -101,7 +100,7 @@ class AKForm(AvailabilitiesFormMixin, forms.ModelForm):
         """
         Normalize/clean inputs
 
-        Generate a (not yet used) short name if field was left blank, generate a wiki link,
+        Generate a (not yet used) short name if field was left blank,
         create a list of normalized slot durations
 
         :return: cleaned inputs
@@ -128,12 +127,6 @@ class AKForm(AvailabilitiesFormMixin, forms.ModelForm):
                 short_name = f'{short_name[:-(digits + 1)]}-{i}'
             cleaned_data["short_name"] = short_name
 
-        # Generate wiki link
-        if self.cleaned_data["event"].base_url:
-            link = self.cleaned_data["event"].base_url + self.cleaned_data["name"].replace(" ", "_")
-            # Truncate links longer than 200 characters (default length of URL fields in django)
-            self.cleaned_data["link"] = link[:200]
-
         # Get durations from raw durations field
         if "durations" in cleaned_data:
             cleaned_data["durations"] = [self._clean_duration(d) for d in self.cleaned_data["durations"].split()]
-- 
GitLab