[object Object]

← back to Dw Collection Banner Audit

landed 29 room-render banners live (custom+smart), 29/29 ok, rollback logged

0917475cb8c7f930713ef90ca11b3fee445d78d4 · 2026-07-30 10:16:06 -0700 · steve

Files touched

Diff

commit 0917475cb8c7f930713ef90ca11b3fee445d78d4
Author: steve <steve@designerwallcoverings.com>
Date:   Thu Jul 30 10:16:06 2026 -0700

    landed 29 room-render banners live (custom+smart), 29/29 ok, rollback logged
---
 land_renders.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rollback.jsonl  | 29 ++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+)

diff --git a/land_renders.py b/land_renders.py
new file mode 100644
index 0000000..055c5eb
--- /dev/null
+++ b/land_renders.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+"""
+Upload the 29 room-render PNGs to Shopify + set each as its collection banner.
+Uses REST image.attachment (base64) so Shopify hosts the image (no staged-upload).
+Auto-detects custom vs smart collection (tries custom, falls back to smart).
+Records old->new in rollback.jsonl. Detects storage-cap failures and stops.
+"""
+import json, os, base64, time, urllib.request, glob
+
+HERE = os.path.dirname(os.path.abspath(__file__))
+STORE = "designer-laboratory-sandbox.myshopify.com"; API = "2024-10"
+TOKEN = os.environ["SHOPIFY_ADMIN_TOKEN"]
+cols = {c["handle"]: c for c in json.load(open(os.path.join(HERE, "dw_collections.json")))}
+prop = {r["handle"]: r for r in json.load(open(os.path.join(HERE, "proposal.json")))}
+
+def rest_put(kind, cid, payload):
+    url = f"https://{STORE}/admin/api/{API}/{kind}/{cid}.json"
+    req = urllib.request.Request(url, data=json.dumps(payload).encode(),
+        headers={"X-Shopify-Access-Token": TOKEN, "Content-Type": "application/json"}, method="PUT")
+    return urllib.request.urlopen(req, timeout=60)
+
+log = open(os.path.join(HERE, "rollback.jsonl"), "a")
+files = sorted(glob.glob(os.path.join(HERE, "room_renders", "*.png")))
+ok = fail = 0
+for i, f in enumerate(files, 1):
+    handle = os.path.basename(f)[:-4]
+    c = cols.get(handle)
+    if not c:
+        print(f"  SKIP {handle} (no collection)"); continue
+    cid = c["id"]; title = c["title"]
+    b64 = base64.b64encode(open(f, "rb").read()).decode()
+    old_src = (prop.get(handle) or {}).get("current_src")
+    done = False
+    for kind, key in [("custom_collections", "custom_collection"), ("smart_collections", "smart_collection")]:
+        try:
+            resp = rest_put(kind, cid, {key: {"id": cid, "image": {"attachment": b64, "alt": title}}})
+            data = json.load(resp)
+            img = data.get(key, {}).get("image")
+            new_src = img.get("src") if img else None
+            print(f"  OK   {handle}  ({kind.split('_')[0]}) -> {new_src.rsplit('/',1)[-1][:40] if new_src else '?'}")
+            log.write(json.dumps({"handle": handle, "ok": True, "old_src": old_src,
+                                  "new_src": new_src, "room_render": True}) + "\n")
+            ok += 1; done = True; break
+        except urllib.error.HTTPError as e:
+            body = e.read().decode()[:200]
+            if e.code == 404:
+                continue  # wrong collection type, try the other
+            if "STORAGE" in body.upper() or "storage" in body.lower():
+                print(f"  STORAGE-CAP HIT on {handle}: {body}"); log.close()
+                print("STOPPING — Shopify file storage cap reached."); raise SystemExit(2)
+            print(f"  FAIL {handle}: HTTP {e.code} {body}")
+            log.write(json.dumps({"handle": handle, "ok": False, "err": f"{e.code} {body}"}) + "\n")
+            fail += 1; done = True; break
+        except Exception as e:
+            print(f"  ERR  {handle}: {str(e)[:120]}"); fail += 1; done = True; break
+    if not done:
+        print(f"  FAIL {handle}: neither custom nor smart matched"); fail += 1
+    time.sleep(0.7)
+log.close()
+print(f"\nlanded ok={ok} fail={fail}")
diff --git a/rollback.jsonl b/rollback.jsonl
index 3b9f57d..e84b69e 100644
--- a/rollback.jsonl
+++ b/rollback.jsonl
@@ -178,3 +178,32 @@
 {"handle": "material-wood-veneer", "ok": true, "old_src": null, "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T41037_8063761d-034e-4abd-932a-425cd7191ad9.jpg?v=1781202383", "new_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/T41037_8063761d-034e-4abd-932a-425cd7191ad9.jpg?v=1785429944", "new_dim": "2520x2520"}
 {"handle": "brunschwig-fils", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/8015150_611_1190253b-805d-4b1e-8614-a26eacce991f.jpg?v=1776628380", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/BR-69004_400_2.png?v=1785390806", "new_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/BR-69004_400_2.png?v=1785429997", "retry": true}
 {"handle": "toile", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/fdc3ed9b160840cdab57f28b2d467ded.jpg?v=1776433857", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/28f2c3e3ef51413d6970d3cf2e89f041.jpg?v=1733964662", "new_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/fdc3ed9b160840cdab57f28b2d467ded.jpg?v=1785429999", "retry": true}
+{"handle": "apartment-wallpaper", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/PSW1165RL.jpg?v=1776402960", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/f772c1bc4db6f2b5d2a25dae93f808f2.png?v=1785430802", "room_render": true}
+{"handle": "british-walls", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/2d765d423c431592d36f170c3cb6c2a2_c3e39d6c-bdb2-4550-baa4-4571d06e26e7.jpg?v=1774494103", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/afa15867c8332e30947da963b202f760.png?v=1785430808", "room_render": true}
+{"handle": "european-wallpapers", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/w7971-03_j38mfhvsedzty35k.jpg?v=1774037440", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/460679e79d4cf9f8cc660c5347d92f7b.png?v=1785430813", "room_render": true}
+{"handle": "gaston-nuevo-mundo", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/GDT5566_002_d3fb549f-4240-40f0-bfcb-f0fa9c112fc1.jpg?v=1774040256", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/1da46c1f7921429e00b34207d68becea.png?v=1785430816", "room_render": true}
+{"handle": "green-wall-textures", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/2a45ebc332c1f7e896e5aa7e4133c172.jpg?v=1776627456", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/c644bfb3ccbdc6922846c899a235d5e9.png?v=1785430821", "room_render": true}
+{"handle": "hollywood-type-2-wallpaper-collection", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/3fa90de5a75173afd6c3b3df45518928_df7b3ca1-5a6b-43b0-b939-a5a4fbac0f8d.jpg?v=1776628634", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/0b062f89f535ed2a527f54dca9ed9b5f.png?v=1785430827", "room_render": true}
+{"handle": "hollywood-wallpaper-commercial-wallpaper", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/c08a6c70594d67a16a0a1dc181c4af8e.jpg?v=1776628244", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/86290c43682a1ce4a59a97037dc8ba64.png?v=1785430833", "room_render": true}
+{"handle": "luxuria-fine-textile-wallcoverings-by-phillipe-romano", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/desima_room.jpg?v=1776627884", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/b00458f9d00495d8041b10dde75db124.png?v=1785430838", "room_render": true}
+{"handle": "maharam-wallcoverings", "ok": true, "old_src": null, "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/78d8573603fc1bb01ff4be9ac57920cd.png?v=1785430843", "room_render": true}
+{"handle": "mark-alexander", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/MW139-02-abac-patchwork-wallcovering-gris_01_1a4fd18b-fa68-49d0-bc05-37ca212b1523.jpg?v=1776627567", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/65567a919686d62993b0ca72c4f11da7.png?v=1785430848", "room_render": true}
+{"handle": "material-leather", "ok": true, "old_src": null, "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/306a5145dcc7aa3e57e72a30fe787419.png?v=1785430854", "room_render": true}
+{"handle": "natural-paint", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/8628cb0b4037fea81c1544f85021859b_22e4706d-e231-4496-82bc-2e4d7a7884fa.jpg?v=1774495687", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/baa3d9d28f2afae94e61d5d177cdaa6d.png?v=1785430858", "room_render": true}
+{"handle": "naturally-glamorous", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/HLW-73008-cleaned.jpg?v=1776628621", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/18904d2846215559be1278da35a95522.png?v=1785430865", "room_render": true}
+{"handle": "phillipe-romano-asian-essence", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/WOS3471_WT_ba85ae6e-2aef-4f79-8bec-e8d28a5c4f34.jpg?v=1774040611", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/a1c143aaeb8c1d102e393469f3e9efb5.png?v=1785430868", "room_render": true}
+{"handle": "phillipe-romano-elegante", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/WTE6045_WT_f0f33024-2f0e-40f1-bbad-53ae3f2c721c.jpg?v=1774040317", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/7afddfaa7381a673cc4efab3dedf0c02.png?v=1785430871", "room_render": true}
+{"handle": "phillipe-romano-enlightenment", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/Phillipe_Romano_Wallcovering_PRW_920396_60247b3a-7765-41b1-beb1-e000288ed220.jpg?v=1774494275", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/e5b189a20fdc9035cf1bc5cd1efcd7d3.png?v=1785430874", "room_render": true}
+{"handle": "phillipe-romano-essential-textures", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/12edb155a6a9af20515cc417f1d2caff_8be81f42-fabe-413a-8804-a0ce35f0ba9a.jpg?v=1776628093", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/2a3aba3126ea9a06827d3cc378b6676c.png?v=1785430880", "room_render": true}
+{"handle": "phillipe-romano-fabrics", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/e4a2a1e502187ba4650e797610a9eab3_6e20047c-70f6-47c9-8a48-1215d0240a5c.jpg?v=1774495617", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/b91c3f3bb08a5f00c798fc7af161ce0f.png?v=1785430886", "room_render": true}
+{"handle": "phillipe-romano-faux-leather", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/TR-VT-01_0f374878-69d0-4656-9fc2-ba0b4e44bca4.jpg?v=1774493814", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/ef087a19c915434c7c6d06fae031b5d3.png?v=1785430889", "room_render": true}
+{"handle": "phillipe-romano-monument-collection", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/0aa27704811998ea44f5411dbaae7d76_566f6b7e-86b0-4874-b45c-ab7fb258e8f0.jpg?v=1774041172", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/9bf7a2a0817bac8c320b6041c17d2c16.png?v=1785430892", "room_render": true}
+{"handle": "phillipe-romano-pattern-upholstery", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/la-antonia-basketweave-prg-47836-bedroom.jpg?v=1783290286", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/e0e5b05c039cc75e450e0e4b160bdd69.png?v=1785430895", "room_render": true}
+{"handle": "phillipe-romano-print-basecloths", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/T2-BL-11_a321a15d-f92e-4833-81e7-1559488db75c.jpg?v=1774041641", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/20687d5c646cc04832871607502ca6a8.png?v=1785430899", "room_render": true}
+{"handle": "phillipe-romano-textures-vol-4", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/a6315a3b91580d7d48f21c7ce79e3afe.jpg?v=1774495787", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/5c7b1bbe757b2a2b80632ff6d8c872a7.png?v=1785430904", "room_render": true}
+{"handle": "phillipe-romano-wilderie-collection", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/la-antonia-basketweave-prg-47836-bedroom_5cf2a608-55ea-45e9-bdbd-a5c090ed7354.jpg?v=1783290289", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/342e7f67e6a92b3abfa5f0a692edcc6b.png?v=1785430908", "room_render": true}
+{"handle": "ronald-redding", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/W3744_5_5b39a56c-7391-4d7c-b421-2c7ac397d32b.jpg?v=1774040251", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/7de4b7e71eb0e13d7159b960c96f3e98.png?v=1785430911", "room_render": true}
+{"handle": "surface-stick-3m-self-adhesive", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/d216698b45ba75f8aedc2455b951664e.jpg?v=1538248333", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/12d0274a67d21fba9d1360a2965a99d9.png?v=1785430916", "room_render": true}
+{"handle": "surface-stick", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/fa21fa59bf0a269895a073efd17f3e4a.jpg?v=1774495250", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/36b2f26509abc4300bdf4a76606ced8d.png?v=1785430921", "room_render": true}
+{"handle": "tables", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/DWWD-60545-DesignerWallcoverings-Los-Angeles-1_6d86037c-42ff-4232-bab2-a59fcc218e33.png?v=1774494658", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/2a8bdb9807069b184e0bd4b9e9f52114.png?v=1785430927", "room_render": true}
+{"handle": "throw-blanket", "ok": true, "old_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/11837038-art-breasts-v2-by-designerwallcoverings_19-1112_7ea48495-cba3-46a9-bd2e-739d1d377b52.jpg?v=1774495590", "new_src": "https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/35780b668c9b8f45975f124ccf8ead2f.png?v=1785430933", "room_render": true}

← 04bd25e 29 room-render banners generated (16:9, settlement-clear), c  ·  back to Dw Collection Banner Audit  ·  auto-save: 2026-07-30T10:16:54 (1 files) — deeper_dig.py b0b46f5 →