From 002032e9130bbc1eefbbe0d4cf872a3006e498c9 Mon Sep 17 00:00:00 2001
From: Konrad Mohrfeldt <konrad.mohrfeldt@farbdev.org>
Date: Mon, 27 May 2024 23:39:56 +0200
Subject: [PATCH] fix: add proper type info for radio settings API

refs aura/dashboard#282
---
 program/serializers.py | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/program/serializers.py b/program/serializers.py
index ceb359c9..7e961981 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -19,7 +19,7 @@
 #
 
 import re
-from typing import TypedDict
+from typing import NotRequired, TypedDict
 
 from drf_jsonschema_serializer import JSONSchemaField
 from rest_framework import serializers
@@ -1085,6 +1085,25 @@ class NoteSerializer(serializers.ModelSerializer):
         return instance
 
 
+class RadioCBASettings(TypedDict):
+    api_key: NotRequired[str]
+    domains: list[str]
+
+
+class RadioProgrammeSettings(TypedDict):
+    fallback_show_id: int | None
+
+
+class RadioPlayoutSettings(TypedDict):
+    line_in_channels: dict[str, str]
+
+
+class RadioStationSettings(TypedDict):
+    name: str
+    logo_id: int | None
+    website: str
+
+
 class RadioSettingsSerializer(serializers.ModelSerializer):
     cba = serializers.SerializerMethodField()
     playout = serializers.SerializerMethodField()
@@ -1096,7 +1115,7 @@ class RadioSettingsSerializer(serializers.ModelSerializer):
         fields = read_only_fields
         model = RadioSettings
 
-    def get_cba(self, obj) -> dict[str, str] | dict[str, list[str]]:
+    def get_cba(self, obj) -> RadioCBASettings:
         if self.context.get("request").user.is_authenticated:
             return {
                 "api_key": obj.cba_api_key,
@@ -1106,15 +1125,15 @@ class RadioSettingsSerializer(serializers.ModelSerializer):
             return {"domains": obj.cba_domains}
 
     @staticmethod
-    def get_programme(obj) -> dict[str, int]:
+    def get_programme(obj) -> RadioProgrammeSettings:
         return {"fallback_show_id": obj.fallback_show.id if obj.fallback_show else None}
 
     @staticmethod
-    def get_playout(obj) -> dict[str, dict[str, str]]:
+    def get_playout(obj) -> RadioPlayoutSettings:
         return {"line_in_channels": obj.line_in_channels}
 
     @staticmethod
-    def get_station(obj) -> dict[str, int | str]:
+    def get_station(obj) -> RadioStationSettings:
         return {
             "name": obj.station_name,
             "logo_id": obj.station_logo.id if obj.station_logo else None,
-- 
GitLab