from typing import Any, Mapping from marshmallow import Schema, ValidationError, fields, validates_schema from playlist.connectors.snowflake import SnowflakeQuery from playlist.queries.constants import DEFAULT_DISTRIBUTORS, get_placement_table_dynamic from playlist.queries.schema import ISRC class PlacementsCountQuerySchema(Schema): isrc = ISRC() global_participant_id = fields.Str() product_id = fields.Integer() stream_countries = fields.List(fields.Str) curator_countries = fields.List(fields.Str) permission_label_ids = fields.List(fields.Str) permission_subaccount_ids = fields.List(fields.Str) permission_label_participant_ids = fields.List(fields.Int) playlist_types = fields.List(fields.Str) store_ids = fields.List(fields.Str) playlist_appearances = fields.Str() min_followers = fields.Integer() distributors = fields.List(fields.Str) filter_incorrect_playlists = fields.Boolean() use_primary_playlist_type = fields.Boolean() @validates_schema def validate_main_query_arg(self, data, **kwargs): if ( "isrc" not in data and "global_participant_id" not in data and "product_id" not in data ): raise ValidationError( "isrc, or global_participant_id, or product_id required" ) class PlacementsCountQuery(SnowflakeQuery): query_schema = PlacementsCountQuerySchema filename = "placements_count.sql" default_params = {"distributors": DEFAULT_DISTRIBUTORS} @property def table_params(self) -> Mapping[str, Any]: return get_placement_table_dynamic(self.user_params)