From c3e84e852b61c42846425ce33834f337d010fe23 Mon Sep 17 00:00:00 2001
From: Dorian Lesbre <dorian.lesbre@gmail.com>
Date: Mon, 29 Mar 2021 16:06:26 +0200
Subject: [PATCH] Fix planning links for multiple activities

---
 home/admin.py                 |  3 ++-
 home/models.py                | 16 ++++++++++++++++
 home/templates/activites.html |  4 ++--
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/home/admin.py b/home/admin.py
index f6292eb..0d9b260 100644
--- a/home/admin.py
+++ b/home/admin.py
@@ -28,7 +28,8 @@ class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin):
 		"display",
 		"room", "start",
 		"on_planning",
-		"notes"
+		"notes",
+		"canonical",
 	)
 	list_per_page = 100
 	save_as = True # Allow to duplicate models
diff --git a/home/models.py b/home/models.py
index 2e6e16c..7220086 100644
--- a/home/models.py
+++ b/home/models.py
@@ -69,6 +69,14 @@ class InterludesActivity(models.Model):
 	start = models.DateTimeField("début", null=True, blank=True)
 	room = models.CharField("salle", max_length=100, null=True, blank=True)
 
+	canonical = models.ForeignKey("self",
+		on_delete=models.SET_NULL, null=True, blank=True,
+		verbose_name="Représentant canonique",
+		help_text="Si plusieurs copie d'une activité existe (pour plusieurs crénaux), "
+			"et une seule est affichée, sélectionner là dans les copie pour réparer les liens "
+			"du planning vers la description"
+	)
+
 	notes = models.TextField("Notes privées", max_length=2000, blank=True)
 
 	@property
@@ -106,6 +114,14 @@ class InterludesActivity(models.Model):
 			status_repr = "présentiel"
 		return "{} ({})".format(type, status_repr)
 
+	@property
+	def slug(self) -> str:
+		"""Returns the planning/display slug for this activity"""
+		id = self.id
+		if self.canonical:
+			id = self.canonical.id
+		return "act-{}".format(id)
+
 	def conflicts(self, other: "InterludesActivity") -> bool:
 		"""Check whether these activites overlap"""
 		if self.end is None or other.end is None:
diff --git a/home/templates/activites.html b/home/templates/activites.html
index 19d8246..fe74bbe 100644
--- a/home/templates/activites.html
+++ b/home/templates/activites.html
@@ -28,7 +28,7 @@
 				{% for act in planning %}
 				{
 					id: {{ act.id }},
-					content: '<a class="hidden" href="#act-{{act.id}}"><div><strong>{{ act.title }}</strong><br>{{ act.room }}</div></a>',
+					content: '<a class="hidden" href="#{{ act.slug }}"><div><strong>{{ act.title }}</strong><br>{{ act.room }}</div></a>',
 					title: '<strong>{{ act.title }}</strong><br>{{ act.room }}',
 					start: '{{ settings.date_start|date:"Y-m-d"}} {{ act.start|date:"H:i:s" }}',
 					align: 'left',
@@ -97,7 +97,7 @@
 	{% endif %}
 
 	{% for activity in activities %}
-		<h3 id="act-{{ activity.id }}">{{ activity.title }}</h3>
+		<h3 id="{{ activity.slug }}">{{ activity.title }}</h3>
 
 		<dl>
 			<dt>Durée :</dt><dd>{{ activity.pretty_duration }}</dd>
-- 
GitLab