diff --git a/program/serializers.py b/program/serializers.py index 3b95b4bd7f830dc0d260b86f36df5b320cdc560f..66fd50f9e512cdcf01e7b9a1ad2d6388e54e0ee7 100644 --- a/program/serializers.py +++ b/program/serializers.py @@ -19,7 +19,6 @@ # import re -from typing import Literal, NotRequired, TypedDict from drf_jsonschema_serializer import JSONSchemaField from rest_framework import serializers @@ -52,7 +51,17 @@ from program.models import ( Type, UserProfile, ) -from program.typing import NestedEpisode, NestedSchedule, NestedShow +from program.typing import ( + Logo, + NestedEpisode, + NestedSchedule, + NestedShow, + RadioCBASettings, + RadioImageRequirementsSettings, + RadioPlayoutSettings, + RadioProgramSettings, + RadioStationSettings, +) from program.utils import update_links SOLUTION_CHOICES = { @@ -278,12 +287,6 @@ class PPOIField(serializers.CharField): return f"{left}x{top}" -class Thumbnail(TypedDict): - width: float - height: float - url: str - - class ImageSerializer(serializers.ModelSerializer): license_id = serializers.PrimaryKeyRelatedField( allow_null=True, @@ -1174,67 +1177,6 @@ class NoteSerializer(serializers.ModelSerializer): return instance -class RadioCBASettings(TypedDict): - api_key: NotRequired[str] - domains: list[str] - - -class ProgramFallback(TypedDict): - default_pool: str - show_id: int | None - - -class MicroProgram(TypedDict): - show_id: int | None - - -class RadioProgramSettings(TypedDict): - fallback: ProgramFallback - micro: MicroProgram - - -class PlayoutPools(TypedDict): - fallback: str | None - - -class RadioPlayoutSettings(TypedDict): - line_in_channels: dict[str, str] - pools: PlayoutPools - - -class Logo(TypedDict): - url: str - height: int - width: int - - -class RadioStationSettings(TypedDict): - name: str - logo: Logo | None - website: str - - -class ImageFrame(TypedDict): - aspect_ratio: tuple[int, int] | tuple[float, float] - shape: Literal["rect", "round"] - - -class ImageRequirements(TypedDict): - frame: ImageFrame - - -# done this way, because the keys have dots (".") -RadioImageRequirementsSettings = TypedDict( - "RadioImageRequirementsSettings", - { - "host.image": ImageRequirements, - "note.image": ImageRequirements, - "show.image": ImageRequirements, - "show.logo": ImageRequirements, - }, -) - - class RadioSettingsSerializer(serializers.ModelSerializer): cba = serializers.SerializerMethodField() image_requirements = serializers.SerializerMethodField() diff --git a/program/typing.py b/program/typing.py index 32e8412eff3e75e51feae3c3376da228eebb4c00..0375987e713946493f0b7451d8a7f9b294e053d8 100644 --- a/program/typing.py +++ b/program/typing.py @@ -1,4 +1,4 @@ -from typing import TypedDict +from typing import Literal, NotRequired, TypedDict class NestedTimeslot(TypedDict): @@ -38,3 +38,70 @@ class TimerangeEntry(TypedDict): schedule: NestedSchedule | None show: NestedShow timeslot: NestedTimeslot + + +class Thumbnail(TypedDict): + width: float + height: float + url: str + + +class RadioCBASettings(TypedDict): + api_key: NotRequired[str] + domains: list[str] + + +class ProgramFallback(TypedDict): + default_pool: str + show_id: int | None + + +class MicroProgram(TypedDict): + show_id: int | None + + +class RadioProgramSettings(TypedDict): + fallback: ProgramFallback + micro: MicroProgram + + +class PlayoutPools(TypedDict): + fallback: str | None + + +class RadioPlayoutSettings(TypedDict): + line_in_channels: dict[str, str] + pools: PlayoutPools + + +class Logo(TypedDict): + url: str + height: int + width: int + + +class RadioStationSettings(TypedDict): + name: str + logo: Logo | None + website: str + + +class ImageFrame(TypedDict): + aspect_ratio: tuple[int, int] | tuple[float, float] + shape: Literal["rect", "round"] + + +class ImageRequirements(TypedDict): + frame: ImageFrame + + +# done this way, because the keys have dots (".") +RadioImageRequirementsSettings = TypedDict( + "RadioImageRequirementsSettings", + { + "host.image": ImageRequirements, + "note.image": ImageRequirements, + "show.image": ImageRequirements, + "show.logo": ImageRequirements, + }, +)