Paginate activity history and aggregate dashboard totals in SQL

This commit is contained in:
Peter Stockings
2026-10-02 14:36:35 +10:00
parent a300ea007d
commit 5830976e31
11 changed files with 386 additions and 65 deletions
+7 -3
View File
@@ -85,14 +85,17 @@ def persist_efforts(activity):
activity.has_route = any(sample.get("point") for sample in activity.samples)
def record_book(activities):
def record_book(activities, run_ids=None, presorted=False):
"""Compare persisted efforts in chronology; never read samples here.
First efforts establish a record. Strict improvements earn historical PR
badges, which remain on the run after a later activity beats that record.
"""
records, runs = {}, {}
for activity in sorted(activities, key=lambda row: (row.started_at, row.id)):
history = (
activities if presorted else sorted(activities, key=lambda row: (row.started_at, row.id))
)
for activity in history:
efforts = (
[dict(effort) for effort in activity.best_efforts]
if activity.efforts_version == EFFORTS_VERSION and activity.sport == "running"
@@ -103,7 +106,8 @@ def record_book(activities):
effort["pr"] = previous is None or effort["seconds"] < previous["seconds"] - 1e-6
if effort["pr"]:
records[effort["label"]] = dict(effort, activity=activity)
runs[activity.id] = efforts
if run_ids is None or activity.id in run_ids:
runs[activity.id] = efforts
return {"records": [records[label] for label, _ in DISTANCES if label in records], "runs": runs}