process.py

1.9 kB · python · 47 lines

1from automator.core.api import printful_request2from automator.core.errors import Retry, TaskAborted3from automator.core.models import Task4from automator.core.steps import Step56PRINTFUL_POLL_URL = "v2/mockup-tasks?id="7MAX_PENDING_ATTEMPTS = 1089def count_attempt(task: Task) -> int:10    count = task.metadata.get("mockup_pending_count", 0) + 111    task.metadata["mockup_pending_count"] = count12    if count >= MAX_PENDING_ATTEMPTS:13        raise TaskAborted(f"mockup_pending_count {count} for task {task.key}")14    return count1516def fetch_result(task: Task) -> dict:17    generator_id = task.metadata["mockup_generator_id"]18    result = printful_request(task, "GET", f"{PRINTFUL_POLL_URL}{generator_id}")19    if not result.get("data"):20        count = count_attempt(task)21        raise Retry(f"Current: {Step.PROCESS}. Next: {Step.PROCESS} (empty {count}/{MAX_PENDING_ATTEMPTS})")22    data = result["data"][0]23    status = data["status"]24    if status == "completed":25        return data26    if status == "failed":27        raise TaskAborted(f"printful mockup task failed for {task.key}")28    count = count_attempt(task)29    raise Retry(f"Current: {Step.PROCESS}. Next: {Step.PROCESS} ({status} {count}/{MAX_PENDING_ATTEMPTS})")3031def parse_result(task: Task, result: dict) -> Task:32    mockups = {m.id: m for m in task.mockups}33    for variant_data in result["catalog_variant_mockups"]:34        for mockup_data in variant_data["mockups"]:35            style_id = mockup_data["style_id"]36            if style_id not in mockups:37                raise TaskAborted(f"unknown mockup style {style_id} for {task.key}")38            mockups[style_id].url = mockup_data["mockup_url"]39    return task4041def mrly_process(task: Task) -> Task:42    result = fetch_result(task)43    task = parse_result(task, result)44    task.mockups = [m for m in task.mockups if m.url]45    task.mockups = sorted(task.mockups, key=lambda m: (m.is_tile, m.id))46    task.place(Step.FILES)47    return task