from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.isrc import IsrcListRequiredMixin, IsrcRequiredMixin from marshmallow import Schema, fields, validate from src.constants.include import HHTrackInclude, NMFTrackInclude from src.constants.order import HHTrackOrder, NMFTrackOrder from src.legacy.core.serializers import UniqueArgsListField, get_pagination_mixin class TracksPlaylistsHH: """ Schema(s) for validating request and response of Hot Hits tracks """ class Request(RequestSchema, IsrcRequiredMixin, get_pagination_mixin(page_limit=None)): order_by = UniqueArgsListField( fields.String(validate=validate.OneOf(HHTrackOrder.values())), default=[HHTrackOrder.POSITION.value, HHTrackOrder.CODE.value], missing=[HHTrackOrder.POSITION.value, HHTrackOrder.CODE.value], ) include = SplitUniqueListField( fields.String(validate=validate.OneOf(HHTrackInclude.values(with_all=True))), default=[], missing=[] ) region = fields.String(missing=None, default=None) fields_with_all = {"include": HHTrackInclude} class Response(Schema): class PlaylistItem(Schema): code = fields.String() name = fields.String() position = fields.Integer() playlist_id = fields.String() image_url = fields.String() added_days = fields.Integer() is_new = fields.Boolean() position_change = fields.Integer() top_market = fields.Integer() class RegionItem(Schema): name = fields.String() code = fields.String() placements = fields.Integer() total = fields.Integer() items = fields.List(fields.Nested(PlaylistItem)) total = fields.Integer() positions_avg = fields.Integer() positions_top_total = fields.Integer() regions = fields.List(fields.Nested(RegionItem)) class HotHitsPlaylistItem(Schema): playlist_id = fields.String() market = fields.String() rank = fields.Integer() region = fields.String() playlist_image = fields.String() class TracksPlaylistsHHBulk: class Request(RequestSchema, IsrcListRequiredMixin): pass class Response(Schema): class FullPlaylistItem(HotHitsPlaylistItem): latest_date = fields.Date() class TrackItem(Schema): class TrackPlaylistItem(HotHitsPlaylistItem): entry_date = fields.Date() peak_position = fields.Integer() peak_date = fields.Date() class PreviousTrackPlaylistItem(TrackPlaylistItem): exit_date = fields.Date() class CurrentTrackPlaylistItem(TrackPlaylistItem): position = fields.Integer() trend = fields.Integer() is_entry = fields.Boolean() isrc = fields.String(required=True) non_featured = fields.Nested(HotHitsPlaylistItem, many=True) previous = fields.Nested(PreviousTrackPlaylistItem, many=True) current = fields.Nested(CurrentTrackPlaylistItem, many=True) avg_position = fields.Integer() current_count = fields.Integer() items = fields.Nested(TrackItem, many=True) hot_hits_date = fields.Date(required=True) regions = fields.List(fields.String()) outdated = fields.Nested(HotHitsPlaylistItem, many=True) playlists = fields.Nested(FullPlaylistItem, many=True) playlists_by_markets = fields.Dict(fields.String()) class TracksPlaylistsNMF: class Request(RequestSchema, IsrcRequiredMixin, get_pagination_mixin(page_limit=None)): order_by = UniqueArgsListField( fields.String(validate=validate.OneOf(NMFTrackOrder.values())), default=[NMFTrackOrder.POSITION.value, NMFTrackOrder.CODE.value], missing=[NMFTrackOrder.POSITION.value, NMFTrackOrder.CODE.value], ) include = SplitUniqueListField( fields.String(validate=validate.OneOf(NMFTrackInclude.values(with_all=True))), default=[], missing=[] ) region = fields.String(missing=None, default=None) fields_with_all = {"include": NMFTrackInclude} class Response(Schema): class PlaylistItem(Schema): code = fields.String() name = fields.String() position = fields.Integer() playlist_id = fields.String() dsp = fields.String() image_url = fields.String() class RegionItem(Schema): name = fields.String() code = fields.String() placements = fields.Integer() total = fields.Integer() items = fields.List(fields.Nested(PlaylistItem)) total = fields.Integer() positions_avg = fields.Integer() positions_top_total = fields.Integer() top_playlist_image_url = fields.String() regions = fields.List(fields.Nested(RegionItem))