from marshmallow import Schema, fields from marshmallow.validate import OneOf, Regexp from charts.logic.dataloaders.charts.dates.placements.utils import ChartDatePlacementIdSchema 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 SecondaryOrder(Schema): by = fields.String(required=True, validate=OneOf(('POSITION', 'POSITION_CHANGE'))) dir = fields.String(required=True, validate=OneOf(('ASC', 'DESC'))) class ChartRankingsForChartIds: """Response schema for getting /charts/rankings-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(ChartDatePlacementIdSchema, required=True)