sync.py
2.1 kB · python · 69 lines
1import time2from automator.core.api import printful_request3from automator.core.errors import Retry, TaskAborted4from automator.core.models import Task, Variant5from automator.core.steps import Step67PRINTFUL_SYNC_URL = "sync/variant/"8VISIBLE = False9DELAY = 0.610BATCH = 301112def fetch_files(task: Task) -> list[dict]:13 files: list[dict] = []14 for placement in task.placements:15 printfile = next(pf for pf in task.printfiles if pf.id == placement.id)16 files.append({17 "type": placement.name,18 "url": printfile.url,19 "filename": f"{printfile.name}.png",20 "visible": VISIBLE,21 })22 return files2324def create_payload(task: Task, variant: Variant) -> dict:25 return {26 "variant_id": variant.id,27 "retail_price": variant.cost,28 "sku": variant.name,29 "is_ignored": False,30 "files": fetch_files(task),31 "options": [{"id": "stitch_color", "value": task.stitch_color}],32 }3334def sync_variant(task: Task, variant: Variant) -> Task:35 payload = create_payload(task, variant)36 result = printful_request(37 task,38 "PUT",39 f"{PRINTFUL_SYNC_URL}{variant.printful_id}",40 data=payload,41 )42 if not result:43 raise Retry(f"Current: {Step.SYNC}. Next: {Step.SYNC}")44 sync_variant_data = result["result"]["sync_variant"]45 if not sync_variant_data["synced"]:46 raise TaskAborted(f"variant {variant.name} not synced")47 if sync_variant_data["is_ignored"]:48 raise TaskAborted(f"variant {variant.name} ignored")49 variant.synced = True50 return task5152def unsynced_variants(task: Task) -> list[Variant]:53 return [v for v in task.variants if not v.synced]5455def process_batch(task: Task) -> Task:56 batch = unsynced_variants(task)[:BATCH]57 for i, variant in enumerate(batch):58 task = sync_variant(task, variant)59 if i < len(batch) - 1:60 time.sleep(DELAY)61 return task6263def mrly_sync(task: Task) -> Task:64 task = process_batch(task)65 if unsynced_variants(task):66 task.place(Step.SYNC)67 raise Retry(f"Current: {Step.SYNC}. Next: {Step.SYNC}")68 task.place(Step.PUBLISH)69 return task