workout-tracker / tracker /workout_day_text.py
ronheichman's picture
Deploy workout tracker
234891d verified
Raw
History Blame Contribute Delete
1.95 kB
"""Single source of truth for 'what is this workout day' copy (calendar + API)."""
from __future__ import annotations
from sqlmodel import Session
from tracker.models import Exercise, ProgramExercise
def build_program_day_summary_lines(
day_exercises: list[ProgramExercise],
session: Session,
) -> list[str]:
"""Bullet lines in program order (same grouping rules as the workout UI)."""
lines: list[str] = []
idx = 0
while idx < len(day_exercises):
pe = day_exercises[idx]
exercise = session.get(Exercise, pe.exercise_id)
if exercise is None:
idx += 1
continue
one = f"{exercise.name}: {pe.target_sets}x{pe.target_rep_min}-{pe.target_rep_max}"
if pe.superset_group is None:
lines.append(f"- {one}")
idx += 1
continue
group_id = pe.superset_group
chunk: list[str] = [one]
idx += 1
while idx < len(day_exercises) and day_exercises[idx].superset_group == group_id:
pe2 = day_exercises[idx]
ex2 = session.get(Exercise, pe2.exercise_id)
if ex2 is None:
idx += 1
continue
chunk.append(f"{ex2.name}: {pe2.target_sets}x{pe2.target_rep_min}-{pe2.target_rep_max}")
idx += 1
if len(chunk) > 1:
lines.append("- SUPERSET: " + " / ".join(chunk))
else:
lines.append(f"- {chunk[0]}")
return lines
def build_program_day_summary_text(
day_exercises: list[ProgramExercise],
session: Session,
*,
tracker_base_url: str | None,
) -> str:
"""Plain text block. Optional tracker URL line matches calendar scheduling."""
body = "\n".join(build_program_day_summary_lines(day_exercises, session))
if tracker_base_url is None or tracker_base_url == "":
return body
base = tracker_base_url.rstrip("/")
return f"{body}\n\nTracker: {base}/"