Compare commits

...

2 Commits

Author SHA1 Message Date
IluaAir
2d54f595db add date from and date to 2025-08-24 21:55:42 +03:00
IluaAir
186b497130 repo user with loads filters 2025-08-24 13:43:07 +03:00
3 changed files with 43 additions and 4 deletions

View File

@@ -23,6 +23,7 @@ ___
- 🔥 Установка приоритетов и дедлайнов - 🔥 Установка приоритетов и дедлайнов
- 🔔 Напоминания и уведомления - 🔔 Напоминания и уведомления
- ⚙️ Асинхронная обработка задач - ⚙️ Асинхронная обработка задач
- 📄 Пагинация и фильтрация задач с поддержкой limit/offset
- 💡 Современный и интуитивно понятный интерфейс - 💡 Современный и интуитивно понятный интерфейс
--- ---

View File

@@ -9,6 +9,10 @@ ___
- `GET /users` — Получить список всех пользователей - `GET /users` — Получить список всех пользователей
- `GET /users/{user_id}` — Получить конкретного пользователя - `GET /users/{user_id}` — Получить конкретного пользователя
- `GET /users/{user_id}/tasks` — Получить задачи пользователя - `GET /users/{user_id}/tasks` — Получить задачи пользователя
- **Query параметры:**
- `limit` (int, опционально) — Максимальное количество задач для возврата
- `offset` (int, опционально, по умолчанию 0) — Количество задач для пропуска
- **Пример:** `GET /users/1/tasks?limit=10&offset=20`
- `POST /users` — Создать нового пользователя - `POST /users` — Создать нового пользователя
- `PUT /users/{user_id}` — Обновить данные пользователя - `PUT /users/{user_id}` — Обновить данные пользователя
- `PATCH /users/{user_id}` — Частично обновить данные пользователя - `PATCH /users/{user_id}` — Частично обновить данные пользователя

View File

@@ -1,3 +1,6 @@
from datetime import date
from typing import Optional
from sqlalchemy import select, update from sqlalchemy import select, update
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
@@ -20,16 +23,47 @@ class UsersRepo(BaseRepo):
model = result.scalar_one() model = result.scalar_one()
return model return model
async def get_one_with_load(self, user_id: int) -> UsersORM | None: async def get_one_with_load(
quary = ( self,
user_id: int,
tasks_limit: Optional[int] = None,
tasks_offset: int = 0,
date_to: Optional[date] = None,
date_from: Optional[date] = None,
) -> UsersORM | None:
tasks_subquery = select(TasksORM.id).where(TasksORM.user_id == user_id)
if date_from is not None:
tasks_subquery = tasks_subquery.where(TasksORM.due_date >= date_from)
if date_to is not None:
tasks_subquery = tasks_subquery.where(TasksORM.due_date <= date_to)
if tasks_limit is not None:
tasks_subquery = tasks_subquery.limit(tasks_limit)
if tasks_offset > 0:
tasks_subquery = tasks_subquery.offset(tasks_offset)
query = (
select(self.model) select(self.model)
.where(self.model.id == user_id) .where(self.model.id == user_id)
.options( .options(
selectinload(self.model.tasks).load_only( selectinload(
self.model.tasks.and_(TasksORM.id.in_(tasks_subquery))
).load_only(
TasksORM.id, TasksORM.title, TasksORM.due_date, TasksORM.priority TasksORM.id, TasksORM.title, TasksORM.due_date, TasksORM.priority
) )
) )
) )
result = await self.session.execute(quary) result = await self.session.execute(query)
obj = result.scalar_one_or_none() obj = result.scalar_one_or_none()
if obj and obj.tasks:
obj.tasks.sort(
key=lambda task: (
task.due_date or date.max,
-self._priority(task.priority),
)
)
return obj return obj
def _priority(self, priority: str):
priority_map = {"low": 1, "medium": 2, "high": 3, "critical": 4}
return priority_map.get(priority, 0)