Updated all Notion Verticals with sharpened Pains/Gains based on internal strategy (Ops vs Infra focus). Updated SuperOffice Connector README to reflect the 'Static Magic' architecture.
91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
import os
|
|
import requests
|
|
import json
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
NOTION_API_KEY = os.getenv("NOTION_API_KEY")
|
|
NOTION_DB_ID = "2ec88f4285448014ab38ea664b4c2b81" # Verticals DB
|
|
PRODUCT_DB_ID = "2ec88f42854480f0b154f7a07342eb58" # Product Categories DB (from user link)
|
|
|
|
headers = {
|
|
"Authorization": f"Bearer {NOTION_API_KEY}",
|
|
"Notion-Version": "2022-06-28",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
# 1. Fetch Product Map (ID -> Name)
|
|
product_map = {}
|
|
def fetch_products():
|
|
url = f"https://api.notion.com/v1/databases/{PRODUCT_DB_ID}/query"
|
|
response = requests.post(url, headers=headers, json={"page_size": 100})
|
|
if response.status_code == 200:
|
|
results = response.json().get("results", [])
|
|
for p in results:
|
|
p_id = p["id"]
|
|
# Name property might be "Name" or "Product Category"
|
|
props = p["properties"]
|
|
name = "Unknown"
|
|
if "Name" in props:
|
|
name = props["Name"]["title"][0]["plain_text"] if props["Name"]["title"] else "N/A"
|
|
elif "Product Category" in props:
|
|
name = props["Product Category"]["title"][0]["plain_text"] if props["Product Category"]["title"] else "N/A"
|
|
|
|
product_map[p_id] = name
|
|
# Also map the page ID itself if used in relations
|
|
|
|
else:
|
|
print(f"Error fetching products: {response.status_code}")
|
|
|
|
# 2. Check Verticals with Relation Resolution
|
|
def check_vertical_relations(search_term):
|
|
url = f"https://api.notion.com/v1/databases/{NOTION_DB_ID}/query"
|
|
payload = {
|
|
"filter": {
|
|
"property": "Vertical",
|
|
"title": {
|
|
"contains": search_term
|
|
}
|
|
}
|
|
}
|
|
resp = requests.post(url, headers=headers, json=payload)
|
|
if resp.status_code == 200:
|
|
results = resp.json().get("results", [])
|
|
if not results:
|
|
print(f"❌ No vertical found for '{search_term}'")
|
|
return
|
|
|
|
for page in results:
|
|
props = page["properties"]
|
|
title = props["Vertical"]["title"][0]["plain_text"]
|
|
|
|
# Resolve Primary
|
|
pp_ids = [r["id"] for r in props.get("Primary Product Category", {}).get("relation", [])]
|
|
pp_names = [product_map.get(pid, pid) for pid in pp_ids]
|
|
|
|
# Resolve Secondary
|
|
sp_ids = [r["id"] for r in props.get("Secondary Product", {}).get("relation", [])]
|
|
sp_names = [product_map.get(pid, pid) for pid in sp_ids]
|
|
|
|
print(f"\n🔹 VERTICAL: {title}")
|
|
print(f" Primary Product (Rel): {', '.join(pp_names)}")
|
|
print(f" Secondary Product (Rel): {', '.join(sp_names)}")
|
|
|
|
# Pains/Gains short check
|
|
pains = props.get("Pains", {}).get("rich_text", [])
|
|
print(f" Pains Length: {len(pains[0]['plain_text']) if pains else 0} chars")
|
|
|
|
else:
|
|
print(f"Error fetching vertical: {resp.status_code}")
|
|
|
|
# Run
|
|
print("Fetching Product Map...")
|
|
fetch_products()
|
|
print(f"Loaded {len(product_map)} products.")
|
|
|
|
print("\nChecking Verticals...")
|
|
targets = ["Hospital", "Hotel", "Logistics", "Manufacturing", "Retail", "Reinigungs", "Dienstleister", "Facility"]
|
|
for t in targets:
|
|
check_vertical_relations(t)
|