From fc9d9c1c15d288af135352c3e75021a630734e1f Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Thu, 23 Nov 2023 15:52:54 -0400
Subject: [PATCH] fix: allow to set empty fields when updating Show and Note

Closes: #178
---
 program/serializers.py | 48 +++++++++++++-----------------------------
 1 file changed, 15 insertions(+), 33 deletions(-)

diff --git a/program/serializers.py b/program/serializers.py
index ea70b69b..764a3cd2 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -548,23 +548,12 @@ class ShowSerializer(serializers.HyperlinkedModelSerializer):
         instance.slug = validated_data.get("slug", instance.slug)
         instance.type = validated_data.get("type_id", instance.type)
 
-        if category := validated_data.get("category"):
-            instance.category.set(category)
-
-        if hosts := validated_data.get("hosts"):
-            instance.hosts.set(hosts)
-
-        if language := validated_data.get("language"):
-            instance.language.set(language)
-
-        if music_focus := validated_data.get("music_focus"):
-            instance.music_focus.set(music_focus)
-
-        if owners := validated_data.get("owners"):
-            instance.owners.set(owners)
-
-        if topic := validated_data.get("topic"):
-            instance.topic.set(topic)
+        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", []))
 
         if links_data := validated_data.get("links"):
             instance = delete_links(instance)
@@ -779,7 +768,6 @@ class TimeSlotSerializer(serializers.ModelSerializer):
         instance.repetition_of = validated_data.get("repetition_of_id", instance.repetition_of)
         instance.playlist_id = validated_data.get("playlist_id", instance.playlist_id)
 
-
         instance.save()
         return instance
 
@@ -790,17 +778,15 @@ class NoteLinkSerializer(serializers.ModelSerializer):
         fields = ("type", "url")
 
 
-tags_json_schema = {
-  "type": "array",
-  "items": {
-    "type": "string"
-  }
-}
+tags_json_schema = {"type": "array", "items": {"type": "string"}}
 
 
 class NoteSerializer(serializers.ModelSerializer):
     contributor_ids = serializers.PrimaryKeyRelatedField(
-        many=True, queryset=Host.objects.all(), required=False, source="contributors",
+        many=True,
+        queryset=Host.objects.all(),
+        required=False,
+        source="contributors",
     )
     image_id = serializers.PrimaryKeyRelatedField(
         queryset=Image.objects.all(), required=False, allow_null=True
@@ -864,6 +850,7 @@ class NoteSerializer(serializers.ModelSerializer):
 
         show = validated_data["timeslot"].schedule.show
 
+        # we derive `contributors`, `language` and `topic` from the Show's values if not set
         contributors = validated_data.pop("contributors", show.owners.values_list("id", flat=True))
         language = validated_data.pop("language", show.language.values_list("id", flat=True))
         topic = validated_data.pop("topic", show.topic.values_list("id", flat=True))
@@ -905,8 +892,9 @@ class NoteSerializer(serializers.ModelSerializer):
         instance.tags = validated_data.get("tags", instance.tags)
         instance.title = validated_data.get("title", instance.title)
 
-        if contributors := validated_data.get("contributors", []):
-            instance.contributors.set(contributors)
+        instance.contributors.set(validated_data.get("contributors", []))
+        instance.language.set(validated_data.get("language", []))
+        instance.topic.set(validated_data.get("topic", []))
 
         if cba_id := validated_data.get("cba_id"):
             if audio_url := get_audio_url(cba_id):
@@ -918,12 +906,6 @@ class NoteSerializer(serializers.ModelSerializer):
             for link_data in links_data:
                 NoteLink.objects.create(note=instance, **link_data)
 
-        if language := validated_data.get("language", []):
-            instance.language.set(language)
-
-        if topic := validated_data.get("topic", []):
-            instance.topic.set(topic)
-
         instance.updated_by = self.context.get("request").user.username
 
         instance.save()
-- 
GitLab