from typing import Any from marshmallow import fields, validate from apollo_utils.service.utils.isrc import normalize_isrc class IsrcField(fields.Str): def __init__(self, *args, **kwargs): self._upper = kwargs.pop("upper", True) self._remove_dash = kwargs.pop("remove_dash", True) self._normalize_on_serializing = kwargs.pop("normalize_on_serializing", False) if not kwargs.get("validate"): kwargs["validate"] = validate.Length(min=1, max=45) super().__init__(*args, **kwargs) def _serialize(self, value, attr, obj, **kwargs) -> Any: if self._normalize_on_serializing: value = normalize_isrc(value, upper=self._upper, remove_dash=self._remove_dash) value = super()._serialize(value, attr, obj, **kwargs) return value def _deserialize(self, value, attr, data, **kwargs) -> Any: value = super()._deserialize(value, attr, data, **kwargs) value = normalize_isrc(value, upper=self._upper, remove_dash=self._remove_dash) return value