ping.py

1.2 kB · python · 31 lines

1from automator.core.api import extract_gid, printful_request2from automator.core.errors import Retry, TaskAborted3from automator.core.models import Task4from automator.core.steps import Step56PRINTFUL_PING_URL = "sync/products/@"7MAX_PING_ATTEMPTS = 1289def wait(task: Task) -> None:10    count = task.metadata.get("ping_count", 0) + 111    task.metadata["ping_count"] = count12    if count >= MAX_PING_ATTEMPTS:13        raise TaskAborted(f"ping_count {count} for task {task.key}")14    raise Retry(f"Current: {Step.PING}. Next: {Step.PING} ({count}/{MAX_PING_ATTEMPTS})")1516def mrly_ping(task: Task) -> Task:17    shopify_id = extract_gid(task.product.shopify_id)18    result = printful_request(task, "GET", f"{PRINTFUL_PING_URL}{shopify_id}", allow_404=True)19    if not result:20        wait(task)21    data = result["result"]22    task.product.printful_id = data["sync_product"]["id"]23    synced = {sv["sku"]: sv["id"] for sv in data["sync_variants"]}24    for variant in task.variants:25        if variant.name not in synced:26            wait(task)27    for variant in task.variants:28        variant.printful_id = synced[variant.name]29    task.product.synced = True30    task.place(Step.SYNC)31    return task