From e0b18fd3c3ce65e3d4f7469d3f2fe562fd67c655 Mon Sep 17 00:00:00 2001 From: Stefano Date: Sun, 8 Feb 2026 18:08:19 +0100 Subject: [PATCH] fixing mail --- app/routes/parking.py | 5 ++++- main.py | 22 +++++++++++++++++++++- utils/auth_middleware.py | 1 - 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/routes/parking.py b/app/routes/parking.py index 792feac..4aca29f 100644 --- a/app/routes/parking.py +++ b/app/routes/parking.py @@ -443,8 +443,10 @@ def get_eligible_users(assignment_id: str, db: Session = Depends(get_db), curren return result +from typing import Optional + class TestEmailRequest(BaseModel): - date: date = None + date: Optional[date] = None office_id: str @@ -455,6 +457,7 @@ def send_test_email_tool(data: TestEmailRequest, db: Session = Depends(get_db), from database.models import OfficeClosingDay, OfficeWeeklyClosingDay from datetime import timedelta + # Verify office access if current_user.role == UserRole.MANAGER and current_user.office_id != data.office_id: raise HTTPException(status_code=403, detail="Not authorized for this office") diff --git a/main.py b/main.py index 595e4f6..5f9d12c 100644 --- a/main.py +++ b/main.py @@ -21,12 +21,29 @@ from app.routes.users import router as users_router from app.routes.offices import router as offices_router from app.routes.presence import router as presence_router from app.routes.parking import router as parking_router -from database.connection import init_db +from app.routes.parking import router as parking_router +from database.connection import init_db, get_db_session +from services.notifications import run_scheduled_notifications +import asyncio # Rate limiter setup limiter = Limiter(key_func=get_remote_address) +async def scheduler_task(): + """Background task to run scheduled notifications every minute""" + config.logger.info("Scheduler task started") + while True: + try: + with get_db_session() as db: + run_scheduled_notifications(db) + except Exception as e: + config.logger.error(f"Scheduler error: {e}") + + # Check every 60 seconds + await asyncio.sleep(60) + + @asynccontextmanager async def lifespan(app: FastAPI): """Initialize database on startup""" @@ -72,6 +89,9 @@ async def lifespan(app: FastAPI): log(f"feedback: App reachable via Caddy at {reachable_url}") + # Start scheduler + asyncio.create_task(scheduler_task()) + yield log("Shutting down Parking Manager application") diff --git a/utils/auth_middleware.py b/utils/auth_middleware.py index 945b4da..fa65da3 100644 --- a/utils/auth_middleware.py +++ b/utils/auth_middleware.py @@ -25,7 +25,6 @@ def is_admin_from_groups(groups: list[str]) -> bool: if not is_admin: is_admin = admin_group.lower() in [g.lower() for g in groups] - print(f"[Authelia] Admin Check: User Groups={groups}, Configured Admin Group='{admin_group}' -> Is Admin? {is_admin}") return is_admin