diff --git a/server/config.py b/server/config.py index d72fc84..4f2559a 100644 --- a/server/config.py +++ b/server/config.py @@ -17,6 +17,7 @@ class Settings(BaseSettings): NOTIFICATION_WEBHOOK_URL: str = "" NOTIFICATION_TELEGRAM_BOT_TOKEN: str = "" NOTIFICATION_TELEGRAM_CHAT_ID: str = "" + TIMEZONE: str = "Asia/Krasnoyarsk" class Config: env_file = ".env" diff --git a/server/main.py b/server/main.py index 74050ac..a6caa53 100644 --- a/server/main.py +++ b/server/main.py @@ -1,4 +1,4 @@ -from fastapi import FastAPI +from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager @@ -6,6 +6,8 @@ from contextlib import asynccontextmanager from database import create_tables, run_migrations, SessionLocal from auth import create_default_admin from routes import auth_router, api_router, web_router +from settings_store import get_setting +from timezone_utils import set_current_timezone @asynccontextmanager @@ -37,6 +39,22 @@ app.add_middleware( allow_headers=["*"], ) + +@app.middleware("http") +async def timezone_middleware(request: Request, call_next): + """Set current request timezone from DB settings for web rendering.""" + db = SessionLocal() + try: + tz = get_setting(db, "TIMEZONE") + if tz: + set_current_timezone(tz) + else: + set_current_timezone("UTC") + finally: + db.close() + return await call_next(request) + + app.include_router(auth_router) app.include_router(api_router) app.include_router(web_router) diff --git a/server/routes/web_routes.py b/server/routes/web_routes.py index a81c1f8..73eac56 100644 --- a/server/routes/web_routes.py +++ b/server/routes/web_routes.py @@ -11,9 +11,13 @@ from auth import verify_token, require_admin from models import Computer, Heartbeat, User, Notification, AuditLog, Setting from notifications import check_offline_computers, get_unread_count from settings_store import get_all_settings +from timezone_utils import localtime, localtime_iso, get_common_timezones, get_current_timezone router = APIRouter() templates = Jinja2Templates(directory="templates") +templates.env.filters["localtime"] = localtime +templates.env.filters["localtime_iso"] = localtime_iso +templates.env.globals["current_timezone"] = get_current_timezone def user_or_redirect(request: Request, db: Session): @@ -118,7 +122,7 @@ def computer_page(computer_id: int, request: Request, db: Session = Depends(get_ latest_sessions = [] for h in heartbeats: hb_data.append({ - "timestamp": h.timestamp.isoformat() if h.timestamp else None, + "timestamp": localtime_iso(h.timestamp), "username": h.username, "local_ip": h.local_ip, "cpu_percent": h.cpu_percent, @@ -223,6 +227,7 @@ def admin_settings_page(request: Request, db: Session = Depends(get_db)): "request": request, "user": current_user, "settings": settings, + "timezones": get_common_timezones(), "unread_count": get_unread_count(db), }, ) diff --git a/server/schemas.py b/server/schemas.py index 43355ac..0b53fe2 100644 --- a/server/schemas.py +++ b/server/schemas.py @@ -137,3 +137,4 @@ class SettingsUpdate(BaseModel): NOTIFICATION_WEBHOOK_URL: Optional[str] = None NOTIFICATION_TELEGRAM_BOT_TOKEN: Optional[str] = None NOTIFICATION_TELEGRAM_CHAT_ID: Optional[str] = None + TIMEZONE: Optional[str] = None diff --git a/server/settings_store.py b/server/settings_store.py index 2ed9112..2d7a977 100644 --- a/server/settings_store.py +++ b/server/settings_store.py @@ -39,6 +39,7 @@ def get_all_settings(db: Session) -> dict: "NOTIFICATION_WEBHOOK_URL", "NOTIFICATION_TELEGRAM_BOT_TOKEN", "NOTIFICATION_TELEGRAM_CHAT_ID", + "TIMEZONE", ] for key in keys: db_val = db.query(Setting).filter(Setting.key == key).first() diff --git a/server/templates/admin_audit.html b/server/templates/admin_audit.html index f25895c..5c76a8a 100644 --- a/server/templates/admin_audit.html +++ b/server/templates/admin_audit.html @@ -22,7 +22,7 @@
{% for a in audit %}{{ n.message }}
-{{ n.sent_at.strftime('%Y-%m-%d %H:%M') if n.sent_at else '-' }}
+{{ n.sent_at | localtime }}