from typing import Union from marshmallow import EXCLUDE, fields, pre_dump, pre_load from delphi_api.v3.atlas import AtlasImageService from delphi_api.v3.constants import DSP_AMAZON from delphi_api.v3.data_models.postgres_db import BaseModel from delphi_api.v3.data_models.schemas import ma from delphi_api.v3.data_models.schemas.demographics import ( AppleAgeBandSchema, GenderSchema, SpotifyAgeBandSchema, YouTubeAgeBandSchema, ) class ImageSimpleSchema(ma.Schema): class Meta: unknown = EXCLUDE uri = fields.Url(required=True) height = fields.Integer(required=False, missing=None, default=None) width = fields.Integer(required=False, missing=None, default=None) @pre_load def get_data(self, obj: Union[BaseModel, dict], **kwargs): """Load an image object based on the model and model name See Also: - :class:`delphi_api.v3.data_models.schemas.models.RemoteImageBaseSchema` """ return AtlasImageService.get_image_data_by_model(obj, self.context.get('model_name')) class PopularitySchema(ma.Schema): class Meta: unknown = EXCLUDE artist_id = fields.String(required=False, missing=None, default=None) date = fields.String(required=False, missing=None, default=None) # product_id = fields.String(required=False, missing=None, default=None) spotify_popularity = fields.Integer(required=True) # track_id = fields.String(required=False, missing=None, default=None) class StreamSchema(ma.Schema): class Meta: unknown = EXCLUDE artist_id = fields.String(required=False, missing=None, default=None) chart_id = fields.String(required=False, missing=None, default=None) country_code = fields.String(required=True) date = fields.String(required=False, missing=None, default=None) dsp = fields.String(required=False, missing=None, default=None) isrc = fields.String(required=False, missing=None, default=None) playlist_id = fields.String(required=False, missing=None, default=None) streams = fields.Integer(required=False, missing=None, default=None) track_id = fields.String(required=False, missing=None, default=None) class StreamDemographicSchema(StreamSchema): class Meta: unknown = EXCLUDE genders = fields.Nested(GenderSchema) apple_age_bands = fields.Nested(AppleAgeBandSchema, default=None) spotify_age_bands = fields.Nested(SpotifyAgeBandSchema, default=None) youtube_age_bands = fields.Nested(YouTubeAgeBandSchema, default=None) class FollowerSchema(ma.Schema): class Meta: unknown = EXCLUDE date = fields.String(required=False, missing=None) apple_followers = fields.Integer(required=False, missing=None, default=None) facebook_likes = fields.Integer(required=False, missing=None, default=None) facebook_storytellers = fields.Integer(required=False, missing=None, default=None) instagram_followers = fields.Integer(required=False, missing=None, default=None) spotify_followers = fields.Integer(required=False, missing=None, default=None) spotify_popularity = fields.Integer(required=False, missing=None, default=None) twitter_followers = fields.Integer(required=False, missing=None, default=None) youtube_channel_subscribers = fields.Integer(required=False, missing=None, default=None) youtube_channel_views = fields.Integer(required=False, missing=None, default=None) class BaseTrackPosition(ma.ModelSchema): class Meta: unknown = EXCLUDE current = fields.Integer(required=False, missing=None, default=None) date = fields.String(required=False, missing=None, default=None) dsp = fields.String(required=False, missing=None, default=None) enter_date = fields.String(required=False, missing=None, default=None) exit_date = fields.String(required=False, missing=None, default=None) isrc = fields.String(required=False, missing=None, default=None) num_weeks_on = fields.Integer(required=False, missing=None, default=None) previous = fields.Integer(required=False, missing=None, default=None) top = fields.Integer(required=False, missing=None, default=None) class ChartTrackPositionSimpleSchema(BaseTrackPosition): class Meta: unknown = EXCLUDE chart_id = fields.String(required=False, missing=None, default=None) class PlaylistTrackPositionSimpleSchema(BaseTrackPosition): class Meta: unknown = EXCLUDE playlist_id = fields.String(required=False, missing=None, default=None) class TrackPositionSimpleSchema(BaseTrackPosition): class Meta: unknown = EXCLUDE chart_id = fields.String(required=False, missing=None, default=None) playlist_id = fields.String(required=False, missing=None, default=None) class DataStatusSchema(ma.Schema): class Meta: unknown = EXCLUDE dsp_id = fields.String(required=True) updated_date = fields.Date(required=True)