from typing import Any, Mapping from marshmallow import Schema, fields from playlist.connectors.snowflake import SnowflakeQuery from playlist.queries.constants import DEFAULT_DISTRIBUTORS, get_placement_table_dynamic from playlist.queries.schema import ISRC class PlaylistPlacementSchema(Schema): isrc = ISRC(required=True) store_playlist_id = fields.Str(required=True) store_id = fields.Str(required=True) storefront = fields.Str(allow_none=True) class PlaylistPlacementStreamsAggregatedQuerySchema(Schema): permission_label_ids = fields.List(fields.Str) permission_subaccount_ids = fields.List(fields.Str) permission_label_participant_ids = fields.List(fields.Int) stream_countries = fields.List(fields.Str) distributors = fields.List(fields.Str) storefront_defined = fields.Boolean() sound_recording_playlist_placements = fields.List( fields.Nested(PlaylistPlacementSchema) ) class PlaylistPlacementStreamsAggregatedQuery(SnowflakeQuery): query_schema = PlaylistPlacementStreamsAggregatedQuerySchema filename = "playlist_placement_streams_aggregated.sql" @property def table_params(self) -> Mapping[str, Any]: placement_table_params = get_placement_table_dynamic(self.user_params) return placement_table_params