← back to Kravet Sheet Sync 2026 04 20

fix_pilot_variants.py

53 lines

#!/usr/bin/env python3
"""Add missing main-sell variant to 10 pilot products."""
import json, urllib.request, subprocess, io, csv

TOKEN=os.environ.get('SHOPIFY_ADMIN_TOKEN','')
URL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json'

def gql(q,v=None):
    body=json.dumps({"query":q,"variables":v or {}}).encode()
    return json.loads(urllib.request.urlopen(urllib.request.Request(URL,data=body,method="POST",
      headers={"Content-Type":"application/json","X-Shopify-Access-Token":TOKEN}),timeout=30).read())

def pg(q):
    r=subprocess.run(["ssh","root@45.61.58.125",
      f'PGPASSWORD=DW2024! psql -h 127.0.0.1 -U dw_admin -d dw_unified --csv -t -c "{q}"'],
      capture_output=True,text=True,check=True)
    return [row for row in csv.reader(io.StringIO(r.stdout)) if row]

# Pull dw_sku → shopify_id + MAP + cost + width from kravet_catalog (where I inserted)
rows = pg("""
  SELECT c.dw_sku, c.shopify_product_id, c.price_retail::text, c.cost_price::text,
         n.width
    FROM kravet_catalog c
    JOIN kravet_diff_new_2026_04_20 n ON n.new_dw_sku = c.dw_sku
   WHERE c.dw_sku IN ('DWKK-140010','DWKK-140056','DWKK-140544','DWKK-140783','DWKK-141930',
                      'DWKK-142436','DWKK-142909','DWKK-143582','DWKK-143879','DWKK-144813')
""")

ADD = """mutation($pid:ID!,$vs:[ProductVariantsBulkInput!]!,$st:ProductVariantsBulkCreateStrategy){
  productVariantsBulkCreate(productId:$pid,variants:$vs,strategy:$st){
    productVariants{id sku title price}
    userErrors{field message}
  }
}"""

for dw_sku, pid, price, cost, width in rows:
    w = str(width).strip() if width else ""
    option_val = f"Sold Per Single Roll - {w}In Wide" if w else "Single Roll"
    v = {
        "price": f"{float(price):.2f}",
        "inventoryItem": {"sku": dw_sku, "tracked": True},
        "optionValues": [{"optionName": "Title", "name": option_val}],
    }
    if cost and cost != "":
        v["inventoryItem"]["cost"] = f"{float(cost):.2f}"
    r = gql(ADD, {"pid": pid, "vs": [v], "st": "DEFAULT"})
    errs = r["data"]["productVariantsBulkCreate"]["userErrors"]
    if errs:
        print(f"  {dw_sku} FAIL: {errs}")
    else:
        nv = r["data"]["productVariantsBulkCreate"]["productVariants"][0]
        print(f"  {dw_sku}: added {nv['sku']} @ ${nv['price']}  '{nv['title']}'")