From 260f4323322fb0e94c5ef848b9b0554f73f29c82 Mon Sep 17 00:00:00 2001 From: lekt8 Date: Thu, 2 Jul 2026 17:04:22 +0800 Subject: [PATCH] fix(session): use utcnow_naive across session routes (#1116) (#5003) Replace remaining datetime.utcnow() call sites in session CRUD, incognito purge cutoff, and webhook payloads with core.database.utcnow_naive. --- routes/session_routes.py | 20 ++++++++++---------- tests/test_session_routes_utcnow.py | 11 +++++++++++ 2 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 tests/test_session_routes_utcnow.py diff --git a/routes/session_routes.py b/routes/session_routes.py index 19b897f29..40f8d80cb 100644 --- a/routes/session_routes.py +++ b/routes/session_routes.py @@ -162,7 +162,7 @@ def _persist_session_headers(session_id: str, headers: dict | None) -> None: db_session = db.query(DbSession).filter(DbSession.id == session_id).first() if db_session: db_session.headers = headers or {} - db_session.updated_at = datetime.utcnow() + db_session.updated_at = utcnow_naive() db.commit() except Exception: db.rollback() @@ -223,8 +223,8 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ # purge exists only to catch ghosts the frontend missed (tab close, # crash). Only clean up rows old enough to be definitely orphaned. try: - from datetime import datetime as _dt, timedelta as _td - _cutoff = _dt.utcnow() - _td(minutes=10) + from datetime import timedelta as _td + _cutoff = utcnow_naive() - _td(minutes=10) _purge_db = SessionLocal() try: from core.database import ChatMessage as _DbMsg @@ -470,7 +470,7 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ db_session = db.query(DbSession).filter(DbSession.id == sid).first() if db_session: db_session.folder = folder if folder else None - db_session.updated_at = datetime.utcnow() + db_session.updated_at = utcnow_naive() db.commit() result["folder"] = folder if folder else None finally: @@ -517,7 +517,7 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ db_session.model = model db_session.endpoint_url = endpoint_url db_session.headers = session.headers or {} - db_session.updated_at = datetime.utcnow() + db_session.updated_at = utcnow_naive() db.commit() finally: db.close() @@ -646,7 +646,7 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ db_session = db.query(DbSession).filter(DbSession.id == sid).first() if db_session: db_session.archived = True - db_session.updated_at = datetime.utcnow() + db_session.updated_at = utcnow_naive() db.commit() # Update in memory if it exists @@ -680,7 +680,7 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ if not db_session: raise HTTPException(404, f"Session {sid} not found") db_session.archived = False - db_session.updated_at = datetime.utcnow() + db_session.updated_at = utcnow_naive() db.commit() # Reload into session manager so it appears in the active list try: @@ -890,7 +890,7 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ db_session = db.query(DbSession).filter(DbSession.id == session_id).first() if db_session: db_session.is_important = important - db_session.updated_at = datetime.utcnow() + db_session.updated_at = utcnow_naive() db.commit() # Update in memory if it exists @@ -979,7 +979,7 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ metadata={ "compacted": True, "summarized_count": len(older), - "timestamp": datetime.utcnow().isoformat(), + "timestamp": utcnow_naive().isoformat(), }, ) new_history = [summary_msg] + recent @@ -1256,7 +1256,7 @@ def setup_session_routes(session_manager: SessionManager, config: dict, webhook_ db_session = db_session_q.first() if db_session: db_session.folder = folder_name - db_session.updated_at = datetime.utcnow() + db_session.updated_at = utcnow_naive() updated += 1 db.commit() except Exception as e: diff --git a/tests/test_session_routes_utcnow.py b/tests/test_session_routes_utcnow.py new file mode 100644 index 000000000..33b0f18a4 --- /dev/null +++ b/tests/test_session_routes_utcnow.py @@ -0,0 +1,11 @@ +"""Regression: session routes must not call datetime.utcnow() (#1116).""" + +import inspect + +import routes.session_routes as sr + + +def test_session_routes_module_does_not_reference_utcnow(): + source = inspect.getsource(sr) + assert "datetime.utcnow()" not in source + assert "_dt.utcnow()" not in source \ No newline at end of file