From 5bd89e8ad1a97092722b741ff96aa56207c336a3 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Fri, 5 Jul 2024 17:07:22 -0400
Subject: [PATCH] refactor: extract TypeDict annotations into typing module

---
 program/serializers.py | 80 ++++++------------------------------------
 program/typing.py      | 69 +++++++++++++++++++++++++++++++++++-
 2 files changed, 79 insertions(+), 70 deletions(-)

diff --git a/program/serializers.py b/program/serializers.py
index 3b95b4bd..66fd50f9 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 32e8412e..0375987e 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,
+    },
+)
-- 
GitLab