added advanced workout

This commit is contained in:
2026-07-01 11:20:13 +03:00
parent 32c211676f
commit 1c61bb4102
38 changed files with 2044 additions and 376 deletions
+42 -2
View File
@@ -1,6 +1,6 @@
from datetime import datetime
from datetime import date, datetime
from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, String, Text, UniqueConstraint, func
from sqlalchemy import Boolean, Date, DateTime, Float, ForeignKey, Integer, String, Text, UniqueConstraint, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.db.base import Base
@@ -263,6 +263,21 @@ class WorkoutLog(Base):
total_calories: Mapped[float | None] = mapped_column(Float, nullable=True)
steps: Mapped[int | None] = mapped_column(Integer, nullable=True)
exercises_json: Mapped[str] = mapped_column(Text, default="[]")
distance_m: Mapped[float | None] = mapped_column(Float, nullable=True)
avg_heart_rate: Mapped[int | None] = mapped_column(Integer, nullable=True)
max_heart_rate: Mapped[int | None] = mapped_column(Integer, nullable=True)
avg_pace: Mapped[float | None] = mapped_column(Float, nullable=True)
avg_cadence: Mapped[int | None] = mapped_column(Integer, nullable=True)
max_cadence: Mapped[int | None] = mapped_column(Integer, nullable=True)
avg_stride_length_cm: Mapped[float | None] = mapped_column(Float, nullable=True)
training_load: Mapped[float | None] = mapped_column(Float, nullable=True)
aerobic_effect: Mapped[float | None] = mapped_column(Float, nullable=True)
anaerobic_effect: Mapped[float | None] = mapped_column(Float, nullable=True)
vo2max: Mapped[float | None] = mapped_column(Float, nullable=True)
recovery_hours: Mapped[float | None] = mapped_column(Float, nullable=True)
intervals_json: Mapped[str | None] = mapped_column(Text, nullable=True)
heart_rate_zones_json: Mapped[str | None] = mapped_column(Text, nullable=True)
perceived_effort: Mapped[int | None] = mapped_column(Integer, nullable=True)
class FitnessReminder(Base):
@@ -345,6 +360,31 @@ class AssistantState(Base):
)
class DailyRecap(Base):
__tablename__ = "daily_recaps"
__table_args__ = (UniqueConstraint("user_id", "day", name="uq_daily_recaps_user_day"),)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True)
day: Mapped[date] = mapped_column(Date, index=True)
text: Mapped[str] = mapped_column(Text, default="")
image_url: Mapped[str | None] = mapped_column(String(512), nullable=True)
scene_tags: Mapped[str | None] = mapped_column(Text, nullable=True)
message_id: Mapped[int | None] = mapped_column(
ForeignKey("messages.id", ondelete="SET NULL"), nullable=True, index=True
)
session_id: Mapped[int | None] = mapped_column(
ForeignKey("chat_sessions.id", ondelete="SET NULL"), nullable=True, index=True
)
status: Mapped[str] = mapped_column(String(32), default="pending", index=True)
error: Mapped[str | None] = mapped_column(Text, nullable=True)
attempts: Mapped[int] = mapped_column(Integer, default=0)
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)
class WorkItem(Base):
__tablename__ = "work_items"