110 lines
4.9 KiB
Python
110 lines
4.9 KiB
Python
"""
|
|
Seed the database with initial data (exercises, phases, measurement types).
|
|
Run with: python scripts/seed.py
|
|
"""
|
|
import asyncio
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from sqlalchemy import select
|
|
from app.models import async_session
|
|
from app.models.exercise import Exercise
|
|
from app.models.workout import Phase
|
|
from app.models.measurement import MeasurementType
|
|
|
|
|
|
EXERCISES = [
|
|
("Bench Press", "chest", "barbell, bench"),
|
|
("Incline Dumbbell Press", "chest", "dumbbell, bench"),
|
|
("Overhead Press", "shoulders", "barbell"),
|
|
("Landmine Press", "shoulders", "landmine"),
|
|
("Band Press", "chest", "bands"),
|
|
("Lateral Raise", "shoulders", "dumbbell"),
|
|
("Tricep Pushdown", "triceps", "cable, bands"),
|
|
("Dip", "chest", "dip station"),
|
|
("Barbell Row", "back", "barbell"),
|
|
("Dumbbell Row", "back", "dumbbell, bench"),
|
|
("Lat Pulldown", "back", "cable, bands"),
|
|
("Pull-up", "back", "pull-up bar"),
|
|
("Face Pull", "shoulders", "cable, bands"),
|
|
("YTW", "shoulders", "dumbbell, bands"),
|
|
("Bicep Curl", "biceps", "dumbbell"),
|
|
("Barbell Squat", "quadriceps", "barbell, squat rack"),
|
|
("Goblet Squat", "quadriceps", "dumbbell, kettlebell"),
|
|
("Bulgarian Split Squat", "quadriceps", "dumbbell, bench"),
|
|
("Hip Thrust", "glutes", "barbell, bench"),
|
|
("Step-up", "quadriceps", "dumbbell, bench"),
|
|
("Romanian Deadlift", "hamstrings", "barbell"),
|
|
("Leg Curl", "hamstrings", "cable, bands"),
|
|
("Calf Raise", "calves", "barbell, dumbbell"),
|
|
("Deadlift", "back", "barbell"),
|
|
("Dead Bug", "core", "bodyweight"),
|
|
("Pallof Press", "core", "cable, bands"),
|
|
("Plank", "core", "bodyweight"),
|
|
("Ab Wheel Rollout", "core", "ab wheel"),
|
|
("Russian Twist", "core", "bodyweight, dumbbell"),
|
|
("Hanging Knee Raise", "core", "pull-up bar"),
|
|
("BikeErg", "cardio", "bikeerg"),
|
|
("RowErg", "cardio", "rowerg"),
|
|
("Jump Rope", "cardio", "jump rope"),
|
|
("Walking", "cardio", "bodyweight"),
|
|
("Farmer's Carry", "grip", "dumbbell, kettlebell"),
|
|
("Bird Dog", "core", "bodyweight"),
|
|
("Glute Bridge", "glutes", "bodyweight"),
|
|
("Clamshell", "glutes", "bodyweight, bands"),
|
|
("90/90 Stretch", "hips", "bodyweight"),
|
|
("Supine Piriformis Stretch", "hips", "bodyweight"),
|
|
]
|
|
|
|
PHASES = [
|
|
("Tendon Adaptation", "Phase 1: Return to training after layoff. RPE 6-7, limited ROM, mid-range movements only.", "2026-06-25", None, "Weeks 1-4"),
|
|
("Progressive Loading", "Phase 2: Increase load gradually. RPE 7-8, full ROM where tolerated.", None, None, "Weeks 4-8"),
|
|
("Strength Building", "Phase 3: Normal training. RPE 8-9, full ROM.", None, None, "Weeks 8+"),
|
|
]
|
|
|
|
MEASUREMENT_TYPES = [
|
|
("Weight", "Body weight measurement", "lb", "Weigh yourself first thing in the morning, after using the bathroom, before eating or drinking."),
|
|
("Waist", "Waist circumference", "in", "Measure at the narrowest point of your waist, typically just above the belly button."),
|
|
("Neck", "Neck circumference", "in", "Measure at the narrowest point, just below the Adam's apple."),
|
|
("Chest", "Chest circumference", "in", "Measure at the fullest part of the chest, arms relaxed at sides."),
|
|
("Arm", "Upper arm circumference", "in", "Measure at the midpoint between shoulder and elbow, arm relaxed."),
|
|
("Thigh", "Thigh circumference", "in", "Measure at the midpoint between hip and knee."),
|
|
("Hip", "Hip circumference", "in", "Measure at the widest part of the hips/glutes."),
|
|
("Body Fat", "Estimated body fat percentage", "%", "Use calipers or smart scale. Consistent method is more important than absolute accuracy."),
|
|
]
|
|
|
|
|
|
async def seed():
|
|
async with async_session() as session:
|
|
result = await session.execute(select(Exercise).limit(1))
|
|
if result.scalar_one_or_none():
|
|
print("Exercises already seeded, skipping.")
|
|
else:
|
|
for name, body_part, equipment in EXERCISES:
|
|
session.add(Exercise(name=name, body_part=body_part, equipment=equipment))
|
|
print(f"Seeded {len(EXERCISES)} exercises.")
|
|
|
|
result = await session.execute(select(Phase).limit(1))
|
|
if result.scalar_one_or_none():
|
|
print("Phases already seeded, skipping.")
|
|
else:
|
|
for name, desc, start, end, notes in PHASES:
|
|
session.add(Phase(name=name, description=desc, start_date=start, end_date=end, notes=notes))
|
|
print(f"Seeded {len(PHASES)} phases.")
|
|
|
|
result = await session.execute(select(MeasurementType).limit(1))
|
|
if result.scalar_one_or_none():
|
|
print("Measurement types already seeded, skipping.")
|
|
else:
|
|
for name, desc, unit, instructions in MEASUREMENT_TYPES:
|
|
session.add(MeasurementType(name=name, description=desc, unit=unit, instructions=instructions))
|
|
print(f"Seeded {len(MEASUREMENT_TYPES)} measurement types.")
|
|
|
|
await session.commit()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(seed())
|