from marshmallow import Schema, fields from marshmallow.validate import OneOf, Regexp from charts.schemas.chart.rankings_for_chart_ids import SecondaryOrder class IntFilter(Schema): lte = fields.Int() lt = fields.Int() gte = fields.Int() gt = fields.Int() eq = fields.Int() neq = fields.Int() class NullableIntFilter(IntFilter): eq = fields.Int(allow_none=True) neq = fields.Int(allow_none=True) class ChartDataPlacementSchema(Schema): class NestedResponseItem(Schema): uuid = fields.UUID(required=True) chartId = fields.UUID(required=True) chartDate = fields.Date(required=True) publicSoundRecordingId = fields.UUID(allow_none=True) trackId = fields.String(allow_none=True) publicProductId = fields.UUID(allow_none=True) peakTimestamp = fields.String() peakDate = fields.Date() peakPosition = fields.Integer() appearances = fields.Integer() isrc = fields.String(allow_none=True) firstDate = fields.Date() firstPosition = fields.Integer() mostRecentDate = fields.Date() mostRecentPosition = fields.Integer() previousDate = fields.Date(allow_none=True) previousPosition = fields.Integer(allow_none=True) position = fields.Integer(required=True, allow_none=True) positionChange = fields.Integer(required=True, allow_none=True) streams = fields.Integer(required=True, allow_none=True) totalStreams = fields.Integer(required=True, allow_none=True) totalShazams = fields.Integer(required=True, allow_none=True) views = fields.Integer(required=True, allow_none=True) numTracks = fields.Integer(required=True, allow_none=True) totalUnits = fields.Integer(required=True, allow_none=True) upc = fields.String(required=True, allow_none=True) videoId = fields.String(required=True, allow_none=True) channelId = fields.String(required=True, allow_none=True) channelName = fields.String(required=True, allow_none=True) artistNames = fields.String(required=True, allow_none=True) brand_ids = fields.List(fields.String(required=True, allow_none=False), required=False, allow_none=True) isPartOfCatalog = fields.Boolean(required=True) chartId = fields.UUID(required=True) chartDate = fields.Date(required=True) uuidsData = fields.List(fields.Nested(NestedResponseItem, required=True)) class ChartDataForChartIds: """Response schema for getting /charts/data-for-chart-ids/ API""" class Request(Schema): class NestedItem(Schema): chart_id = fields.UUID(required=True) chart_date = fields.Date(required=True) class Filter(Schema): brand_uuid_in = fields.List(fields.String(validate=Regexp(r'^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|👾$')), required=False) is_part_of_catalog = fields.Boolean(required=False) position_change = fields.Nested(NullableIntFilter, required=False) position_change_abs = fields.Nested(NullableIntFilter, required=False) class Order(Schema): by = fields.String(required=True, validate=OneOf(('major_moves', 'new_entries', 'position', 'position_change'))) dir = fields.String(required=True, validate=OneOf(('ASC', 'DESC'))) and_then = fields.Nested(SecondaryOrder, required=False) chart_ids_with_date = fields.Nested(NestedItem, many=True) filter = fields.Nested(Filter, required=False, load_default={}) order = fields.Nested(Order, required=False, load_default={'by': 'position', 'dir': 'ASC'}) class Response(Schema): data = fields.Nested(ChartDataPlacementSchema, required=True)