feat: manual odometer baseline — Settings field computes baseline + trip distance, Dashboard shows (manual) label

This commit is contained in:
Mathieu Moran
2026-08-11 18:51:11 -04:00
parent 887a001723
commit 34253b3ffb
7 changed files with 58 additions and 30 deletions
+13 -2
View File
@@ -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: