Add sub_sport editing to activity edit drawer

This commit is contained in:
Davide Scaini
2026-05-12 23:01:12 +02:00
parent 93f6109028
commit 867da767eb
5 changed files with 48 additions and 3 deletions
+5
View File
@@ -13,7 +13,10 @@ from typing import Any, Optional
# ── Shared constants (imported by edit/server.py and serve/server.py) ─────────
from bincio.extract.sport import SUB_SPORTS as _SUB_SPORTS
SPORTS = ["cycling", "running", "hiking", "walking", "swimming", "skiing", "other"]
_VALID_SUB_SPORTS = {v for vs in _SUB_SPORTS.values() for v in vs}
STAT_PANELS = ["elevation", "speed", "heart_rate", "cadence", "power"]
VALID_ACTIVITY_ID = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9\-]{0,250}$')
@@ -36,6 +39,8 @@ def apply_sidecar_edit(activity_id: str, payload: dict[str, Any], data_dir: Path
lines.append(f"title: {json.dumps(payload['title'])}")
if payload.get("sport") and payload["sport"] in SPORTS and payload["sport"] != "other":
lines.append(f"sport: {payload['sport']}")
if payload.get("sub_sport") and payload["sub_sport"] in _VALID_SUB_SPORTS:
lines.append(f"sub_sport: {payload['sub_sport']}")
if payload.get("gear"):
lines.append(f"gear: {json.dumps(payload['gear'])}")
if payload.get("highlight"):
+8
View File
@@ -99,6 +99,14 @@ _SUB_SPORT_MAPPING: dict[str, str] = {
BAS_SPORTS = {"cycling", "running", "hiking", "walking", "swimming", "skiing", "other"}
# Valid sub_sport values per sport, in display order.
SUB_SPORTS: dict[str, list[str]] = {
"cycling": ["road", "mountain", "gravel", "indoor"],
"running": ["trail", "track", "indoor"],
"swimming": ["open_water", "pool"],
"skiing": ["nordic", "alpine"],
}
def _normalise_key(raw: object) -> str:
key = str(raw).strip()
+4
View File
@@ -54,6 +54,8 @@ def apply_sidecar(detail: dict, fm: dict, body: str) -> dict:
d["title"] = str(fm["title"])
if "sport" in fm:
d["sport"] = str(fm["sport"])
if "sub_sport" in fm:
d["sub_sport"] = str(fm["sub_sport"]) if fm["sub_sport"] else None
if "gear" in fm:
d["gear"] = str(fm["gear"]) if fm["gear"] else d.get("gear")
if body:
@@ -80,6 +82,8 @@ def _apply_sidecar_summary(summary: dict, fm: dict) -> dict:
s["title"] = str(fm["title"])
if "sport" in fm:
s["sport"] = str(fm["sport"])
if "sub_sport" in fm:
s["sub_sport"] = str(fm["sub_sport"]) if fm["sub_sport"] else None
if "highlight" in fm:
s["custom"]["highlight"] = bool(fm["highlight"])
if "private" in fm:
+1
View File
@@ -100,6 +100,7 @@ class ActivityEditRequest(BaseModel):
title: str | None = Field(default=None, description="Activity title")
description: str | None = Field(default=None, description="Activity description (markdown)")
sport: str | None = Field(default=None, description="Sport type")
sub_sport: str | None = Field(default=None, description="Sport sub-category (e.g. road, trail, pool)")
private: bool | None = Field(default=None, description="Hide from public feed")
highlight: bool | None = Field(default=None, description="Mark as favorite")
gear: str | None = Field(default=None, description="Gear used (e.g., 'Trek Domane')")