models.py

4.4 kB · python · 172 lines

1from dataclasses import asdict, dataclass, field2from .steps import Step34TILE = "Tile"56@dataclass7class Product:89    id: int = None10    shopify_id: str = None11    printful_id: int = None12    synced: bool = None13    category: str = None14    title: str = None15    technique: str = None16    primaries: list[str] = field(default_factory=list)17    stitch_colors: list[str] = field(default_factory=list)1819    def to_dict(self) -> dict:20        return asdict(self)2122    @classmethod23    def from_dict(cls, data: dict) -> "Product":24        return cls(**data)2526@dataclass27class Printfile:2829    id: str = None30    key: str = None31    name: str = None32    url: str = None33    width: float = None34    height: float = None35    dpi: int = None3637    def to_dict(self) -> dict:38        return asdict(self)3940    @classmethod41    def from_dict(cls, data: dict) -> "Printfile":42        return cls(**data)4344@dataclass45class Placement:4647    name: str = None48    width: float = None49    height: float = None50    dpi: int = None5152    def to_dict(self) -> dict:53        return asdict(self)5455    @classmethod56    def from_dict(cls, data: dict) -> "Placement":57        return cls(**data)5859    @property60    def id(self) -> str:61        width = f"{round(self.width * 100):04d}"62        height = f"{round(self.height * 100):04d}"63        dpi = f"{round(self.dpi):04d}"64        return f"{width}-{height}-{dpi}"6566@dataclass67class Variant:6869    id: int = None70    key: str = None71    name: str = None72    shopify_id: str = None73    printful_id: int = None74    synced: bool = None75    cost: str = None76    size: str = None77    color: str = None7879    def to_dict(self) -> dict:80        return asdict(self)8182    @classmethod83    def from_dict(cls, data: dict) -> "Variant":84        return cls(**data)8586@dataclass87class Mockup:8889    id: int = None90    key: str = None91    name: str = None92    shopify_id: str = None93    category: str = None94    title: str = None95    variant_ids: list[int] = None96    url: str = None9798    def to_dict(self) -> dict:99        return asdict(self)100101    @classmethod102    def from_dict(cls, data: dict) -> "Mockup":103        return cls(**data)104105    @property106    def alt(self) -> str:107        return f"{self.id} - {self.category} - {self.title}"108109    @property110    def is_tile(self) -> bool:111        return self.category == TILE112113    @property114    def extension(self) -> str:115        return self.url.split("?")[0].split(".")[-1]116117@dataclass118class Task:119120    key: str = None121    step: str = None122    seed: int = None123    created_at: int = None124    updated_at: int = None125    product: Product = field(default_factory=Product)126    variation: dict = field(default_factory=dict)127    printfiles: list[Printfile] = field(default_factory=list)128    placements: list[Placement] = field(default_factory=list)129    variants: list[Variant] = field(default_factory=list)130    mockups: list[Mockup] = field(default_factory=list)131    metadata: dict = field(default_factory=dict)132133    def to_dict(self) -> dict:134        data = {}135        data["key"] = self.key136        data["step"] = self.step137        data["seed"] = self.seed138        data["created_at"] = self.created_at139        data["updated_at"] = self.updated_at140        data["product"] = self.product.to_dict()141        data["variation"] = self.variation142        data["printfiles"] = [p.to_dict() for p in self.printfiles]143        data["placements"] = [p.to_dict() for p in self.placements]144        data["variants"] = [v.to_dict() for v in self.variants]145        data["mockups"] = [m.to_dict() for m in self.mockups]146        data["metadata"] = self.metadata147        return data148149    @classmethod150    def from_dict(cls, data: dict) -> "Task":151        data["product"] = Product.from_dict(data["product"])152        data["printfiles"] = [Printfile.from_dict(p) for p in data["printfiles"]]153        data["placements"] = [Placement.from_dict(p) for p in data["placements"]]154        data["variants"] = [Variant.from_dict(v) for v in data["variants"]]155        data["mockups"] = [Mockup.from_dict(m) for m in data["mockups"]]156        return cls(**data)157158    @property159    def desc(self) -> str:160        if self.product.title:161            return f"{self.product.title} ({self.key})"162        return f"({self.key})"163164    @property165    def stitch_color(self) -> str:166        return self.variation["paint"]["primary"].lower()167168    def place(self, step: Step) -> None:169        self.step = step.value170171    def wipe(self) -> None:172        self.metadata = {}