diff --git a/program/models.py b/program/models.py index cb5991e06d0e241d180eb5b86ef33de5dd62092f..bf5abb47227681fc8df615b1103635c4e3a24da5 100644 --- a/program/models.py +++ b/program/models.py @@ -151,14 +151,20 @@ class Host(models.Model): class Link(models.Model): - host = models.ForeignKey(Host, on_delete=models.CASCADE, related_name="links") - description = models.CharField(max_length=8) + description = models.CharField(max_length=16) url = models.URLField() + class Meta: + abstract = True + def __str__(self): return self.url +class HostLink(Link): + host = models.ForeignKey(Host, on_delete=models.CASCADE, related_name="links") + + class Show(models.Model): predecessor = models.ForeignKey( "self", @@ -1133,7 +1139,6 @@ class Note(models.Model): Show, on_delete=models.CASCADE, related_name="notes", editable=True ) cba_id = models.IntegerField(blank=True, null=True) - audio_url = models.TextField(blank=True, editable=False) user = models.ForeignKey( User, editable=False, on_delete=models.CASCADE, related_name="users", default=1 ) @@ -1161,3 +1166,7 @@ class Note(models.Model): if self.image.name and THUMBNAIL_SIZES: for size in THUMBNAIL_SIZES: self.image.thumbnail = self.image.crop[size].name + + +class NoteLink(Link): + note = models.ForeignKey(Note, on_delete=models.CASCADE, related_name="links") diff --git a/program/serializers.py b/program/serializers.py index 76a903cb11f29e09e4197458805371a47ca2dc36..5305eaf7639892954dd0e89d90bbd149d3faf75a 100644 --- a/program/serializers.py +++ b/program/serializers.py @@ -31,10 +31,11 @@ from program.models import ( Category, FundingCategory, Host, + HostLink, Language, - Link, MusicFocus, Note, + NoteLink, RRule, Schedule, Show, @@ -163,14 +164,14 @@ class CategorySerializer(serializers.ModelSerializer): fields = ("category", "abbrev", "slug", "is_active", "description") -class LinkSerializer(serializers.ModelSerializer): +class HostLinkSerializer(serializers.ModelSerializer): class Meta: - model = Link + model = HostLink fields = ("description", "url") class HostSerializer(serializers.ModelSerializer): - links = LinkSerializer(many=True, required=False) + links = HostLinkSerializer(many=True, required=False) thumbnails = serializers.SerializerMethodField() @staticmethod @@ -193,7 +194,7 @@ class HostSerializer(serializers.ModelSerializer): host = Host.objects.create(**validated_data) for link_data in links_data: - Link.objects.create(host=host, **link_data) + HostLink.objects.create(host=host, **link_data) host.save() return host @@ -214,9 +215,9 @@ class HostSerializer(serializers.ModelSerializer): for link in instance.links.all(): link.delete(keep_parents=True) - if links := validated_data.get("links"): - for link_data in links: - Link.objects.create(host=instance, **link_data) + if links_data := validated_data.get("links"): + for link_data in links_data: + HostLink.objects.create(host=instance, **link_data) instance.save() @@ -592,7 +593,14 @@ class TimeSlotSerializer(serializers.ModelSerializer): return instance +class NoteLinkSerializer(serializers.ModelSerializer): + class Meta: + model = NoteLink + fields = ("description", "url") + + class NoteSerializer(serializers.ModelSerializer): + links = NoteLinkSerializer(many=True, required=False) show = serializers.PrimaryKeyRelatedField(queryset=Show.objects.all()) timeslot = serializers.PrimaryKeyRelatedField(queryset=TimeSlot.objects.all()) host = serializers.PrimaryKeyRelatedField(queryset=Host.objects.all()) @@ -615,15 +623,22 @@ class NoteSerializer(serializers.ModelSerializer): def create(self, validated_data): """Create and return a new Note instance, given the validated data.""" + links_data = validated_data.pop("links", []) # Save the creator validated_data["user_id"] = self.context["user_id"] - # Try to retrieve audio URL from CBA - validated_data["audio_url"] = get_audio_url(validated_data.get("cba_id", None)) - note = Note.objects.create(**validated_data) + if cba_id := validated_data.get("cba_id"): + if audio_url := get_audio_url(cba_id): + NoteLink.objects.create(note=note, description="CBA", url=audio_url) + + for link_data in links_data: + NoteLink.objects.create(note=note, **link_data) + + note.save() + # Assign note to timeslot if note.timeslot_id is not None: try: @@ -649,7 +664,18 @@ class NoteSerializer(serializers.ModelSerializer): instance.status = validated_data.get("status", instance.status) instance.host = validated_data.get("host", instance.host) instance.cba_id = validated_data.get("cba_id", instance.cba_id) - instance.audio_url = get_audio_url(instance.cba_id) + + if instance.links.count() > 0: + for link in instance.links.all(): + link.delete(keep_parents=True) + + if cba_id := validated_data.get("cba_id"): + if audio_url := get_audio_url(cba_id): + NoteLink.objects.create(note=instance, description="CBA", url=audio_url) + + if links_data := validated_data.get("links"): + for link_data in links_data: + NoteLink.objects.create(note=instance, **link_data) instance.save()