From cfdceeed515a3fa9603f3c9f93ed71ec277714b7 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Mon, 31 Jan 2022 12:57:03 -0400
Subject: [PATCH] Add LinkSerializer and modify HostSerializer to handle nested
 links

---
 program/serializers.py | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/program/serializers.py b/program/serializers.py
index 483d1cdc..b6098d2a 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -26,7 +26,7 @@ from rest_framework import serializers
 from profile.models import Profile
 from profile.serializers import ProfileSerializer
 from program.models import Show, Schedule, TimeSlot, Category, FundingCategory, Host, Topic, MusicFocus, Note, Type, Language, \
-    RRule
+    RRule, Link
 from steering.settings import THUMBNAIL_SIZES
 
 
@@ -111,7 +111,14 @@ class CategorySerializer(serializers.ModelSerializer):
         return instance
 
 
+class LinkSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Link
+        fields = ('description', 'url')
+
+
 class HostSerializer(serializers.ModelSerializer):
+    links = LinkSerializer(many=True)
     thumbnails = serializers.SerializerMethodField()  # Read-only
 
     @staticmethod
@@ -129,6 +136,15 @@ class HostSerializer(serializers.ModelSerializer):
         model = Host
         fields = '__all__'
 
+    def create(self, validated_data):
+        links_data = validated_data.pop('links')
+        host = Host.objects.create(**validated_data)
+
+        for link_data in links_data:
+            Link.objects.create(host=host, **link_data)
+        host.save()
+        return host
+
     def update(self, instance, validated_data):
         """
         Update and return an existing Host instance, given the validated data.
@@ -142,7 +158,14 @@ class HostSerializer(serializers.ModelSerializer):
         instance.image = validated_data.get('image', instance.image)
         instance.ppoi = validated_data.get('ppoi', instance.ppoi)
 
+        for link in instance.links.all():
+            link.delete(keep_parents=True)
+
+        for link_data in validated_data.get('links'):
+            Link.objects.create(host=instance, **link_data)
+
         instance.save()
+
         return instance
 
 
-- 
GitLab