Add sub_sport editing to activity edit drawer
This commit is contained in:
@@ -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"):
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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')")
|
||||
|
||||
Reference in New Issue
Block a user