From 0c202527912290371e1c9674e12feb3938cdc081 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Tue, 26 Mar 2024 17:40:00 -0400
Subject: [PATCH] feat: raise a ValidationError if a note for this timeslot
 already exists

---
 program/serializers.py | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/program/serializers.py b/program/serializers.py
index e1519964..deb5e163 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -28,6 +28,7 @@ from rest_framework.permissions import exceptions
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.core.exceptions import ObjectDoesNotExist
+from django.db import IntegrityError
 from django.utils import text, timezone
 from program.models import (
     Category,
@@ -1023,22 +1024,27 @@ class NoteSerializer(serializers.ModelSerializer):
         # optional foreign key
         validated_data["image"] = validated_data.pop("image", None)
 
-        note = Note.objects.create(
-            created_by=self.context.get("request").user.username,
-            **validated_data,
-        )
-
-        note.contributors.set(contributors)
-        note.language.set(language)
-        note.topic.set(topic)
+        try:
+            note = Note.objects.create(
+                created_by=self.context.get("request").user.username,
+                **validated_data,
+            )
+        except IntegrityError:
+            raise exceptions.ValidationError(
+                code="duplicate", detail="note for this timeslot already exists."
+            )
+        else:
+            note.contributors.set(contributors)
+            note.language.set(language)
+            note.topic.set(topic)
 
-        # optional nested objects
-        for link_data in links_data:
-            NoteLink.objects.create(note=note, **link_data)
+            # optional nested objects
+            for link_data in links_data:
+                NoteLink.objects.create(note=note, **link_data)
 
-        note.save()
+            note.save()
 
-        return note
+            return note
 
     def update(self, instance, validated_data):
         """Update and return an existing Note instance, given the validated data."""
-- 
GitLab