from apollo_utils.service.schemas.fields.datetime import DateStringField, ExtremeDateStringField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.fields.unix_epoch import UnixEpochCheckAndReplaceDateStringField from apollo_utils.service.schemas.mixins.isrc import IsrcRequiredMixin from apollo_utils.service.schemas.mixins.market import MarketListAllAndGlobalReplaceMixin from marshmallow import fields, validate from server.constants.playlists.delphi.by_api.track_positions_previous_playlists import \ TrackPositionsPreviousPlaylists, TrackPositionsPreviousPlaylistsApolloToDelphiProcessedFieldsSortByMapping from server.schemas.base.pagination import get_pagination_mixin from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.images.core_image_service import CoreImageServiceImageUrlField class V3PlaylistCommonByTrackHistory: """(v3) Common Request schema to get spotify or apple previous playlists by track.""" class Request( RequestSchema, IsrcRequiredMixin, MarketListAllAndGlobalReplaceMixin, get_pagination_mixin(page_limit=200) ): recent_removals_only = fields.Bool(data_key="recent_removals_only", missing=False, default=False) category_id = fields.Integer(missing=None, default=None) search = fields.String(validate=validate.Length(min=1, max=50), required=False, missing=None) order_by = SplitUniqueListField( fields.String( validate=validate.OneOf( TrackPositionsPreviousPlaylistsApolloToDelphiProcessedFieldsSortByMapping.keys() ) ), load_default=[ TrackPositionsPreviousPlaylists.SORT_BY.REMOVED_DATE_TIME_DESC.value, TrackPositionsPreviousPlaylists.SORT_BY.ID.value, ], ) class PlaylistCategoriesItemResponse(Schema): """Response playlists categories schema.""" owner_category_id = fields.Integer(data_key="category_id") name = fields.String(data_key="category_name") class NestedItemResponse(Schema): id = fields.String(attribute="playlist_id") name = fields.String(attribute="playlist.name") country_code = fields.String(attribute="playlist.country_code") image_url = CoreImageServiceImageUrlField(attribute="playlist.image_url") updated_date = ExtremeDateStringField(truncate_str=True, attribute="playlist.dsp_sync_date_time") added_date = UnixEpochCheckAndReplaceDateStringField(attribute="earliest_position_date_time") removed_date = DateStringField(truncate_str=True, attribute="removed_date_time") category_id = fields.Integer(attribute="playlist.owner.owner_category.owner_category_id", dump_default=None) category_name = fields.String(attribute="playlist.owner.owner_category.name", dump_default=None) followers = fields.Integer(attribute="followers", default=0) num_days_on = fields.Integer()