diff --git a/program/serializers.py b/program/serializers.py index 21f4b476a61245ad29cb7a1d4d3782a2b0982b5b..6b4b37672ea024ccd9d27c85afc96d99cc101825 100644 --- a/program/serializers.py +++ b/program/serializers.py @@ -46,7 +46,7 @@ from program.models import ( Type, UserProfile, ) -from program.utils import get_audio_url +from program.utils import delete_links, get_audio_url from steering.settings import THUMBNAIL_SIZES SOLUTION_CHOICES = { @@ -259,45 +259,42 @@ class ImageSerializer(serializers.ModelSerializer): return instance -class HostSerializer(ThumbnailsMixin, serializers.ModelSerializer): +class HostSerializer(serializers.ModelSerializer): + image = serializers.PrimaryKeyRelatedField(queryset=Image.objects.all(), required=False) links = HostLinkSerializer(many=True, required=False) - thumbnails = serializers.SerializerMethodField() class Meta: model = Host - fields = ( - "biography", - "email", - "is_active", - "links", - "name", - "thumbnails", - # ModelWithImageFields - "image", - "image_alt_text", - "image_credits", - "image_height", - "image_ppoi", - "image_width", - # ModelWithCreatedUpdatedFields - "created_at", - "created_by", - "updated_at", - "updated_by", - ) read_only_fields = ( "created_at", "created_by", "updated_at", "updated_by", ) + fields = ( + "biography", + "email", + "id", + "image", + "is_active", + "links", + "name", + ) + read_only_fields def create(self, validated_data): + """ + Create and return a new Host instance, given the validated data. + """ + links_data = validated_data.pop("links", []) - host = Host.objects.create(**validated_data | self.context) + + host = Host.objects.create(**validated_data | self.context) # created_by + for link_data in links_data: HostLink.objects.create(host=host, **link_data) + host.save() + return host def update(self, instance, validated_data): @@ -305,24 +302,20 @@ class HostSerializer(ThumbnailsMixin, serializers.ModelSerializer): Update and return an existing Host instance, given the validated data. """ - instance.name = validated_data.get("name", instance.name) - instance.is_active = validated_data.get("is_active", instance.is_active) - instance.email = validated_data.get("email", instance.email) instance.biography = validated_data.get("biography", instance.biography) + instance.email = validated_data.get("email", instance.email) instance.image = validated_data.get("image", instance.image) - instance.image_ppoi = validated_data.get("image_ppoi", instance.image_ppoi) - instance.image_credits = validated_data.get("image_credits", instance.image_credits) - instance.image_alt_text = validated_data.get("image_alt_text", instance.image_alt_text) - instance.updated_by = self.context.get("updated_by") - - if instance.links.count() > 0: - for link in instance.links.all(): - link.delete(keep_parents=True) + instance.is_active = validated_data.get("is_active", instance.is_active) + instance.name = validated_data.get("name", instance.name) if links_data := validated_data.get("links"): + instance = delete_links(instance) + for link_data in links_data: HostLink.objects.create(host=instance, **link_data) + instance.updated_by = self.context.get("updated_by") + instance.save() return instance diff --git a/program/utils.py b/program/utils.py index d21eaaf81ea9f1e66d2b4551d59a190fdd1cc262..1c4196bf0e4fe21b531dc2e9ab5204d380bf6115 100644 --- a/program/utils.py +++ b/program/utils.py @@ -19,6 +19,7 @@ # import json +import typing from datetime import date, datetime, time from typing import Dict, Optional, Tuple, Union @@ -28,6 +29,9 @@ from rest_framework import exceptions from django.utils import timezone from steering.settings import CBA_AJAX_URL, CBA_API_KEY, DEBUG +if typing.TYPE_CHECKING: + from program.models import Host, Note, Show + def parse_datetime(date_string: str) -> datetime: """ @@ -110,6 +114,16 @@ def get_values( return int_if_digit(values[0]) +def delete_links(instance: Union["Host", "Note", "Show"]) -> Union["Host", "Note", "Show"]: + """Delete the links associated with the instance.""" + + if instance.links.count() > 0: + for link in instance.links.all(): + link.delete(keep_parents=True) + + return instance + + class DisabledObjectPermissionCheckMixin: """ At the time of writing permission checks were entirely circumvented by manual