from sqlalchemy import ( Column, Integer, String, Text, Boolean, Date, DateTime, Time, Enum, ForeignKey, text, ) from sqlalchemy.orm import DeclarativeBase, relationship # ---------------------------------------------------------------------- # Base class # ---------------------------------------------------------------------- class Base(DeclarativeBase): pass # ---------------------------------------------------------------------- # User # ---------------------------------------------------------------------- class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, autoincrement=True, index=True) email = Column(String(255), nullable=False, unique=True, index=True) username = Column(String(150), nullable=False, unique=True, index=True) hashed_password = Column(String(255), nullable=False) # JSON est idéal pour stocker un dict, sinon utilise String + server_default stats = Column(Text, nullable=False) # bool → TINYINT(1) avec server_default is_active = Column(Boolean, nullable=False, server_default=text("1")) # Relations tasks = relationship("Task", back_populates="owner", cascade="all, delete-orphan") events = relationship("Event", back_populates="owner", cascade="all, delete-orphan") goals = relationship("Goal", back_populates="owner", cascade="all, delete-orphan") sub_goals = relationship("SubGoal", back_populates="owner", cascade="all, delete-orphan") notes = relationship("Note", back_populates="owner", cascade="all, delete-orphan") # ---------------------------------------------------------------------- # Task # ---------------------------------------------------------------------- class Task(Base): __tablename__ = "tasks" id = Column(Integer, primary_key=True, autoincrement=True, index=True) description = Column(String(255), nullable=False, index=True) frequency = Column(Integer, nullable=False, server_default=text("4223")) # valeur par défaut côté serveur reward = Column(Integer, nullable=True) goal_id = Column(Integer, ForeignKey("goals.id"), nullable=True) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) start_date = Column(Date, nullable=False) next_date = Column(Date, nullable=True) owner = relationship("User", back_populates="tasks") goal = relationship("Goal", back_populates="tasks") # ---------------------------------------------------------------------- # Event # ---------------------------------------------------------------------- class Event(Base): __tablename__ = "events" id = Column(Integer, primary_key=True, autoincrement=True, index=True) name = Column(String(255), nullable=False, index=True) # texte court → String description = Column(String(255), nullable=True, index=True) frequency = Column(Integer, nullable=False, server_default=text("4223")) start_time = Column(Time, nullable=False) end_time = Column(Time, nullable=False) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) owner = relationship("User", back_populates="events") # ---------------------------------------------------------------------- # Goal # ---------------------------------------------------------------------- class Goal(Base): __tablename__ = "goals" id = Column(Integer, primary_key=True, autoincrement=True, index=True) title = Column(String(255), nullable=False, index=True) description = Column(Text, nullable=True) # Enum avec nom explicite state = Column( Enum("in_progress", "successful", "failed", "aborted", name="goal_state"), nullable=False, server_default=text("'in_progress'") ) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) tasks = relationship("Task", back_populates="goal", cascade="all, delete-orphan") notes = relationship("Note", back_populates="goal", cascade="all, delete-orphan") sub_goals = relationship("SubGoal", back_populates="goal", cascade="all, delete-orphan") owner = relationship("User", back_populates="goals") # ---------------------------------------------------------------------- # SubGoal # ---------------------------------------------------------------------- class SubGoal(Base): __tablename__ = "sub_goals" id = Column(Integer, primary_key=True, autoincrement=True, index=True) title = Column(String(255), nullable=False, index=True) description = Column(Text, nullable=True) state = Column( Enum("in_progress", "successful", "failed", "aborted", name="subgoal_state"), nullable=False, server_default=text("'in_progress'") ) reward = Column(Integer, nullable=True) goal_id = Column(Integer, ForeignKey("goals.id"), nullable=False) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) goal = relationship("Goal", back_populates="sub_goals") owner = relationship("User", back_populates="sub_goals") # ---------------------------------------------------------------------- # Note # ---------------------------------------------------------------------- class Note(Base): __tablename__ = "notes" id = Column(Integer, primary_key=True, autoincrement=True, index=True) title = Column(String(255), nullable=False, index=True) description = Column(Text, nullable=True) content = Column(Text, nullable=True) goal_id = Column(Integer, ForeignKey("goals.id"), nullable=True) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) created_at = Column(DateTime, nullable=False) updated_at = Column(DateTime, nullable=False) goal = relationship("Goal", back_populates="notes") owner = relationship("User", back_populates="notes") # -------------------------------------------------------------- __all__ = ["Base", "User", "Task", "Event", "Goal", "SubGoal", "Note"]