from marshmallow import ValidationError, fields from typing import Iterable class CheckPrefixString(fields.String): """ This field is used to validate and deserialize string in format '', where is one of the allowed 'prefixes' values, is 'delimiter' value and is any string. dump_without_prefix - if True, then and parts will be removed on dumping. """ def __init__(self, prefixes: Iterable[str], delimiter: str = "_", dump_without_prefix: bool = False, **kwargs): super().__init__(**kwargs) self.prefixes = prefixes self.delimiter = delimiter self.dump_without_prefix = dump_without_prefix def _serialize(self, value, attr, obj, **kwargs): value = super()._serialize(value, attr, obj, **kwargs) if not self.dump_without_prefix or not value: return value if self.prefixes: value_parts = value.split(self.delimiter) if len(value_parts) >= 2 and value_parts[0] in self.prefixes: value = "".join(value_parts[1:]) return value def _deserialize(self, value, attr, data, **kwargs): value = super()._deserialize(value, attr, data, **kwargs) if not value: return value if self.prefixes: value_parts = value.split(self.delimiter) if len(value_parts) < 2 or value_parts[0] not in self.prefixes: raise ValidationError( f"{attr} got invalid value {value}, expected string in format " f"'{self.delimiter}" f"',\nwhere should be one of {self.prefixes}" ) return value