from apollo_utils.service.schemas.fields.datetime import DateStringField from apollo_utils.service.schemas.mixins.date import get_date_range_mixin from apollo_utils.service.schemas.mixins.isrc import IsrcListRequiredMixin from apollo_utils.service.schemas.mixins.market import MarketRequiredGlobalWWMixin from marshmallow import ValidationError, fields, post_load from server.schemas.base.schemas import RequestSchema, Schema class GTPCharts: """GTP charts schemas.""" class Request( RequestSchema, IsrcListRequiredMixin, MarketRequiredGlobalWWMixin, get_date_range_mixin(required=False, start_field="start", end_field="end"), ): date_shift = fields.Int(missing=None) @post_load def validate_dates(self, data, **kwargs): """Set dates.""" start_date, end_date, date_shift = data.get("start_date"), data.get("end_date"), data.get("date_shift") if bool(start_date) ^ bool(end_date): if date_shift is None: raise ValidationError("'date_shift' is required if only one of 'start', 'end' is set.") elif date_shift is not None: raise ValidationError("'date_shift' should not be set if no one of 'start', 'end' is set.") return data class Response(Schema): class DataItem(Schema): class PositionItem(Schema): date = DateStringField(allow_none=True) change = fields.Int(allow_none=True) position = fields.Int() isrc = fields.Str(required=True) market = fields.Str(required=True) start_date = DateStringField() end_date = DateStringField() positions = fields.List(fields.Nested(PositionItem)) trend = fields.Integer(required=False, allow_none=True) is_entered = fields.Bool() chart_available = fields.Bool(default=True) data = fields.List(fields.Nested(DataItem))