from marshmallow import fields from typing import Optional from server.utils.images.resolution import set_image_url_resolution_by_mask class ImageUrlResolutionChangeField(fields.String): """Image Url string Field for Marshmallow Schemas usage Can replace a resolution format of an image_url if requested and found """ def __init__( self, change_resolution: bool = True, default_resolution_size: int = 640, image_size_context_key="image_size", *args, **kwargs, ): self._change_resolution = change_resolution self._default_resolution_size = default_resolution_size self._image_size_context_key = image_size_context_key super().__init__(*args, **kwargs) def _serialize(self, value, attr, obj, **kwargs) -> Optional[str]: field_value = super()._serialize(value, attr, obj, **kwargs) if self._change_resolution and isinstance(field_value, str): field_value = set_image_url_resolution_by_mask( field_value, self.context.get(self._image_size_context_key, self._default_resolution_size) ) return field_value