files.py
1.9 kB · python · 67 lines
1from automator.core.api import check_errors, shopify_request2from automator.core.errors import Retry, TaskAborted3from automator.core.models import Mockup, Task4from automator.core.steps import Step56BATCH = 2578MUTATION = """9mutation fileCreate($files: [FileCreateInput!]!) {10 fileCreate(files: $files) {11 files {12 alt13 fileStatus14 id15 ... on MediaImage {16 image {17 url18 }19 }20 }21 userErrors {22 field23 message24 }25 }26}27"""2829def filename(mockup: Mockup) -> str:30 return f"{mockup.name}.{mockup.extension}"3132def create_file(mockup: Mockup) -> dict:33 return {34 "alt": mockup.alt,35 "contentType": "IMAGE",36 "duplicateResolutionMode": "REPLACE",37 "filename": filename(mockup),38 "originalSource": mockup.url,39 }4041def send_batch(task: Task, batch: list[Mockup]) -> list[dict]:42 variables = {"files": [create_file(mockup) for mockup in batch]}43 result = shopify_request(task, MUTATION, variables)44 return check_errors(result, "fileCreate")["files"]4546def match(mockup: Mockup, files: list[dict]) -> str:47 for file in files:48 if file.get("alt") == mockup.alt:49 return file["id"]50 for file in files:51 source = (file.get("image") or {}).get("url") or ""52 if mockup.name in source:53 return file["id"]54 raise TaskAborted(f"no shopify file for {mockup.alt}")5556def send_files(task: Task) -> Task:57 for start in range(0, len(task.mockups), BATCH):58 batch = task.mockups[start:start + BATCH]59 files = send_batch(task, batch)60 for mockup in batch:61 mockup.shopify_id = match(mockup, files)62 return task6364def mrly_files(task: Task) -> Task:65 task = send_files(task)66 task.place(Step.STATUS)67 raise Retry(f"Current: {Step.FILES}. Next: {Step.STATUS}")