product.py

2.7 kB · python · 86 lines

1from automator.core.api import check_errors, shopify_request2from automator.core.errors import Retry, TaskAborted3from automator.core.models import Task, Variant4from automator.core.steps import Step56VENDOR = "carlomitchener"7CATEGORY = "gid://shopify/TaxonomyCategory/na"89MUTATION = """10mutation productSet($input: ProductSetInput!, $synchronous: Boolean!) {11    productSet(synchronous: $synchronous, input: $input) {12        product {13            id14            variants(first: 100) {15                nodes {16                    id17                    sku18                }19            }20        }21        userErrors {22            field23            message24        }25    }26}27"""2829def set_tags(task: Task) -> list[str]:30    return [task.product.category, task.product.title]3132def set_sizes(task: Task) -> list[str]:33    sizes = []34    for variant in task.variants:35        if variant.size not in sizes:36            sizes.append(variant.size)37    return sizes3839def set_product_options(task: Task) -> list[dict]:40    values = [{"name": size} for size in set_sizes(task)]41    return [{"name": "Size", "position": 1, "values": values}]4243def create_variant_payload(variant: Variant) -> dict:44    return {45        "inventoryItem": {"requiresShipping": True, "tracked": False},46        "optionValues": [{"optionName": "Size", "name": variant.size}],47        "price": variant.cost,48        "sku": variant.name,49        "taxable": False,50    }5152def create_product_payload(task: Task) -> dict:53    return {54        "category": CATEGORY,55        "descriptionHtml": "",56        "files": [{"id": m.shopify_id} for m in task.mockups],57        "handle": task.key,58        "productOptions": set_product_options(task),59        "productType": str(task.product.id),60        "status": "ACTIVE",61        "tags": set_tags(task),62        "title": task.product.title,63        "variants": [create_variant_payload(v) for v in task.variants],64        "vendor": VENDOR,65    }6667def create_product(task: Task) -> dict:68    variables = {"input": create_product_payload(task), "synchronous": True}69    result = shopify_request(task, MUTATION, variables)70    return check_errors(result, "productSet")7172def parse_result(task: Task, data: dict) -> Task:73    product = data["product"]74    task.product.shopify_id = product["id"]75    variants = {node["sku"]: node["id"] for node in product["variants"]["nodes"]}76    for variant in task.variants:77        if variant.name not in variants:78            raise TaskAborted(f"shopify lost variant {variant.name}")79        variant.shopify_id = variants[variant.name]80    return task8182def mrly_product(task: Task) -> Task:83    data = create_product(task)84    task = parse_result(task, data)85    task.place(Step.PING)86    raise Retry(f"Current: {Step.PRODUCT}. Next: {Step.PING}")