From edb655bcbc804c0bc3b214b56919c66ef01aae8e Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Wed, 6 Dec 2023 13:42:27 -0400
Subject: [PATCH] fix: handle optional many-to-many in update (PATCH) requests

Closes: #185
---
 program/serializers.py | 36 +++++++++++++++++++++++++++---------
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/program/serializers.py b/program/serializers.py
index 764a3cd2..a5383bff 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -548,12 +548,24 @@ class ShowSerializer(serializers.HyperlinkedModelSerializer):
         instance.slug = validated_data.get("slug", instance.slug)
         instance.type = validated_data.get("type_id", instance.type)
 
-        instance.category.set(validated_data.get("category", []))
-        instance.hosts.set(validated_data.get("hosts", []))
-        instance.language.set(validated_data.get("language", []))
-        instance.music_focus.set(validated_data.get("music_focus", []))
-        instance.owners.set(validated_data.get("owners", []))
-        instance.topic.set(validated_data.get("topic", []))
+        # optional many-to-many in PATCH requests
+        if (category := validated_data.get("category")) is not None:
+            instance.category.set(category)
+
+        if (hosts := validated_data.get("hosts")) is not None:
+            instance.hosts.set(hosts)
+
+        if (language := validated_data.get("language")) is not None:
+            instance.language.set(language)
+
+        if (music_focus := validated_data.get("music_focus")) is not None:
+            instance.music_focus.set(music_focus)
+
+        if (owners := validated_data.get("owners")) is not None:
+            instance.owners.set(owners)
+
+        if (topic := validated_data.get("topic")) is not None:
+            instance.topic.set(topic)
 
         if links_data := validated_data.get("links"):
             instance = delete_links(instance)
@@ -892,9 +904,15 @@ class NoteSerializer(serializers.ModelSerializer):
         instance.tags = validated_data.get("tags", instance.tags)
         instance.title = validated_data.get("title", instance.title)
 
-        instance.contributors.set(validated_data.get("contributors", []))
-        instance.language.set(validated_data.get("language", []))
-        instance.topic.set(validated_data.get("topic", []))
+        # optional many-to-many in PATCH requests
+        if (contributors := validated_data.get("contributors")) is not None:
+            instance.contributors.set(contributors)
+
+        if (language := validated_data.get("language")) is not None:
+            instance.language.set(language)
+
+        if (topic := validated_data.get("topic")) is not None:
+            instance.topic.set(topic)
 
         if cba_id := validated_data.get("cba_id"):
             if audio_url := get_audio_url(cba_id):
-- 
GitLab