BE: chore datetime_utils
Some checks failed
docker / docker_dev (push) Has been cancelled

Signed-off-by: jokob-sk <jokob.sk@gmail.com>
This commit is contained in:
jokob-sk
2025-11-05 16:42:42 +11:00
parent 286d5555d2
commit 1fd8d97d56
2 changed files with 14 additions and 16 deletions

View File

@@ -208,6 +208,7 @@ def get_device_sessions(mac, period):
cur.execute(sql, (mac,)) cur.execute(sql, (mac,))
rows = cur.fetchall() rows = cur.fetchall()
conn.close() conn.close()
tz_name = get_setting_value("TIMEZONE") or "UTC"
table_data = {"data": []} table_data = {"data": []}
@@ -230,9 +231,9 @@ def get_device_sessions(mac, period):
if row["ses_EventTypeConnection"] in ("<missing event>", None) or row["ses_EventTypeDisconnection"] in ("<missing event>", None): if row["ses_EventTypeConnection"] in ("<missing event>", None) or row["ses_EventTypeDisconnection"] in ("<missing event>", None):
dur = "..." dur = "..."
elif row["ses_StillConnected"]: 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: 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 # Additional Info
info = row["ses_AdditionalInfo"] info = row["ses_AdditionalInfo"]
@@ -350,11 +351,11 @@ def get_session_events(event_type, period_date):
if event_type in ("sessions", "missing"): if event_type in ("sessions", "missing"):
# Duration # Duration
if row[5] and row[6]: 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[7] = delta["text"]
row[8] = int(delta["total_minutes"] * 60) # seconds row[8] = int(delta["total_minutes"] * 60) # seconds
elif row[12] == 1: 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[7] = delta["text"]
row[8] = int(delta["total_minutes"] * 60) # seconds row[8] = int(delta["total_minutes"] * 60) # seconds
else: else:

View File

@@ -4,19 +4,17 @@ import os
import pathlib import pathlib
import sys import sys
from datetime import datetime from datetime import datetime
import datetime
import pytz import pytz
from pytz import timezone from pytz import timezone
import datetime
from typing import Union from typing import Union
from zoneinfo import ZoneInfo
import email.utils
# Register NetAlertX directories # Register NetAlertX directories
INSTALL_PATH="/app" INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"]) sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"])
# Register NetAlertX directories
INSTALL_PATH="/app"
import conf import conf
from const import * from const import *
@@ -115,17 +113,16 @@ def format_date(date_str: str) -> str:
now = datetime.datetime.now(conf.tz) now = datetime.datetime.now(conf.tz)
dt = dt.replace(tzinfo=now.astimezone().tzinfo) dt = dt.replace(tzinfo=now.astimezone().tzinfo)
return dt.astimezone().isoformat() return dt.astimezone().isoformat()
except Exception: except (ValueError, AttributeError, TypeError):
return "invalid" 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'. Return difference between two datetimes as 'Xd HH:MM'.
Uses app timezone if datetime is naive. Uses app timezone if datetime is naive.
date2 can be None (uses now). date2 can be None (uses now).
""" """
# Get timezone from settings # Get timezone from settings
tz_name = get_setting_value("TIMEZONE") or "UTC"
tz = pytz.timezone(tz_name) tz = pytz.timezone(tz_name)
def parse_dt(dt): def parse_dt(dt):
@@ -134,9 +131,9 @@ def format_date_diff(date1, date2):
if isinstance(dt, str): if isinstance(dt, str):
try: try:
dt_parsed = email.utils.parsedate_to_datetime(dt) dt_parsed = email.utils.parsedate_to_datetime(dt)
except Exception: except (ValueError, TypeError):
# fallback: parse ISO string # fallback: parse ISO string
dt_parsed = datetime.datetime.fromisoformat(dt) dt_parsed = datetime.datetime.fromisoformat(dt)
# convert naive GMT/UTC to app timezone # convert naive GMT/UTC to app timezone
if dt_parsed.tzinfo is None: if dt_parsed.tzinfo is None:
dt_parsed = tz.localize(dt_parsed) dt_parsed = tz.localize(dt_parsed)