"""Modelle des Projekte-Moduls: Project, Task. Aufgaben dürfen ohne Projekt existieren (project_id nullable). Beim Löschen eines Projekts werden seine Aufgaben nicht gelöscht, sondern in der Routen-Logik (Schritt 5) auf project_id=None gesetzt. """ from ..extensions import db from ..models import utcnow class Project(db.Model): __tablename__ = "projects" id = db.Column(db.Integer, primary_key=True) user_id = db.Column( db.Integer, db.ForeignKey("users.id"), nullable=False, index=True ) name = db.Column(db.String(120), nullable=False) # Hex-Farbe aus fester Palette (z.B. "#5b8def"). color = db.Column(db.String(7), nullable=False, default="#5b8def") created_at = db.Column(db.DateTime, default=utcnow, nullable=False) user = db.relationship("User", back_populates="projects") tasks = db.relationship("Task", back_populates="project") def __repr__(self) -> str: return f"" class Task(db.Model): __tablename__ = "tasks" id = db.Column(db.Integer, primary_key=True) user_id = db.Column( db.Integer, db.ForeignKey("users.id"), nullable=False, index=True ) project_id = db.Column( db.Integer, db.ForeignKey("projects.id"), nullable=True, index=True ) text = db.Column(db.String(500), nullable=False) due_date = db.Column(db.Date, nullable=True) done = db.Column(db.Boolean, default=False, nullable=False) created_at = db.Column(db.DateTime, default=utcnow, nullable=False) user = db.relationship("User", back_populates="tasks") project = db.relationship("Project", back_populates="tasks") def __repr__(self) -> str: return f""