Compare commits
2 Commits
c941b25a90
...
07f14b0564
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07f14b0564 | ||
|
|
3e6468fa38 |
@@ -1,7 +1,17 @@
|
|||||||
|
from datetime import date
|
||||||
|
from enum import Enum
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
|
|
||||||
from fastapi import Depends, Query
|
from fastapi import Depends, Query
|
||||||
from pydantic import BaseModel
|
from fastapi.exceptions import HTTPException
|
||||||
|
from pydantic import BaseModel, model_validator
|
||||||
|
|
||||||
|
|
||||||
|
class StatEnum(str, Enum):
|
||||||
|
open = "open"
|
||||||
|
closed = "closed"
|
||||||
|
in_progress = "in_progress"
|
||||||
|
todo = "todo"
|
||||||
|
|
||||||
|
|
||||||
class Pagination(BaseModel):
|
class Pagination(BaseModel):
|
||||||
@@ -9,4 +19,25 @@ class Pagination(BaseModel):
|
|||||||
limit: int | None = Query(default=30, ge=0, le=50)
|
limit: int | None = Query(default=30, ge=0, le=50)
|
||||||
|
|
||||||
|
|
||||||
PaginationTasks = Annotated[Pagination, Depends()]
|
PaginationTasksDep = Annotated[Pagination, Depends()]
|
||||||
|
|
||||||
|
|
||||||
|
class Status(BaseModel):
|
||||||
|
status: StatEnum | None = Query(default=None)
|
||||||
|
|
||||||
|
|
||||||
|
StatusTaskDep = Annotated[Status, Depends()]
|
||||||
|
|
||||||
|
|
||||||
|
class Date(BaseModel):
|
||||||
|
date_from: date | None = Query(default=None)
|
||||||
|
date_to: date | None = Query(default=None)
|
||||||
|
|
||||||
|
@model_validator(mode="after")
|
||||||
|
def check_dates(self):
|
||||||
|
if self.date_from and self.date_to and self.date_to < self.date_from:
|
||||||
|
raise HTTPException(status_code=422, detail="date_to cannot be less than date_from")
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
DateDep = Annotated[Date, Depends()]
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from typing import Annotated
|
|||||||
from fastapi import APIRouter, Depends
|
from fastapi import APIRouter, Depends
|
||||||
|
|
||||||
from src.api.dependacies.db_dep import sessionDep
|
from src.api.dependacies.db_dep import sessionDep
|
||||||
from src.api.dependacies.task_dep import PaginationTasks
|
from src.api.dependacies.task_dep import DateDep, PaginationTasksDep, StatusTaskDep
|
||||||
from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep
|
from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep
|
||||||
from src.schemas.tasks import TaskADDRequest
|
from src.schemas.tasks import TaskADDRequest
|
||||||
from src.services.tasks import TaskService
|
from src.services.tasks import TaskService
|
||||||
@@ -13,7 +13,13 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"])
|
|||||||
|
|
||||||
|
|
||||||
@router.get("/")
|
@router.get("/")
|
||||||
async def get_tasks(session: sessionDep, user: ActiveUser, page: PaginationTasks):
|
async def get_tasks(
|
||||||
|
session: sessionDep,
|
||||||
|
user: ActiveUser,
|
||||||
|
page: PaginationTasksDep,
|
||||||
|
status: StatusTaskDep,
|
||||||
|
date: DateDep,
|
||||||
|
):
|
||||||
result = await UserService(session).get_user_with_tasks(user.id)
|
result = await UserService(session).get_user_with_tasks(user.id)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ class UsersRepo(BaseRepo):
|
|||||||
date_to: Optional[date] = None,
|
date_to: Optional[date] = None,
|
||||||
date_from: Optional[date] = None,
|
date_from: Optional[date] = None,
|
||||||
) -> UsersORM | None:
|
) -> UsersORM | None:
|
||||||
tasks_subquery = self._tasks_subquary(date_from=date_from, date_to=date_to, user_id=user_id)
|
tasks_subquery = self._tasks_subquary(
|
||||||
|
date_from=date_from, date_to=date_to, user_id=user_id
|
||||||
|
)
|
||||||
|
|
||||||
if tasks_limit is not None:
|
if tasks_limit is not None:
|
||||||
tasks_subquery = tasks_subquery.limit(tasks_limit)
|
tasks_subquery = tasks_subquery.limit(tasks_limit)
|
||||||
@@ -59,7 +61,9 @@ class UsersRepo(BaseRepo):
|
|||||||
)
|
)
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
async def get_tasks_count(self, date_from: date | None, date_to: date | None, **filter_by) -> int:
|
async def get_tasks_count(
|
||||||
|
self, date_from: date | None, date_to: date | None, **filter_by
|
||||||
|
) -> int:
|
||||||
subq = self._tasks_subquary(date_from, date_to, **filter_by).subquery()
|
subq = self._tasks_subquary(date_from, date_to, **filter_by).subquery()
|
||||||
stmt = select(func.count()).select_from(subq)
|
stmt = select(func.count()).select_from(subq)
|
||||||
result = await self.session.execute(stmt)
|
result = await self.session.execute(stmt)
|
||||||
@@ -69,7 +73,9 @@ class UsersRepo(BaseRepo):
|
|||||||
priority_map = {"low": 1, "medium": 2, "high": 3, "critical": 4}
|
priority_map = {"low": 1, "medium": 2, "high": 3, "critical": 4}
|
||||||
return priority_map.get(priority, 0)
|
return priority_map.get(priority, 0)
|
||||||
|
|
||||||
def _tasks_subquary(self, date_from: date | None, date_to: date | None, **filter_by):
|
def _tasks_subquary(
|
||||||
|
self, date_from: date | None, date_to: date | None, **filter_by
|
||||||
|
):
|
||||||
subq = select(TasksORM.id).filter_by(**filter_by)
|
subq = select(TasksORM.id).filter_by(**filter_by)
|
||||||
if date_from is not None:
|
if date_from is not None:
|
||||||
subq = subq.filter(TasksORM.due_date >= date_from)
|
subq = subq.filter(TasksORM.due_date >= date_from)
|
||||||
|
|||||||
Reference in New Issue
Block a user