parse.py
3.7 kB · python · 113 lines
1from catalog.fetch import raw_path2from catalog.helpers import catalog_map, save_product3from catalog.models import Mockup, Placement, Product, Variant4from env import load_json56def get_primaries(data):7 if data == "Black":8 return ["Black"]9 if data == "White":10 return ["White"]11 if data == "Both":12 return ["Black", "White"]13 raise Exception(f"Unknown primaries: {data}")1415def get_stitch_colors(product_data):16 if "product_options" not in product_data["data"]:17 return []18 for option in product_data["data"]["product_options"]:19 if option["name"] == "stitch_color":20 values = option["values"]21 if isinstance(values, dict):22 values = list(values.values())23 return sorted([v.capitalize() for v in values])24 return []2526def get_technique(product_data):27 techniques = [t["key"] for t in product_data["data"]["techniques"]]28 if len(techniques) > 1:29 raise Exception("Multiple techniques found for product")30 return techniques[0]3132def parse_placements(mockup_data):33 placements = [34 Placement(35 name=item["placement"],36 display=item["display_name"],37 width=item["print_area_width"],38 height=item["print_area_height"],39 dpi=item["dpi"],40 is_ignored=False41 )42 for item in mockup_data["data"]43 if item["print_area_type"] == "simple"44 ]45 unique_placements = []46 seen_placements = set()47 for p in placements:48 if p.name not in seen_placements:49 unique_placements.append(p)50 seen_placements.add(p.name)51 return sorted(unique_placements, key=lambda p: p.name)5253def parse_mockups(mockup_data):54 mockups = [55 Mockup(56 id=m["id"],57 category=m["category_name"],58 title=m["view_name"],59 variant_ids=m["restricted_to_variants"],60 is_ignored=False,61 )62 for item in mockup_data["data"]63 for m in item["mockup_styles"]64 if item["print_area_type"] == "simple"65 ]66 unique_mockups = []67 seen_mockups = set()68 for m in mockups:69 if m.alt not in seen_mockups:70 unique_mockups.append(m)71 seen_mockups.add(m.alt)72 return sorted(unique_mockups, key=lambda m: m.id)7374def parse_variants(variant_data, price_data):75 cost_map = {76 item["id"]: item["techniques"][0]["price"]77 for item in price_data["data"]["variants"]78 }79 return [80 Variant(81 id=v["id"],82 size=str(v["size"]),83 color=v["color"] if v["color"] else "White",84 cost=cost_map[v["id"]],85 is_ignored=False86 )87 for v in variant_data["data"]88 ]8990def parse_products(ids: list[int]):91 print(f"Parsing {len(ids)} products")92 rows = catalog_map()93 for id in ids:94 row = rows[id]95 print(f"Parsing: {id} - {row['title']}")96 product_data = load_json(raw_path("products", id))97 variant_data = load_json(raw_path("variants", id))98 price_data = load_json(raw_path("prices", id))99 mockup_data = load_json(raw_path("mockups", id))100 product = Product(101 id=id,102 category=row["category"],103 title=row["title"],104 technique=get_technique(product_data),105 primaries=get_primaries(row["primaries"]),106 stitch_colors=get_stitch_colors(product_data),107 placements=parse_placements(mockup_data),108 variants=parse_variants(variant_data, price_data),109 mockups=parse_mockups(mockup_data)110 )111 save_product(product)112 print(f"Parsed: {product.desc}")113 print(f"Parsed {len(ids)} products")