feat: add Pomodoro timer functionality with logging and project goals
- Implemented Pomodoro timer in the app, allowing users to start, pause, and stop sessions. - Added context for managing Pomodoro state and actions. - Integrated time logging for completed sessions to track productivity. - Enhanced project settings to include time goals and Pomodoro settings. - Created migration scripts to update the database schema for new project fields and time logs. - Updated UI components to display Pomodoro controls and project time summaries. - Added category filtering for projects in the project list view.
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
from sqlalchemy.orm import Session, joinedload
|
||||
from sqlalchemy import func
|
||||
from typing import List, Optional
|
||||
from datetime import datetime, timedelta
|
||||
from . import models, schemas
|
||||
|
||||
|
||||
@@ -186,3 +188,66 @@ def get_tasks_by_status(db: Session, project_id: int, status: str) -> List[model
|
||||
models.Task.project_id == project_id,
|
||||
models.Task.status == status
|
||||
).all()
|
||||
|
||||
|
||||
# TimeLog CRUD
|
||||
def create_time_log(db: Session, task_id: int, time_log: schemas.TimeLogCreate) -> models.TimeLog:
|
||||
db_log = models.TimeLog(
|
||||
task_id=task_id,
|
||||
minutes=time_log.minutes,
|
||||
note=time_log.note,
|
||||
session_type=time_log.session_type,
|
||||
)
|
||||
db.add(db_log)
|
||||
db.commit()
|
||||
db.refresh(db_log)
|
||||
return db_log
|
||||
|
||||
|
||||
def get_time_logs_by_task(db: Session, task_id: int) -> List[models.TimeLog]:
|
||||
return db.query(models.TimeLog).filter(
|
||||
models.TimeLog.task_id == task_id
|
||||
).order_by(models.TimeLog.logged_at.desc()).all()
|
||||
|
||||
|
||||
def get_project_time_summary(db: Session, project_id: int) -> dict:
|
||||
"""Aggregate time logged across all tasks in a project"""
|
||||
project = get_project(db, project_id)
|
||||
|
||||
# Get all task IDs in this project
|
||||
task_ids = db.query(models.Task.id).filter(
|
||||
models.Task.project_id == project_id
|
||||
).subquery()
|
||||
|
||||
# Total minutes logged
|
||||
total = db.query(func.sum(models.TimeLog.minutes)).filter(
|
||||
models.TimeLog.task_id.in_(task_ids)
|
||||
).scalar() or 0
|
||||
|
||||
# Pomodoro minutes
|
||||
pomodoro = db.query(func.sum(models.TimeLog.minutes)).filter(
|
||||
models.TimeLog.task_id.in_(task_ids),
|
||||
models.TimeLog.session_type == "pomodoro"
|
||||
).scalar() or 0
|
||||
|
||||
# Manual minutes
|
||||
manual = db.query(func.sum(models.TimeLog.minutes)).filter(
|
||||
models.TimeLog.task_id.in_(task_ids),
|
||||
models.TimeLog.session_type == "manual"
|
||||
).scalar() or 0
|
||||
|
||||
# Weekly minutes (past 7 days)
|
||||
week_ago = datetime.utcnow() - timedelta(days=7)
|
||||
weekly = db.query(func.sum(models.TimeLog.minutes)).filter(
|
||||
models.TimeLog.task_id.in_(task_ids),
|
||||
models.TimeLog.logged_at >= week_ago
|
||||
).scalar() or 0
|
||||
|
||||
return {
|
||||
"total_minutes": total,
|
||||
"pomodoro_minutes": pomodoro,
|
||||
"manual_minutes": manual,
|
||||
"weekly_minutes": weekly,
|
||||
"weekly_hours_goal": project.weekly_hours_goal if project else None,
|
||||
"total_hours_goal": project.total_hours_goal if project else None,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user