Spaces:
Sleeping
Sleeping
| """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}/" | |