demo showcase

This commit is contained in:
2026-08-10 16:47:13 +02:00
parent 7bfd7c0ff3
commit 946c2832ea
5 changed files with 195 additions and 22 deletions
+30 -15
View File
@@ -2,21 +2,36 @@
# Licensed under the MIT License. See LICENSE file in project root for details.
import os
import mysql.connector
import sqlite3
DB_HOST = os.environ.get("DB_HOST", "mariadb.fritz.box")
DB_PORT = int(os.environ.get("DB_PORT", "3306"))
DB_NAME = os.environ.get("DB_NAME", "calendar_sync")
DB_USER = os.environ["DB_USER"]
DB_PASSWORD = os.environ["DB_PASSWORD"]
DB_BACKEND = os.environ.get("DB_BACKEND", "mysql")
if DB_BACKEND == "sqlite":
DB_PATH = os.environ.get("DB_PATH", "demo.db")
def get_connection(autocommit: bool = True):
return mysql.connector.connect(
host=DB_HOST,
port=DB_PORT,
user=DB_USER,
password=DB_PASSWORD,
database=DB_NAME,
autocommit=autocommit,
)
def get_connection(autocommit: bool = True):
conn = sqlite3.connect(DB_PATH)
conn.execute("PRAGMA journal_mode=WAL")
conn.execute("PRAGMA foreign_keys=ON")
conn.row_factory = sqlite3.Row
if autocommit:
conn.isolation_level = None
return conn
else:
import mysql.connector
DB_HOST = os.environ.get("DB_HOST", "mariadb.fritz.box")
DB_PORT = int(os.environ.get("DB_PORT", "3306"))
DB_NAME = os.environ.get("DB_NAME", "calendar_sync")
DB_USER = os.environ["DB_USER"]
DB_PASSWORD = os.environ["DB_PASSWORD"]
def get_connection(autocommit: bool = True):
return mysql.connector.connect(
host=DB_HOST,
port=DB_PORT,
user=DB_USER,
password=DB_PASSWORD,
database=DB_NAME,
autocommit=autocommit,
)
+13 -7
View File
@@ -12,10 +12,13 @@ from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from pydantic import BaseModel
from api.database import get_connection
from api.database import get_connection, DB_BACKEND
log = logging.getLogger("calendar-api")
PH = "?" if DB_BACKEND == "sqlite" else "%s"
NOW_SQL = "datetime('now')" if DB_BACKEND == "sqlite" else "NOW()"
app = FastAPI(title="Calendar Sync API")
templates = Jinja2Templates(directory=Path(__file__).parent / "templates")
@@ -35,6 +38,8 @@ def to_local_timezone(dt: datetime) -> datetime:
"""Konvertiere naive UTC datetime zu Benutzer-Zeitzone."""
if dt is None:
return None
if isinstance(dt, str):
dt = datetime.fromisoformat(dt)
return dt.replace(tzinfo=timezone.utc).astimezone(TIMEZONE)
@@ -84,19 +89,19 @@ def fetch_events(limit: int = 10, search: str | None = None, calendar_label: str
try:
cur = conn.cursor()
try:
conditions = ["deleted = 0", "start_at >= NOW()"]
conditions = [f"deleted = 0", f"start_at >= {NOW_SQL}"]
params: list = []
if search:
conditions.append("summary LIKE %s")
conditions.append(f"summary LIKE {PH}")
params.append(f"%{search}%")
if calendar_label:
conditions.append("calendar_label = %s")
conditions.append(f"calendar_label = {PH}")
params.append(calendar_label)
params.append(limit)
where = " WHERE " + " AND ".join(conditions)
cur.execute(
f"SELECT {SELECT_COLUMNS} FROM calendar_events "
f"{where} ORDER BY start_at ASC LIMIT %s",
f"{where} ORDER BY start_at ASC LIMIT {PH}",
tuple(params),
)
return cur.fetchall()
@@ -141,7 +146,7 @@ def get_event(event_id: int):
try:
cur.execute(
f"SELECT {SELECT_COLUMNS} FROM calendar_events "
"WHERE id = %s AND deleted = 0",
f"WHERE id = {PH} AND deleted = 0",
(event_id,),
)
row = cur.fetchone()
@@ -186,6 +191,7 @@ def index(
})
return templates.TemplateResponse(
request,
"index.html",
{"request": request, "events": events, "search": search or ""},
{"events": events, "search": search or ""},
)