diff --git a/backend/app/api/tasks.py b/backend/app/api/tasks.py index 0899484..6af04f1 100644 --- a/backend/app/api/tasks.py +++ b/backend/app/api/tasks.py @@ -3,7 +3,7 @@ from typing import Any, cast from fastapi import APIRouter, BackgroundTasks, HTTPException, Query, Response -from sqlalchemy import Select, or_, select +from sqlalchemy import Select, case, or_, select from app.dependencies import DbDep, UserIdDep from app.models import CoinEvent, Project, Tag, Task, utcnow @@ -133,7 +133,13 @@ parent_id: int | None = Query(None), include_archived: bool = Query(False), ) -> list[Task]: - stmt = select(Task).where(Task.user_id == user_id).order_by(Task.created_at.desc()) + # Завершённые задачи сортируются по дате закрытия, остальные — по добавлению + closed = case((Task.status == "done", Task.done_at), else_=Task.created_at) + stmt = ( + select(Task) + .where(Task.user_id == user_id) + .order_by(closed.desc().nullslast()) + ) if detail_state: stmt = stmt.where(Task.detail_state == detail_state) if status: diff --git a/backend/tests/test_tasks_api.py b/backend/tests/test_tasks_api.py index bf36ca0..df549fc 100644 --- a/backend/tests/test_tasks_api.py +++ b/backend/tests/test_tasks_api.py @@ -68,6 +68,21 @@ assert done.json()["done_at"] is not None +def test_list_sorts_done_by_closed_at(client: TestClient) -> None: + """Завершённые задачи в списке — по дате закрытия, остальные — по добавлению.""" + first = create_task(client, "первая") + second = create_task(client, "вторая") + third = create_task(client, "третья") + + # закрываем в порядке, обратном добавлению: «первая» закрыта раньше «второй» + for t in (second, first): + client.patch(f"/api/tasks/{t['id']}", json={"status": "done"}) + + ids = [t["id"] for t in client.get("/api/tasks").json()] + # завершённые — по done_at (первая выше второй), затем незавершённые + assert ids == [first["id"], second["id"], third["id"]] + + def test_list_filter_by_priority(client: TestClient) -> None: """Фильтр по градациям приоритета (ТЗ 3.6): без приоритета — very_low.""" low = create_task(client, "без приоритета")