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 = {}