from apollo_utils.core.constants import MARKET_WORLDWIDE from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.enum import EnumField, EnumListField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.fields.market import MarketField from marshmallow import Schema, fields, validate from src.constants.playlists.spotify.charts import PLAYLIST_CHART_COUNTRY_CODE_LIST, ChartMetric, ChartType, \ PlaylistCategory, PlaylistType class ChartsPlaylistsDates: class Response(Schema): min_date = fields.Date() max_date = fields.Date() streams_max_date = fields.Date() followers_max_date = fields.Date() class ChartsPlaylists: class Request(RequestSchema): chart_date = fields.Date(required=True, data_key="date") owner_category_id_list = EnumListField( enum=PlaylistCategory, as_enum=True, int_enum=True, required=True, validate=validate.Length(min=1), data_key="category_id", ) chart_metric = EnumField(enum=ChartMetric, required=True, data_key="metric") chart_type = EnumField(enum=ChartType, required=True, data_key="type") playlists_type_list = EnumListField( enum=PlaylistType, as_enum=True, data_key="playlists_type", default=None, missing=None ) playlists_country_code_list = SplitUniqueListField( MarketField(gl=MARKET_WORLDWIDE), data_key="playlists_country_code", default=None, missing=None ) streams_country_code_list = SplitUniqueListField( fields.String(), data_key="streams_country_code", default=None, missing=None, value_list=PLAYLIST_CHART_COUNTRY_CODE_LIST, value_list_invalid_error=True, ) limit = fields.Integer(missing=10, default=10) class Response(Schema): class PlaylistItem(Schema): class Owner(Schema): account_name = fields.String() account_id = fields.String() category_id = fields.Integer() category_name = fields.String() country_code = fields.String() owner = fields.Nested(Owner) is_personalized = fields.Boolean() name = fields.String() image_url = fields.String() country_code = fields.String() link = fields.String() playlist_id = fields.String() trend = fields.Integer() value = fields.Integer() change = fields.Integer() previous_value = fields.Integer() position = fields.Integer() playlists = fields.List(fields.Nested(PlaylistItem))