mirror of
https://github.com/skoelle/calender_sync.git
synced 2026-09-17 18:20:24 +00:00
demo showcase
This commit is contained in:
+30
-15
@@ -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
@@ -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 ""},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user