[30388f42] Infrastructure Hardening: Repaired CE/Connector DB schema, fixed frontend styling build, implemented robust echo shield in worker v2.1.1, and integrated Lead Engine into gateway.
This commit is contained in:
220
company-explorer/backend/scripts/notion_tools/notion_db_setup.py
Normal file
220
company-explorer/backend/scripts/notion_tools/notion_db_setup.py
Normal file
@@ -0,0 +1,220 @@
|
||||
import requests
|
||||
import time
|
||||
import json
|
||||
|
||||
# --- Configuration ---
|
||||
NOTION_TOKEN = "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" # Replace with your actual Notion integration token
|
||||
PARENT_PAGE_ID = "2e088f42854480248289deb383da3818" # Replace with the ID of the Notion page where you want to create the databases
|
||||
NOTION_VERSION = "2022-06-28"
|
||||
NOTION_API_BASE_URL = "https://api.notion.com/v1"
|
||||
|
||||
HEADERS = {
|
||||
"Authorization": f"Bearer {NOTION_TOKEN}",
|
||||
"Notion-Version": NOTION_VERSION,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
# --- Database Schemas ---
|
||||
# Define basic properties for each database. Relations will be added in a second phase.
|
||||
|
||||
DATABASE_SCHEMAS = {
|
||||
"Product Master": {
|
||||
"title": [{"type": "text", "text": {"content": "Product Master"}}],
|
||||
"properties": {
|
||||
"Name": {"title": {}},
|
||||
"Beschreibung": {"rich_text": {}},
|
||||
"Spezifikationen": {"rich_text": {}},
|
||||
"Layer": {"multi_select": {"options": [{"name": "Cleaning"}, {"name": "Service"}, {"name": "Security"}]}},
|
||||
}
|
||||
},
|
||||
"Sector & Persona Master": {
|
||||
"title": [{"type": "text", "text": {"content": "Sector & Persona Master"}}],
|
||||
"properties": {
|
||||
"Name": {"title": {}},
|
||||
"RoboPlanet-Definition": {"rich_text": {}},
|
||||
"Personas": {"multi_select": {"options": []}}, # Options can be added later if known
|
||||
"Pains": {"rich_text": {}},
|
||||
"Gains": {"rich_text": {}},
|
||||
"Probing Questions": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"Messaging Matrix": {
|
||||
"title": [{"type": "text", "text": {"content": "Messaging Matrix"}}],
|
||||
"properties": {
|
||||
"Name": {"title": {}},
|
||||
"Satz 1": {"rich_text": {}},
|
||||
"Satz 2": {"rich_text": {}},
|
||||
"Voice Script": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"Competitive Radar": {
|
||||
"title": [{"type": "text", "text": {"content": "Competitive Radar"}}],
|
||||
"properties": {
|
||||
"Wettbewerber": {"title": {}},
|
||||
"News": {"url": {}},
|
||||
"Blogposts": {"url": {}},
|
||||
"Kill-Argumente": {"rich_text": {}},
|
||||
"Technische Specs": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"Enrichment Factory & RevOps": {
|
||||
"title": [{"type": "text", "text": {"content": "Enrichment Factory & RevOps"}}],
|
||||
"properties": {
|
||||
"Account Name": {"title": {}},
|
||||
"Umsatz": {"number": {"format": "euro"}},
|
||||
"Mitarbeiter": {"number": {"format": "number"}},
|
||||
"Ansprechpartner": {"rich_text": {}},
|
||||
"Job Titel": {"rich_text": {}},
|
||||
"Klassifizierung": {"multi_select": {"options": []}}, # Options can be added later if known
|
||||
"Outbound Metriken": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"The Brain": {
|
||||
"title": [{"type": "text", "text": {"content": "The Brain"}}],
|
||||
"properties": {
|
||||
"Titel": {"title": {}},
|
||||
"Lösungsfragmente": {"rich_text": {}},
|
||||
"Quelle": {"url": {}},
|
||||
}
|
||||
},
|
||||
"GTM Workspace": {
|
||||
"title": [{"type": "text", "text": {"content": "GTM Workspace"}}],
|
||||
"properties": {
|
||||
"Kampagnen Name": {"title": {}},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# --- Database Relations (Phase B) ---
|
||||
# Define which databases relate to each other.
|
||||
# The keys are the database names, and the values are lists of (property_name, related_database_name) tuples.
|
||||
DATABASE_RELATIONS = {
|
||||
"Product Master": [
|
||||
("Sector Master", "Sector & Persona Master"),
|
||||
("Messaging Matrix", "Messaging Matrix"),
|
||||
("The Brain", "The Brain"),
|
||||
("GTM Workspace", "GTM Workspace"),
|
||||
],
|
||||
"Sector & Persona Master": [
|
||||
("Product Master", "Product Master"),
|
||||
("Messaging Matrix", "Messaging Matrix"),
|
||||
],
|
||||
"Messaging Matrix": [
|
||||
("Product Master", "Product Master"),
|
||||
("Sector Master", "Sector & Persona Master"),
|
||||
],
|
||||
"The Brain": [
|
||||
("Product Master", "Product Master"),
|
||||
],
|
||||
"GTM Workspace": [
|
||||
("Product Master", "Product Master"),
|
||||
],
|
||||
# Competitive Radar and Enrichment Factory & RevOps do not have explicit relations to other *created* databases based on the document's "Notion Datenbank-Relationen" section.
|
||||
}
|
||||
|
||||
# --- Helper Functions ---
|
||||
|
||||
def create_notion_database(parent_page_id, db_name, properties):
|
||||
print(f"Attempting to create database: {db_name}")
|
||||
create_url = f"{NOTION_API_BASE_URL}/databases"
|
||||
payload = {
|
||||
"parent": {"type": "page_id", "page_id": parent_page_id},
|
||||
"title": DATABASE_SCHEMAS[db_name]["title"],
|
||||
"properties": properties,
|
||||
}
|
||||
try:
|
||||
response = requests.post(create_url, headers=HEADERS, json=payload)
|
||||
response.raise_for_status() # Raise an exception for HTTP errors
|
||||
db_data = response.json()
|
||||
db_id = db_data["id"]
|
||||
print(f"Successfully created database '{db_name}' with ID: {db_id}")
|
||||
return db_id
|
||||
except requests.exceptions.HTTPError as e:
|
||||
print(f"HTTP Error creating database {db_name}: {e}")
|
||||
if response is not None:
|
||||
print(f"Response content: {response.text}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"An unexpected error occurred while creating database {db_name}: {e}")
|
||||
return None
|
||||
|
||||
def update_notion_database_relations(database_id, relations_to_add, created_db_ids):
|
||||
print(f"Attempting to update relations for database ID: {database_id}")
|
||||
update_url = f"{NOTION_API_BASE_URL}/databases/{database_id}"
|
||||
properties_to_add = {}
|
||||
for prop_name, related_db_name in relations_to_add:
|
||||
if related_db_name in created_db_ids:
|
||||
related_db_id = created_db_ids[related_db_name]
|
||||
properties_to_add[prop_name] = {
|
||||
"relation": {
|
||||
"database_id": related_db_id,
|
||||
"dual_property": {} # Notion automatically creates a dual property
|
||||
}
|
||||
}
|
||||
else:
|
||||
print(f"Warning: Related database '{related_db_name}' not found among created databases. Skipping relation for '{prop_name}'.")
|
||||
|
||||
if not properties_to_add:
|
||||
print(f"No relations to add for database ID: {database_id}")
|
||||
return False
|
||||
|
||||
payload = {
|
||||
"properties": properties_to_add
|
||||
}
|
||||
try:
|
||||
response = requests.patch(update_url, headers=HEADERS, json=payload)
|
||||
response.raise_for_status()
|
||||
print(f"Successfully updated relations for database ID: {database_id}")
|
||||
return True
|
||||
except requests.exceptions.HTTPError as e:
|
||||
print(f"HTTP Error updating relations for database ID {database_id}: {e}")
|
||||
if response is not None:
|
||||
print(f"Response content: {response.text}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"An unexpected error occurred while updating relations for database ID {database_id}: {e}")
|
||||
return False
|
||||
|
||||
def main():
|
||||
if NOTION_TOKEN == "YOUR_NOTION_TOKEN" or PARENT_PAGE_ID == "YOUR_PARENT_PAGE_ID":
|
||||
print("ERROR: Please update NOTION_TOKEN and PARENT_PAGE_ID in the script before running.")
|
||||
return
|
||||
|
||||
created_db_ids = {}
|
||||
|
||||
print("--- Phase A: Creating Databases ---")
|
||||
for db_name, schema in DATABASE_SCHEMAS.items():
|
||||
db_id = create_notion_database(PARENT_PAGE_ID, db_name, schema["properties"])
|
||||
if db_id:
|
||||
created_db_ids[db_name] = db_id
|
||||
print(f"Waiting 15 seconds for Notion to index database '{db_name}'...")
|
||||
time.sleep(15)
|
||||
else:
|
||||
print(f"Failed to create database: {db_name}. Aborting Phase A.")
|
||||
return
|
||||
|
||||
print("\n--- Phase B: Establishing Relations ---")
|
||||
if not created_db_ids:
|
||||
print("No databases were created in Phase A. Cannot establish relations.")
|
||||
return
|
||||
|
||||
for db_name, relations_config in DATABASE_RELATIONS.items():
|
||||
if db_name in created_db_ids:
|
||||
db_id = created_db_ids[db_name]
|
||||
print(f"Processing relations for '{db_name}' (ID: {db_id})...")
|
||||
if update_notion_database_relations(db_id, relations_config, created_db_ids):
|
||||
print(f"Waiting 15 seconds after updating relations for '{db_name}'...")
|
||||
time.sleep(15)
|
||||
else:
|
||||
print(f"Failed to update relations for: {db_name}. Continuing with other databases.")
|
||||
else:
|
||||
print(f"Warning: Database '{db_name}' not found in created IDs. Skipping relation updates.")
|
||||
|
||||
print("\n--- Setup Complete ---")
|
||||
print("Please ensure your Notion integration has access to the parent page and its sub-pages in Notion UI.")
|
||||
print("Created database IDs:")
|
||||
for name, id_val in created_db_ids.items():
|
||||
print(f"- {name}: {id_val}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user