221 lines
8.6 KiB
Python
221 lines
8.6 KiB
Python
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()
|