|
import re |
|
from typing import Optional |
|
|
|
from pydantic import BaseModel, validator |
|
from typing_extensions import Literal |
|
|
|
|
|
class Parameters(BaseModel): |
|
image_file_b64: Optional[str] = "" |
|
image_url: Optional[str] = "" |
|
size: Optional[Literal["preview", "full", "auto"]] = "preview" |
|
type: Optional[ |
|
Literal["auto", "product", "person", "car"] |
|
] = "auto" |
|
format: Optional[Literal["auto", "jpg", "png", "zip"]] = "auto" |
|
roi: str = "0% 0% 100% 100%" |
|
crop: bool = False |
|
crop_margin: Optional[str] = "0px" |
|
scale: Optional[str] = "original" |
|
position: Optional[str] = "original" |
|
channels: Optional[Literal["rgba", "alpha"]] = "rgba" |
|
add_shadow: str = "false" |
|
semitransparency: str = "false" |
|
bg_color: Optional[str] = "" |
|
bg_image_url: Optional[str] = "" |
|
|
|
@validator("crop_margin") |
|
def crop_margin_validator(cls, value): |
|
if not re.match(r"[0-9]+(px|%)$", value): |
|
raise ValueError( |
|
"crop_margin paramter is not valid" |
|
) |
|
if "%" in value and (int(value[:-1]) < 0 or int(value[:-1]) > 100): |
|
raise ValueError("crop_margin mast be in range between 0% and 100%") |
|
return value |
|
|
|
@validator("scale") |
|
def scale_validator(cls, value): |
|
if value != "original" and ( |
|
not re.match(r"[0-9]+%$", value) |
|
or not int(value[:-1]) <= 100 |
|
or not int(value[:-1]) >= 10 |
|
): |
|
raise ValueError("scale must be original or in between of 10% and 100%") |
|
|
|
if value == "original": |
|
return 100 |
|
|
|
return int(value[:-1]) |
|
|
|
@validator("position") |
|
def position_validator(cls, value, values): |
|
if len(value.split(" ")) > 2: |
|
raise ValueError( |
|
"Position must be a value from 0 to 100 " |
|
"for both vertical and horizontal axises or for both axises respectively" |
|
) |
|
|
|
if value == "original": |
|
return "original" |
|
elif len(value.split(" ")) == 1: |
|
return [int(value[:-1]), int(value[:-1])] |
|
else: |
|
return [int(value.split(" ")[0][:-1]), int(value.split(" ")[1][:-1])] |
|
|
|
@validator("bg_color") |
|
def bg_color_validator(cls, value): |
|
if not re.match(r"(#{0,1}[0-9a-f]{3}){0,2}$", value): |
|
raise ValueError("bg_color is not in hex") |
|
if len(value) and value[0] != "#": |
|
value = "#" + value |
|
return value |
|
|