from typing import List, Any, Optional from marshmallow import fields from apollo_utils.core.constants.market import Market, DELPHI_GLOBAL_MARKET from apollo_utils.service.utils.market import convert_market class MarketField(fields.String): def __init__(self, gl: str = None, *args, **kwargs): self._global = gl super().__init__(*args, **kwargs) def _deserialize(self, value, attr, data, **kwargs) -> List[Any]: data = super()._deserialize(value, attr, data, **kwargs) if self._global: data = Market.convert_global(data, self._global) return data class DelphiMarketField(fields.Str): """Custom field for handling market for Delphi API. Converts market to default value.""" def __init__(self, *args, **kwargs): self._deserialize_market = kwargs.pop("deserialize_market", DELPHI_GLOBAL_MARKET) self._serialize_market = kwargs.pop("serialize_market", None) super().__init__(*args, **kwargs) def _serialize(self, value, attr, obj, **kwargs) -> Optional[str]: value = super()._serialize(value, attr, obj, **kwargs) if value and self._serialize_market: value = convert_market(value, self._serialize_market) return value def _deserialize(self, value, attr, data, **kwargs) -> Any: value = super()._deserialize(value, attr, data, **kwargs) if value and self._deserialize_market: value = convert_market(value, self._deserialize_market) return value