Files
WerkoutAPI/generator/urls.py
Trey t 1c61b80731 workout generator audit: rules engine, structure rules, split patterns, injury UX, metadata cleanup
- Add rules_engine.py with quantitative rules for all 8 workout types
- Add quality gate retry loop in generate_single_workout()
- Expand calibrate_structure_rules to all 120 combinations (8 types × 5 goals × 3 sections)
- Wire WeeklySplitPattern DB records into _pick_weekly_split()
- Enforce movement patterns from WorkoutStructureRule in exercise selection
- Add straight-set strength support (single main lift, 4-6 rounds)
- Add modality consistency check for duration-dominant workout types
- Add InjuryStep component to onboarding and preferences
- Add sibling exercise exclusion in regenerate and preview_day endpoints
- Display generator warnings on dashboard
- Expand fix_rep_durations, fix_exercise_flags, fix_movement_pattern_typo
- Add audit_exercise_data and check_rules_drift management commands
- Add Next.js frontend with dashboard, onboarding, preferences, history pages
- Add generator app with ML-powered workout generation pipeline
- 96 new tests across 7 test modules

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 20:07:40 -06:00

46 lines
2.2 KiB
Python

from django.urls import path
from . import views
urlpatterns = [
# Preferences
path('preferences/', views.get_preferences, name='get_preferences'),
path('preferences/update/', views.update_preferences, name='update_preferences'),
# Plan generation & listing
path('generate/', views.generate_plan, name='generate_plan'),
path('plans/', views.list_plans, name='list_plans'),
path('plans/<int:plan_id>/', views.plan_detail, name='plan_detail'),
# Workout actions
path('workout/<int:workout_id>/accept/', views.accept_workout, name='accept_workout'),
path('workout/<int:workout_id>/reject/', views.reject_workout, name='reject_workout'),
path('workout/<int:workout_id>/rate/', views.rate_workout, name='rate_workout'),
path('workout/<int:workout_id>/regenerate/', views.regenerate_workout, name='regenerate_workout'),
# Edit actions (delete day / superset / exercise, swap exercise)
path('workout/<int:workout_id>/delete/', views.delete_workout_day, name='delete_workout_day'),
path('superset/<int:superset_id>/delete/', views.delete_superset, name='delete_superset'),
path('superset-exercise/<int:exercise_id>/delete/', views.delete_superset_exercise, name='delete_superset_exercise'),
path('superset-exercise/<int:exercise_id>/swap/', views.swap_exercise, name='swap_exercise'),
path('exercise/<int:exercise_id>/similar/', views.similar_exercises, name='similar_exercises'),
# Reference data (for preference UI)
path('muscles/', views.list_muscles, name='list_muscles'),
path('equipment/', views.list_equipment, name='list_equipment'),
path('workout-types/', views.list_workout_types, name='list_workout_types'),
# Confirm (batch-accept) a plan
path('plans/<int:plan_id>/confirm/', views.confirm_plan, name='confirm_plan'),
# Preview-based generation
path('preview/', views.preview_plan, name='preview_plan'),
path('preview-day/', views.preview_day, name='preview_day'),
path('save-plan/', views.save_plan, name='save_plan'),
# Analysis
path('analysis/stats/', views.analysis_stats, name='analysis_stats'),
# Generation rules
path('rules/', views.generation_rules, name='generation_rules'),
]