diff --git a/server/api_server/sessions_endpoint.py b/server/api_server/sessions_endpoint.py index 113a8250..147dbbe3 100755 --- a/server/api_server/sessions_endpoint.py +++ b/server/api_server/sessions_endpoint.py @@ -208,6 +208,7 @@ def get_device_sessions(mac, period): cur.execute(sql, (mac,)) rows = cur.fetchall() conn.close() + tz_name = get_setting_value("TIMEZONE") or "UTC" table_data = {"data": []} @@ -230,9 +231,9 @@ def get_device_sessions(mac, period): if row["ses_EventTypeConnection"] in ("", None) or row["ses_EventTypeDisconnection"] in ("", None): dur = "..." elif row["ses_StillConnected"]: - dur = format_date_diff(row["ses_DateTimeConnection"], None)["text"] + dur = format_date_diff(row["ses_DateTimeConnection"], None, tz_name)["text"] else: - dur = format_date_diff(row["ses_DateTimeConnection"], row["ses_DateTimeDisconnection"])["text"] + dur = format_date_diff(row["ses_DateTimeConnection"], row["ses_DateTimeDisconnection"], tz_name)["text"] # Additional Info info = row["ses_AdditionalInfo"] @@ -350,11 +351,11 @@ def get_session_events(event_type, period_date): if event_type in ("sessions", "missing"): # Duration if row[5] and row[6]: - delta = format_date_diff(row[5], row[6]) + delta = format_date_diff(row[5], row[6], tz_name) row[7] = delta["text"] row[8] = int(delta["total_minutes"] * 60) # seconds elif row[12] == 1: - delta = format_date_diff(row[5], None) + delta = format_date_diff(row[5], None, tz_name) row[7] = delta["text"] row[8] = int(delta["total_minutes"] * 60) # seconds else: diff --git a/server/utils/datetime_utils.py b/server/utils/datetime_utils.py index b8f7d1dc..a74234b4 100644 --- a/server/utils/datetime_utils.py +++ b/server/utils/datetime_utils.py @@ -4,19 +4,17 @@ import os import pathlib import sys from datetime import datetime +import datetime import pytz from pytz import timezone -import datetime from typing import Union +from zoneinfo import ZoneInfo +import email.utils # Register NetAlertX directories INSTALL_PATH="/app" sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"]) - -# Register NetAlertX directories -INSTALL_PATH="/app" - import conf from const import * @@ -115,17 +113,16 @@ def format_date(date_str: str) -> str: now = datetime.datetime.now(conf.tz) dt = dt.replace(tzinfo=now.astimezone().tzinfo) return dt.astimezone().isoformat() - except Exception: + except (ValueError, AttributeError, TypeError): return "invalid" -def format_date_diff(date1, date2): +def format_date_diff(date1, date2, tz_name): """ Return difference between two datetimes as 'Xd HH:MM'. Uses app timezone if datetime is naive. date2 can be None (uses now). """ - # Get timezone from settings - tz_name = get_setting_value("TIMEZONE") or "UTC" + # Get timezone from settings tz = pytz.timezone(tz_name) def parse_dt(dt): @@ -134,9 +131,9 @@ def format_date_diff(date1, date2): if isinstance(dt, str): try: dt_parsed = email.utils.parsedate_to_datetime(dt) - except Exception: - # fallback: parse ISO string - dt_parsed = datetime.datetime.fromisoformat(dt) + except (ValueError, TypeError): + # fallback: parse ISO string + dt_parsed = datetime.datetime.fromisoformat(dt) # convert naive GMT/UTC to app timezone if dt_parsed.tzinfo is None: dt_parsed = tz.localize(dt_parsed)