from datetime import datetime from app import db class FocusSession(db.Model): """Pomodoro-style focus session metadata linked to a time entry. Tracks configuration and outcomes for a single focus session so we can provide summaries independent of raw time entries. """ __tablename__ = 'focus_sessions' 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) task_id = db.Column(db.Integer, db.ForeignKey('tasks.id'), nullable=True, index=True) time_entry_id = db.Column(db.Integer, db.ForeignKey('time_entries.id'), nullable=True, index=True) # Session timing started_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) ended_at = db.Column(db.DateTime, nullable=True) # Pomodoro configuration (minutes) pomodoro_length = db.Column(db.Integer, nullable=False, default=25) short_break_length = db.Column(db.Integer, nullable=False, default=5) long_break_length = db.Column(db.Integer, nullable=False, default=15) long_break_interval = db.Column(db.Integer, nullable=False, default=4) # Outcomes cycles_completed = db.Column(db.Integer, nullable=False, default=0) interruptions = db.Column(db.Integer, nullable=False, default=0) notes = db.Column(db.Text, nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) def to_dict(self): return { 'id': self.id, 'user_id': self.user_id, 'project_id': self.project_id, 'task_id': self.task_id, 'time_entry_id': self.time_entry_id, 'started_at': self.started_at.isoformat() if self.started_at else None, 'ended_at': self.ended_at.isoformat() if self.ended_at else None, 'pomodoro_length': self.pomodoro_length, 'short_break_length': self.short_break_length, 'long_break_length': self.long_break_length, 'long_break_interval': self.long_break_interval, 'cycles_completed': self.cycles_completed, 'interruptions': self.interruptions, 'notes': self.notes, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None, }