VORKOUT-7 #9

Merged
ivan.dev merged 12 commits from VORKOUT-7 into master 2025-06-05 16:29:14 +05:00
Showing only changes of commit 320c13183f - Show all commits

View File

@ -3,6 +3,8 @@ import math
from datetime import datetime, timezone
from pydantic import TypeAdapter
from sqlalchemy import insert, select, func
from sqlalchemy.ext.asyncio import AsyncConnection
from enum import Enum
@ -10,33 +12,45 @@ from enum import Enum
from api.db.tables.account import account_table
from api.schemas.account.account import User
from api.schemas.endpoints.account import AllUser,AllUserResponse
from api.schemas.endpoints.account import AllUser, AllUserResponse
ivan.dev marked this conversation as resolved Outdated

Надо переименовать метод и изменить описание, сейчас же не только login и id

Надо переименовать метод и изменить описание, сейчас же не только `login` и `id`
async def get_all_users_login_and_id(connection: AsyncConnection,page,limit) -> Optional[User]:
async def get_all_users_login_and_id(connection: AsyncConnection, page, limit) -> Optional[User]:
"""
Получает id и login всех юзеров
"""
first_user = page*limit-(limit-1)
last_user = first_user+(limit-1)
ivan.dev marked this conversation as resolved Outdated

Давай все-таки через offset делать, а то вычислять по id как-то сомнительно выглядит

Давай все-таки через `offset` делать, а то вычислять по `id` как-то сомнительно выглядит
query = select(account_table.c.id, account_table.c.login).where(account_table.c.id.between(first_user, last_user ))
user_adapter = TypeAdapter(AllUser)
response_adapter = TypeAdapter(AllUserResponse)
ivan.dev marked this conversation as resolved Outdated
  1. Тебе нужен адаптер для list[AllUser]. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам.
  2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
1. Тебе нужен адаптер для `list[AllUser]`. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам. 2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
result = await connection.execute(query)
first_user = page*limit-(limit)
users = result.fetchall()
user_list = [{'id': user.id, 'login': user.login} for user in users]
user_models = [AllUser(id=user['id'], login=user['login']) for user in user_list]
query = (
select(account_table.c.id, account_table.c.login)
.order_by(account_table.c.id)
ivan.dev marked this conversation as resolved Outdated

Можно вместо этого использовать parse_obj_as из pydantic.tools, чтобы парсить запрос сразу из бд в модель User
Можешь посмотреть в репозитории бэка

Можно вместо этого использовать `parse_obj_as` из `pydantic.tools`, чтобы парсить запрос сразу из бд в модель `User` Можешь посмотреть в [репозитории](https://gitea.heado.ru/dinar/backend/src/branch/master/backend/db/logic/issues.py#L93) бэка

parse_obj_as устарело в Pydantic 2, не используйте это. Для подобных целей создали TypeAdapter.

`parse_obj_as` устарело в Pydantic 2, не используйте это. Для подобных целей создали [TypeAdapter](https://docs.pydantic.dev/2.11/concepts/type_adapter/).
.offset(first_user)
.limit(limit)
)
count_query = select(func.count()).select_from(account_table)
result = await connection.execute(query)
count_result = await connection.execute(count_query)
amount_count = count_result.scalar()
amount_pages = math.ceil(amount_count / limit)
users_data = result.fetchall()
ivan.dev marked this conversation as resolved Outdated

А почему ты только эти поля селектишь? Просто для теста взял?

А почему ты только эти поля селектишь? Просто для теста взял?

Да.

Да.
total_count = count_result.scalar()
total_pages = math.ceil(total_count / limit)
return AllUserResponse(users=user_models, amount_count=amount_count, amount_pages=amount_pages)
validated_users = [
user_adapter.validate_python({"id": u.id, "login": u.login})
for u in users_data
]
return response_adapter.validate_python({
ivan.dev marked this conversation as resolved Outdated

Тут нужно вернуть обыкновенное заполнение класса и его возврат.

Тут нужно вернуть обыкновенное заполнение класса и его возврат.

Так сразу users_data можно сюда передать? На худой случай ._asdict() есть.

Так сразу `users_data` можно сюда передать? На худой случай [._asdict()](https://docs.sqlalchemy.org/en/20/core/connections.html#sqlalchemy.engine.Row._asdict) есть.
"users": validated_users,
"amount_count": total_count,
"amount_pages": total_pages
})
async def get_user_id(connection: AsyncConnection, id: int) -> Optional[User]:
@ -116,8 +130,6 @@ async def create_user(connection: AsyncConnection, user: User, creator_id: int)
status=user.status.value
)
await connection.execute(query)
await connection.commit()