From 0f2f8dba3639e6d758eca29ed11911040ff284a3 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Tue, 25 Jan 2022 16:49:42 -0400
Subject: [PATCH] Implement get show by slug

---
 program/views.py | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/program/views.py b/program/views.py
index a6101bc5..4877b3e9 100644
--- a/program/views.py
+++ b/program/views.py
@@ -142,6 +142,18 @@ def int_or_none(key, kwargs):
     return int(kwargs[key]) if key in kwargs else None
 
 
+def pk_and_slug(kwargs):
+    pk = None
+    slug = None
+
+    try:
+        pk = int(kwargs['pk'])
+    except ValueError:
+        slug = kwargs['pk']
+
+    return pk, slug
+
+
 class APIUserViewSet(viewsets.ModelViewSet):
     """
     /users returns oneself. Superusers see all users. Only superusers may create a user (GET, POST)
@@ -231,7 +243,7 @@ class APIShowViewSet(viewsets.ModelViewSet):
     /shows/?category={category_pk} returns shows of a given category (GET)
     /shows/?topic={topic_pk} returns shows of a given topic (GET)
     /shows/?musicfocus={musicfocus_pk} returns shows of a given music focus (GET)
-    /shows/{pk} retrieves or updates (if owned) a single show (GET, PUT).
+    /shows/{pk|slug} retrieves or updates (if owned) a single show (GET, PUT).
 
     Only superusers may add and delete shows
     """
@@ -324,9 +336,10 @@ class APIShowViewSet(viewsets.ModelViewSet):
     def retrieve(self, request, *args, **kwargs):
         """Returns a single show"""
 
-        pk = int_or_none('pk', self.kwargs)
+        pk, slug = pk_and_slug(self.kwargs)
+
+        show = get_object_or_404(Show, pk=pk) if pk else get_object_or_404(Show, slug=slug) if slug else None
 
-        show = get_object_or_404(Show, pk=pk)
         serializer = ShowSerializer(show)
 
         return Response(serializer.data)
-- 
GitLab