from datetime import datetime from marshmallow import fields class DateStringField(fields.Date): def __init__(self, truncate_str: bool = False, max_len: int = 10, *args, **kwargs): self._truncate_str = truncate_str self._max_len = max_len super().__init__(*args, **kwargs) def _serialize(self, value, attr, obj, **kwargs): if isinstance(value, str): if self._truncate_str and value: return value[:self._max_len] return value else: return super()._serialize(value, attr, obj, **kwargs) class DateTimeStringField(fields.DateTime): def _serialize(self, value, attr, obj, **kwargs): if isinstance(value, str): return value else: return super()._serialize(value, attr, obj, **kwargs) class ExtremeDateStringField(DateStringField): """Field to get extreme (min or max) date from array of string dates Args: select: callable min or max function """ def __init__(self, select: callable = max, *args, **kwargs): self.select = select super().__init__(*args, **kwargs) def _serialize(self, value, attr, obj, **kwargs): if isinstance(value, list): value = self.select([datetime.fromisoformat(d[:19]) for d in value if d is not None]) return super()._serialize(value, attr, obj, **kwargs)