feat: manual odometer baseline — Settings field computes baseline + trip distance, Dashboard shows (manual) label
This commit is contained in:
+13
-2
@@ -26,8 +26,11 @@ def _setting_bool(key, env_name=None, default=False):
|
||||
return app_sql.get_setting(key, fallback) == "1"
|
||||
|
||||
|
||||
def _number_value(setting_key, converter):
|
||||
default = app_alerts.SETTING_DEFAULTS[setting_key]
|
||||
def _number_value(setting_key, converter, fallback=None):
|
||||
if fallback is not None:
|
||||
default = fallback
|
||||
else:
|
||||
default = app_alerts.SETTING_DEFAULTS[setting_key]
|
||||
try:
|
||||
return converter(app_sql.get_setting(setting_key, default))
|
||||
except (TypeError, ValueError):
|
||||
@@ -53,6 +56,7 @@ def get_settings():
|
||||
"ntfy_token_configured": bool(
|
||||
app_sql.get_setting("alert_ntfy_token", "")
|
||||
),
|
||||
"odometer_baseline": _number_value("odometer_baseline", float, 0),
|
||||
"alert_thresholds": {
|
||||
field: _number_value(setting_key, converter)
|
||||
for field, (
|
||||
@@ -132,6 +136,10 @@ def update_settings(body):
|
||||
if values["cellular_enabled"] and not apn:
|
||||
errors["cellular_apn"] = "An APN is required when cellular is enabled."
|
||||
|
||||
values["odometer_baseline"] = _bounded_number(
|
||||
body, "odometer_baseline", float, 0, 999_999, errors
|
||||
)
|
||||
|
||||
ntfy_url = body.get("ntfy_url")
|
||||
ntfy_token = body.get("ntfy_token")
|
||||
if not isinstance(ntfy_url, str):
|
||||
@@ -199,6 +207,9 @@ def update_settings(body):
|
||||
for setting_key, _converter, _minimum, _maximum in _NUMBER_FIELDS.values():
|
||||
settings[setting_key] = str(values[setting_key])
|
||||
|
||||
if values["odometer_baseline"] is not None:
|
||||
settings["odometer_baseline"] = str(values["odometer_baseline"])
|
||||
|
||||
if values["clear_ntfy_url"]:
|
||||
settings["alert_ntfy_url"] = ""
|
||||
elif ntfy_url:
|
||||
|
||||
+6
-1
@@ -457,6 +457,10 @@ def get_overview_stats():
|
||||
video_count = sum(1 for _ in _av.list_local_videos().get("files", []))
|
||||
except Exception:
|
||||
video_count = 0
|
||||
from modules import app_settings
|
||||
base = app_settings._number_value("odometer_baseline", float, 0)
|
||||
cumul = conn.execute("SELECT COALESCE(SUM(DISTANCE_KM), 0) FROM trips").fetchone()
|
||||
computed = base + (cumul[0] if cumul else 0)
|
||||
return {
|
||||
"trip_count": row[0],
|
||||
"total_km": row[1],
|
||||
@@ -464,7 +468,8 @@ def get_overview_stats():
|
||||
"all_time_max_speed": row[3],
|
||||
"active_dtc": dtc_row[0] if dtc_row else 0,
|
||||
"video_count": video_count,
|
||||
"odometer_km": odo_row[0] if odo_row and odo_row[0] else None,
|
||||
"odometer_km": computed if base > 0 else (odo_row[0] if odo_row and odo_row[0] else None),
|
||||
"odometer_source": "manual" if base > 0 else "obd",
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user