from marshmallow import ValidationError, fields, post_load, validate from server.legacy.core.utils import convert_market, format_delphi_playlist_id class MarketMixin: """Market value mixin.""" market = fields.Str(missing="", description="Market code value, leave empty for global one.") @post_load def check_and_lowercase_market(self, data, **kwargs): data["market"] = convert_market(data["market"], "") return data class PlaylistIdField(fields.Field): def __init__(self, vendor: str, **kwargs): super().__init__(**kwargs) self.vendor = vendor def _serialize(self, value, attr, obj, **kwargs): if not value: return value if value.startswith(f"{self.vendor}_"): value = value[len(self.vendor) + 1 :] return value def _deserialize(self, value, attr, data, **kwargs): if not value: return value return format_delphi_playlist_id(self.vendor, value) class NotEmptyDictField(fields.Dict): def _validate(self, value): super()._validate(value) if any(value) is False: raise ValidationError("Items field should not be empty.") class PerVendorMixin: """Per vendor field mixin.""" per_vendors = fields.Boolean(default=False, missing=False, description="Display detailed per vendors response.") class LimitMixin: """Limit number value mixin.""" limit = fields.Int(validate=validate.Range(min=1), missing=None, required=False) class AllMarketsNullBooleanMixin: """Show all markets or not.""" all_markets = fields.Boolean(required=False) class LatestDateMixin: latest_date = fields.Date(format="iso", description="Latest date value (ISO8601-formatted).", missing=None)