[30388f42] Infrastructure Hardening & Final Touches: Stabilized Lead Engine (Nginx routing, manager.py, Dockerfile fixes), restored known-good Nginx configs, and ensured all recent fixes are committed. System is ready for migration.
- Fixed Nginx proxy for /feedback/ and /lead/ routes. - Restored manager.py to use persistent SQLite DB and corrected test lead triggers. - Refined Dockerfile for lead-engine to ensure clean dependency installs. - Applied latest API configs (.env) to lead-engine and duckdns services. - Updated documentation (GEMINI.md, readme.md, RELOCATION.md, lead-engine/README.md) to reflect final state and lessons learned. - Committed all pending changes to main branch.
This commit is contained in:
91
lead-engine/trading_twins/debug_calendar.py
Normal file
91
lead-engine/trading_twins/debug_calendar.py
Normal file
@@ -0,0 +1,91 @@
|
||||
# lead-engine/trading_twins/debug_calendar.py
|
||||
import os
|
||||
import requests
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
from zoneinfo import ZoneInfo
|
||||
from threading import Thread, Lock
|
||||
import uvicorn
|
||||
from fastapi import FastAPI, Response, BackgroundTasks
|
||||
import msal
|
||||
|
||||
# --- Zeitzonen-Konfiguration ---
|
||||
TZ_BERLIN = ZoneInfo("Europe/Berlin")
|
||||
|
||||
# --- Konfiguration ---
|
||||
# Credentials für die Kalender-Lese-App (e.melcer)
|
||||
CAL_APPID = os.getenv("CAL_APPID")
|
||||
CAL_SECRET = os.getenv("CAL_SECRET")
|
||||
CAL_TENNANT_ID = os.getenv("CAL_TENNANT_ID")
|
||||
TARGET_EMAIL = "e.melcer@robo-planet.de"
|
||||
|
||||
GRAPH_API_ENDPOINT = "https://graph.microsoft.com/v1.0"
|
||||
|
||||
def get_access_token(client_id, client_secret, tenant_id):
|
||||
if not all([client_id, client_secret, tenant_id]):
|
||||
print("❌ Credentials missing in .env for Calendar Access")
|
||||
return None
|
||||
authority = f"https://login.microsoftonline.com/{tenant_id}"
|
||||
app = msal.ConfidentialClientApplication(client_id=client_id, authority=authority, client_credential=client_secret)
|
||||
# Scopes for Calendar.Read
|
||||
scopes = ["https://graph.microsoft.com/.default"]
|
||||
result = app.acquire_token_silent(scopes, account=None)
|
||||
if not result:
|
||||
result = app.acquire_token_for_client(scopes=scopes)
|
||||
if "access_token" in result:
|
||||
print("✅ Successfully acquired Access Token for Calendar.")
|
||||
return result["access_token"]
|
||||
else:
|
||||
print(f"❌ Failed to acquire Access Token: {result.get('error_description')}")
|
||||
return None
|
||||
|
||||
def check_calendar_availability():
|
||||
print(f"--- Checking Calendar for {TARGET_EMAIL} ---")
|
||||
token = get_access_token(CAL_APPID, CAL_SECRET, CAL_TENNANT_ID)
|
||||
if not token:
|
||||
print("❌ Cannot proceed without Access Token.")
|
||||
return None
|
||||
|
||||
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json", "Prefer": 'outlook.timezone="Europe/Berlin"'}
|
||||
|
||||
# Get next 5 events starting from now
|
||||
start_time = datetime.now(TZ_BERLIN).replace(minute=0, second=0, microsecond=0)
|
||||
if start_time.hour >= 17: start_time += timedelta(days=1); start_time = start_time.replace(hour=8)
|
||||
end_time = start_time + timedelta(days=3)
|
||||
|
||||
payload = {
|
||||
"schedules": [TARGET_EMAIL],
|
||||
"startTime": {"dateTime": start_time.isoformat(), "timeZone": "Europe/Berlin"},
|
||||
"endTime": {"dateTime": end_time.isoformat(), "timeZone": "Europe/Berlin"},
|
||||
"availabilityViewInterval": 60 # Check availability in 1-hour blocks
|
||||
}
|
||||
|
||||
url = f"{GRAPH_API_ENDPOINT}/users/{TARGET_EMAIL}/calendarView?startDateTime={start_time.isoformat()}&endDateTime={end_time.isoformat()}&$top=5"
|
||||
|
||||
try:
|
||||
response = requests.get(url, headers=headers)
|
||||
if response.status_code == 200:
|
||||
events = response.json().get("value", [])
|
||||
if not events:
|
||||
print("✅ API call successful, but no upcoming events found.")
|
||||
return []
|
||||
|
||||
print("\n--- Next 5 Upcoming Events ---")
|
||||
for event in events:
|
||||
subject = event.get('subject', 'No Subject')
|
||||
start = event.get('start', {}).get('dateTime')
|
||||
if start:
|
||||
dt_obj = datetime.fromisoformat(start.replace('Z', '+00:00')).astimezone(TZ_BERLIN)
|
||||
start_formatted = dt_obj.strftime('%A, %d.%m.%Y um %H:%M Uhr')
|
||||
else: start_formatted = "N/A"
|
||||
print(f"🗓️ {subject} -> {start_formatted}")
|
||||
return events
|
||||
else:
|
||||
print(f"❌ HTTP Error: {response.status_code} - {response.text}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"❌ An unexpected error occurred: {e}")
|
||||
return None
|
||||
|
||||
if __name__ == "__main__":
|
||||
check_calendar_availability()
|
||||
Reference in New Issue
Block a user