151 lines
5.5 KiB
Python
151 lines
5.5 KiB
Python
|
|
import requests
|
|
import json
|
|
|
|
# --- Configuration ---
|
|
try:
|
|
with open("notion_token.txt", "r") as f:
|
|
NOTION_TOKEN = f.read().strip()
|
|
except FileNotFoundError:
|
|
print("Error: notion_token.txt not found.")
|
|
exit(1)
|
|
|
|
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",
|
|
}
|
|
|
|
# DB: Sector & Persona Master
|
|
DB_ID = "2e288f42-8544-8113-b878-ec99c8a02a6b"
|
|
|
|
# --- Data ---
|
|
archetypes = [
|
|
{
|
|
"name": "Wirtschaftlicher Entscheider",
|
|
"pains": [
|
|
"Steigende operative Personalkosten und Fachkräftemangel gefährden die Profitabilität.",
|
|
"Unklare Amortisation (ROI) und Risiko von Fehlinvestitionen bei neuen Technologien.",
|
|
"Intransparente Folgekosten (TCO) und schwierige Budgetplanung über die Lebensdauer."
|
|
],
|
|
"gains": [
|
|
"Nachweisbare Senkung der operativen Kosten (10-25%) und schnelle Amortisation.",
|
|
"Sicherung der Wettbewerbsfähigkeit durch effizientere Kostenstrukturen.",
|
|
"Volle Transparenz und Planbarkeit durch klare Service-Modelle (SLAs)."
|
|
]
|
|
},
|
|
{
|
|
"name": "Operativer Entscheider",
|
|
"pains": [
|
|
"Personelle Unterbesetzung führt zu Überstunden, Stress und Qualitätsmängeln.",
|
|
"Wiederkehrende Routineaufgaben binden wertvolle Fachkräfte-Ressourcen.",
|
|
"Schwierigkeit, gleichbleibend hohe Standards (Hygiene/Service) 24/7 zu garantieren."
|
|
],
|
|
"gains": [
|
|
"Spürbare Entlastung des Teams von Routineaufgaben (20-40%).",
|
|
"Garantierte, gleichbleibend hohe Ausführungsqualität unabhängig von der Tagesform.",
|
|
"Stabilisierung der operativen Abläufe und Kompensation von Personalausfällen."
|
|
]
|
|
},
|
|
{
|
|
"name": "Infrastruktur-Verantwortlicher",
|
|
"pains": [
|
|
"Sorge vor komplexer Integration in bestehende IT- und Gebäudeinfrastruktur (WLAN, Türen, Aufzüge).",
|
|
"Risiko von hohen Ausfallzeiten und aufwändiger Fehlerbehebung ohne internes Spezialwissen.",
|
|
"Unklare Wartungsaufwände und Angst vor 'Insel-Lösungen' ohne Schnittstellen."
|
|
],
|
|
"gains": [
|
|
"Reibungslose, fachgerechte Integration durch Experten-Support (Plug & Play).",
|
|
"Maximale Betriebssicherheit durch proaktives Monitoring und schnelle Reaktionszeiten.",
|
|
"Zentrales Management und volle Transparenz über Systemstatus und Wartungsbedarf."
|
|
]
|
|
},
|
|
{
|
|
"name": "Innovations-Treiber",
|
|
"pains": [
|
|
"Verlust der Attraktivität als moderner Arbeitgeber oder Dienstleister (Veraltetes Image).",
|
|
"Fehlende 'Wow-Effekte' in der Kundeninteraktion und mangelnde Differenzierung vom Wettbewerb.",
|
|
"Verpasste Chancen durch fehlende Datengrundlage für digitale Optimierungen."
|
|
],
|
|
"gains": [
|
|
"Positionierung als Innovationsführer und Steigerung der Markenattraktivität.",
|
|
"Schaffung einzigartiger Kundenerlebnisse durch sichtbare High-Tech-Lösungen.",
|
|
"Gewinnung wertvoller Daten zur kontinuierlichen Prozessoptimierung und Digitalisierung."
|
|
]
|
|
}
|
|
]
|
|
|
|
# --- Helper Functions ---
|
|
|
|
def format_rich_text(text):
|
|
return {"rich_text": [{"type": "text", "text": {"content": text}}]}
|
|
|
|
def format_title(text):
|
|
return {"title": [{"type": "text", "text": {"content": text}}]}
|
|
|
|
def find_page(title):
|
|
url = f"{NOTION_API_BASE_URL}/databases/{DB_ID}/query"
|
|
payload = {
|
|
"filter": {
|
|
"property": "Name",
|
|
"title": {"equals": title}
|
|
}
|
|
}
|
|
resp = requests.post(url, headers=HEADERS, json=payload)
|
|
resp.raise_for_status()
|
|
results = resp.json().get("results")
|
|
return results[0] if results else None
|
|
|
|
def create_page(properties):
|
|
url = f"{NOTION_API_BASE_URL}/pages"
|
|
payload = {
|
|
"parent": {"database_id": DB_ID},
|
|
"properties": properties
|
|
}
|
|
resp = requests.post(url, headers=HEADERS, json=payload)
|
|
resp.raise_for_status()
|
|
print("Created.")
|
|
|
|
def update_page(page_id, properties):
|
|
url = f"{NOTION_API_BASE_URL}/pages/{page_id}"
|
|
payload = {"properties": properties}
|
|
resp = requests.patch(url, headers=HEADERS, json=payload)
|
|
resp.raise_for_status()
|
|
print("Updated.")
|
|
|
|
# --- Main Sync Loop ---
|
|
|
|
def main():
|
|
print(f"Syncing {len(archetypes)} Personas to Notion DB {DB_ID}...")
|
|
|
|
for p in archetypes:
|
|
print(f"Processing '{p['name']}'...")
|
|
|
|
# Format Pains/Gains as lists with bullets for Notion Text field
|
|
pains_text = "\n".join([f"- {item}" for item in p["pains"]])
|
|
gains_text = "\n".join([f"- {item}" for item in p["gains"]])
|
|
|
|
properties = {
|
|
"Name": format_title(p["name"]),
|
|
"Pains": format_rich_text(pains_text),
|
|
"Gains": format_rich_text(gains_text),
|
|
# Optional: Add a tag to distinguish them from Sectors if needed?
|
|
# Currently just relying on Name uniqueness.
|
|
}
|
|
|
|
existing_page = find_page(p["name"])
|
|
|
|
if existing_page:
|
|
print(f" -> Found existing page {existing_page['id']}. Updating...")
|
|
update_page(existing_page["id"], properties)
|
|
else:
|
|
print(" -> Creating new page...")
|
|
create_page(properties)
|
|
|
|
print("Sync complete.")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|