From 38bc37e52bb87ab7fc3051f7e27fd6820ceb1793 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Mon, 12 Feb 2024 14:43:37 -0400
Subject: [PATCH] feat: catch integrity errors and return an error code and
 message

Closes: #188
---
 program/views.py | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/program/views.py b/program/views.py
index ffb7119a..187cd2ed 100644
--- a/program/views.py
+++ b/program/views.py
@@ -34,6 +34,7 @@ from rest_framework.response import Response
 
 from django.conf import settings
 from django.contrib.auth.models import User
+from django.db import IntegrityError
 from django.http import Http404, HttpResponse, JsonResponse
 from django.shortcuts import get_object_or_404
 from django.utils import timezone
@@ -383,7 +384,15 @@ class APIShowViewSet(DisabledObjectPermissionCheckMixin, viewsets.ModelViewSet):
         )
 
         if serializer.is_valid(raise_exception=True):
-            serializer.save()
+            try:
+                serializer.save()
+            except IntegrityError:
+                data = {
+                    "slug": {"code": "unique", "message": "show with this slug already exists."}
+                }
+
+                return Response(data, status=status.HTTP_400_BAD_REQUEST)
+
             return Response(serializer.data, status=status.HTTP_201_CREATED)
 
     def update(self, request, *args, **kwargs):
@@ -398,8 +407,15 @@ class APIShowViewSet(DisabledObjectPermissionCheckMixin, viewsets.ModelViewSet):
         )
 
         if serializer.is_valid(raise_exception=True):
-            serializer.save()
-            return Response(serializer.data)
+            try:
+                serializer.save()
+                return Response(serializer.data)
+            except IntegrityError:
+                data = {
+                    "slug": {"code": "unique", "message": "show with this slug already exists."}
+                }
+
+                return Response(data, status=status.HTTP_400_BAD_REQUEST)
 
     def partial_update(self, request, *args, **kwargs):
         kwargs["partial"] = True
-- 
GitLab