from typing import Any, Optional from marshmallow import fields, validate from marshmallow.utils import missing as missing_ from apollo_utils.core.constants.isrc import ISRC_RE_MASK from apollo_utils.service.schemas.fields.isrc import IsrcField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.fields.string import CustomStringField class IsrcRequiredMixin: isrc = fields.String(validate=validate.Length(min=1, max=45), required=True) class IsrcListRequiredMixin: isrc_list = SplitUniqueListField( fields.String(validate=validate.Length(min=1, max=45)), data_key="isrc", validate=validate.Length(min=1, max=1000), required=True, unify=True ) class SourceTrackISRCLowerMixin: source_track_isrc = CustomStringField( validate=validate.Length(equal=12), default=None, load_default=None, lower=True ) class IsrcListNoneMixin: isrc_list = SplitUniqueListField( fields.String(validate=validate.Length(min=1, max=45)), data_key="isrc", required=False, validate=validate.Length(min=1, max=1000), missing=None, ) class IsrcRequiredUpperMixin: """ISRC value mixin.""" isrc = CustomStringField(upper=True, required=True) class IsrcNoneUpperMixin: """ISRC value mixin.""" isrc = CustomStringField(upper=True, required=False) def get_isrc_list_mixin(required: bool = True, max_length: Optional[int] = None, missing: Any = missing_): class Mixin: isrc_list = SplitUniqueListField( IsrcField(required=True), data_key="isrc", required=required, missing=missing, **( { "validate": validate.Length( **({"min": 1} if required else {}), **({"max": max_length} if max_length else {}), ) } if required or max_length else {} ), filter_mask=ISRC_RE_MASK, ) return Mixin