179 lines
4.8 KiB
Python
179 lines
4.8 KiB
Python
"""
|
|
CRUD operations for tasks
|
|
"""
|
|
from datetime import datetime
|
|
from typing import List, Optional
|
|
|
|
from sqlalchemy import or_
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.crud.base import CRUDBase
|
|
from app.models.task import Task, TaskPriority, TaskStatus
|
|
from app.schemas.task import TaskCreate, TaskUpdate
|
|
|
|
|
|
class CRUDTask(CRUDBase[Task, TaskCreate, TaskUpdate]):
|
|
"""
|
|
CRUD operations for Task model
|
|
"""
|
|
def create_with_owner(
|
|
self, db: Session, *, obj_in: TaskCreate, owner_id: int
|
|
) -> Task:
|
|
"""
|
|
Create a new task with owner
|
|
"""
|
|
db_obj = Task(
|
|
title=obj_in.title,
|
|
description=obj_in.description,
|
|
status=obj_in.status,
|
|
priority=obj_in.priority,
|
|
due_date=obj_in.due_date,
|
|
owner_id=owner_id,
|
|
created_at=datetime.utcnow(),
|
|
updated_at=datetime.utcnow(),
|
|
is_deleted=False,
|
|
)
|
|
db.add(db_obj)
|
|
db.commit()
|
|
db.refresh(db_obj)
|
|
return db_obj
|
|
|
|
def get_multi_by_owner(
|
|
self, db: Session, *, owner_id: int, skip: int = 0, limit: int = 100
|
|
) -> List[Task]:
|
|
"""
|
|
Get multiple tasks by owner with pagination
|
|
"""
|
|
return (
|
|
db.query(self.model)
|
|
.filter(Task.owner_id == owner_id, not Task.is_deleted)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
def get_multi_by_owner_and_status(
|
|
self, db: Session, *, owner_id: int, status: TaskStatus,
|
|
skip: int = 0, limit: int = 100
|
|
) -> List[Task]:
|
|
"""
|
|
Get multiple tasks by owner and status with pagination
|
|
"""
|
|
return (
|
|
db.query(self.model)
|
|
.filter(
|
|
Task.owner_id == owner_id,
|
|
Task.status == status,
|
|
not Task.is_deleted
|
|
)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
def get_multi_by_owner_and_priority(
|
|
self, db: Session, *, owner_id: int, priority: TaskPriority,
|
|
skip: int = 0, limit: int = 100
|
|
) -> List[Task]:
|
|
"""
|
|
Get multiple tasks by owner and priority with pagination
|
|
"""
|
|
return (
|
|
db.query(self.model)
|
|
.filter(
|
|
Task.owner_id == owner_id,
|
|
Task.priority == priority,
|
|
not Task.is_deleted
|
|
)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
def get_multi_by_owner_and_search(
|
|
self, db: Session, *, owner_id: int, search: str,
|
|
skip: int = 0, limit: int = 100
|
|
) -> List[Task]:
|
|
"""
|
|
Get multiple tasks by owner and search term with pagination
|
|
"""
|
|
search_pattern = f"%{search}%"
|
|
return (
|
|
db.query(self.model)
|
|
.filter(
|
|
Task.owner_id == owner_id,
|
|
or_(
|
|
Task.title.ilike(search_pattern),
|
|
Task.description.ilike(search_pattern)
|
|
),
|
|
not Task.is_deleted
|
|
)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
def get_multi_by_owner_and_due_date_range(
|
|
self, db: Session, *, owner_id: int, start_date: datetime, end_date: datetime,
|
|
skip: int = 0, limit: int = 100
|
|
) -> List[Task]:
|
|
"""
|
|
Get multiple tasks by owner and due date range with pagination
|
|
"""
|
|
return (
|
|
db.query(self.model)
|
|
.filter(
|
|
Task.owner_id == owner_id,
|
|
Task.due_date >= start_date,
|
|
Task.due_date <= end_date,
|
|
not Task.is_deleted
|
|
)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
def get_by_id_and_owner(
|
|
self, db: Session, *, id: int, owner_id: int
|
|
) -> Optional[Task]:
|
|
"""
|
|
Get a task by ID and owner
|
|
"""
|
|
return (
|
|
db.query(self.model)
|
|
.filter(
|
|
Task.id == id,
|
|
Task.owner_id == owner_id,
|
|
not Task.is_deleted
|
|
)
|
|
.first()
|
|
)
|
|
|
|
def update_status(
|
|
self, db: Session, *, db_obj: Task, status: TaskStatus
|
|
) -> Task:
|
|
"""
|
|
Update a task status
|
|
"""
|
|
db_obj.status = status
|
|
db_obj.updated_at = datetime.utcnow()
|
|
db.add(db_obj)
|
|
db.commit()
|
|
db.refresh(db_obj)
|
|
return db_obj
|
|
|
|
def soft_delete(
|
|
self, db: Session, *, db_obj: Task
|
|
) -> Task:
|
|
"""
|
|
Mark a task as deleted (soft delete)
|
|
"""
|
|
db_obj.is_deleted = True
|
|
db_obj.updated_at = datetime.utcnow()
|
|
db.add(db_obj)
|
|
db.commit()
|
|
db.refresh(db_obj)
|
|
return db_obj
|
|
|
|
|
|
task = CRUDTask(Task) |