Add boto3 dependency and update exercise/machine assets
- Added boto3 as a dependency in pyproject.toml and uv.lock. - Introduced multiple new exercise images in various formats (jpg, webp, avif, png). - Added new machine images to enhance the workout assets library.
This commit is contained in:
@@ -6,6 +6,63 @@ from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
|
||||
ActivityKind = Literal["exercise", "machine"]
|
||||
ActivityCategory = Literal[
|
||||
"chest",
|
||||
"back",
|
||||
"legs",
|
||||
"shoulders",
|
||||
"biceps",
|
||||
"triceps",
|
||||
"core",
|
||||
"cardio",
|
||||
"full_body",
|
||||
"other",
|
||||
]
|
||||
ActivityEquipment = Literal[
|
||||
"barbell",
|
||||
"dumbbell",
|
||||
"machine",
|
||||
"cable",
|
||||
"bodyweight",
|
||||
"kettlebell",
|
||||
"cardio_machine",
|
||||
"other",
|
||||
]
|
||||
MeasurementType = Literal[
|
||||
"weight_reps",
|
||||
"reps_only",
|
||||
"duration",
|
||||
"distance_duration",
|
||||
"duration_calories",
|
||||
]
|
||||
Difficulty = Literal["beginner", "intermediate", "advanced"]
|
||||
|
||||
|
||||
class ActivitySourceCreate(BaseModel):
|
||||
slug: str | None = Field(default=None, min_length=1, max_length=180)
|
||||
kind: ActivityKind
|
||||
title: str = Field(min_length=1, max_length=160)
|
||||
description: str | None = None
|
||||
category: ActivityCategory = "other"
|
||||
equipment: ActivityEquipment = "other"
|
||||
measurement_type: MeasurementType = "weight_reps"
|
||||
difficulty: Difficulty = "intermediate"
|
||||
image_s3_url: str | None = None
|
||||
image_s3_key: str | None = None
|
||||
default_calories_per_minute: float | None = None
|
||||
|
||||
|
||||
class ActivitySourceRead(ActivitySourceCreate):
|
||||
id: uuid.UUID
|
||||
slug: str
|
||||
owner_user_id: uuid.UUID | None
|
||||
is_builtin: bool
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class EquipmentCreate(BaseModel):
|
||||
name: str = Field(min_length=1, max_length=160)
|
||||
@@ -61,6 +118,7 @@ class WorkoutSetCreate(BaseModel):
|
||||
weight: float = Field(default=0, ge=0)
|
||||
reps: int = Field(default=0, ge=0)
|
||||
duration_seconds: int | None = None
|
||||
distance_km: float | None = Field(default=None, ge=0)
|
||||
calories: float | None = None
|
||||
completed_at: datetime | None = None
|
||||
|
||||
@@ -73,6 +131,7 @@ class WorkoutSetUpdate(BaseModel):
|
||||
weight: float | None = Field(default=None, ge=0)
|
||||
reps: int | None = Field(default=None, ge=0)
|
||||
duration_seconds: int | None = None
|
||||
distance_km: float | None = Field(default=None, ge=0)
|
||||
calories: float | None = None
|
||||
completed_at: datetime | None = None
|
||||
|
||||
@@ -93,6 +152,7 @@ class WorkoutSetRead(WorkoutSetCreate):
|
||||
|
||||
|
||||
class WorkoutItemCreate(BaseModel):
|
||||
activity_source_id: uuid.UUID | None = None
|
||||
exercise_id: uuid.UUID | None = None
|
||||
equipment_id: uuid.UUID | None = None
|
||||
order_index: int | None = None
|
||||
@@ -100,17 +160,21 @@ class WorkoutItemCreate(BaseModel):
|
||||
|
||||
@model_validator(mode="after")
|
||||
def exactly_one_entity(self) -> WorkoutItemCreate:
|
||||
if bool(self.exercise_id) == bool(self.equipment_id):
|
||||
raise ValueError("Provide exactly one of exercise_id or equipment_id")
|
||||
provided = [self.activity_source_id, self.exercise_id, self.equipment_id]
|
||||
if sum(value is not None for value in provided) != 1:
|
||||
raise ValueError("Provide exactly one activity source, exercise, or equipment id")
|
||||
return self
|
||||
|
||||
|
||||
class WorkoutItemRead(WorkoutItemCreate):
|
||||
id: uuid.UUID
|
||||
workout_id: uuid.UUID
|
||||
source_kind: Literal["exercise", "equipment"]
|
||||
source_kind: Literal["exercise", "machine", "equipment"]
|
||||
title_snapshot: str
|
||||
image_s3_url_snapshot: str | None
|
||||
measurement_type_snapshot: MeasurementType
|
||||
category_snapshot: ActivityCategory
|
||||
equipment_snapshot: ActivityEquipment
|
||||
order_index: int
|
||||
created_at: datetime
|
||||
sets: list[WorkoutSetRead] = []
|
||||
|
||||
Reference in New Issue
Block a user