From 77521294e056dc58d018e1621ba8151f570a5e7d Mon Sep 17 00:00:00 2001
From: Dominik George <nik@naturalnet.de>
Date: Fri, 20 Aug 2021 14:39:50 +0200
Subject: [PATCH] Fix unique constraint on LessonDocumentation

(cherry picked from commit 95b4ee28ba1772b8057253dbc4f73f6a3b8496e0)
---
 CHANGELOG.rst                                 |  1 +
 .../0014_fix_unique_lesson_documentation.py   | 29 +++++++++++++++++++
 aleksis/apps/alsijil/models.py                | 12 ++++++--
 3 files changed, 40 insertions(+), 2 deletions(-)
 create mode 100644 aleksis/apps/alsijil/migrations/0014_fix_unique_lesson_documentation.py

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 87fcd470a..b28978116 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -27,6 +27,7 @@ Fixed
 
 * The _Delete personal note_ action didn't work due to wrong usage of ``bulk_update``.
 * Groups and persons were shown multiple times in some forms due to filtering by permissions.
+* Unique constraint on lesson documentations did not work and caused racey duplicates.
 
 `2.0rc4`_ - 2021-08-01
 ----------------------
diff --git a/aleksis/apps/alsijil/migrations/0014_fix_unique_lesson_documentation.py b/aleksis/apps/alsijil/migrations/0014_fix_unique_lesson_documentation.py
new file mode 100644
index 000000000..6ed00ec72
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0014_fix_unique_lesson_documentation.py
@@ -0,0 +1,29 @@
+# Generated by Django 3.2.3 on 2021-08-20 12:38
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('alsijil', '0013_fix_uniqueness_per_site'),
+    ]
+
+    operations = [
+        migrations.RemoveConstraint(
+            model_name='lessondocumentation',
+            name='unique_documentation_per_object',
+        ),
+        migrations.AddConstraint(
+            model_name='lessondocumentation',
+            constraint=models.UniqueConstraint(fields=('week', 'year', 'lesson_period'), name='unique_documentation_per_lp'),
+        ),
+        migrations.AddConstraint(
+            model_name='lessondocumentation',
+            constraint=models.UniqueConstraint(fields=('week', 'year', 'event'), name='unique_documentation_per_ev'),
+        ),
+        migrations.AddConstraint(
+            model_name='lessondocumentation',
+            constraint=models.UniqueConstraint(fields=('week', 'year', 'extra_lesson'), name='unique_documentation_per_el'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 51857750b..58292f435 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -373,8 +373,16 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
                 check=lesson_related_constraint_q, name="one_relation_only_lesson_documentation",
             ),
             models.UniqueConstraint(
-                fields=("lesson_period", "week", "year", "event", "extra_lesson"),
-                name="unique_documentation_per_object",
+                fields=("week", "year", "lesson_period"),
+                name="unique_documentation_per_lp",
+            ),
+            models.UniqueConstraint(
+                fields=("week", "year", "event"),
+                name="unique_documentation_per_ev",
+            ),
+            models.UniqueConstraint(
+                fields=("week", "year", "extra_lesson"),
+                name="unique_documentation_per_el",
             ),
         ]
 
-- 
GitLab