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")