Fix bugs, add README and Makefile

This commit is contained in:
2026-01-16 20:39:51 +03:00
parent 3e515c66ec
commit a065c6b7be
30 changed files with 695 additions and 286 deletions

View File

@@ -1,17 +1,26 @@
import uuid
from aiogram import types
from aiogram.enums import ParseMode
from aiogram.fsm.context import FSMContext
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
from pydantic_filters import PagePagination
from birthday_pool_bot.dto import User
from birthday_pool_bot.repositories.repositories import UsersRepository
from birthday_pool_bot.dto import BankEnum, User
from birthday_pool_bot.repositories.repositories import (
PoolsRepository,
SubscriptionsRepository,
UsersRepository,
)
from . import constants
from .callback_data import (
AddSubscriptionCallbackData,
AddSubscriptionConfirmCallbackData,
ConfirmAnswerEnum,
MenuCallbackData,
NewSubscriptionCallbackData,
NewSubscriptionConfirmCallbackData,
PoolActionEnum,
PoolCallbackData,
PoolsCallbackData,
PoolsBackCallbackData,
SubscriptionActionEnum,
SubscriptionCallbackData,
SubscriptionsCallbackData,
@@ -200,12 +209,12 @@ async def show_subscriptions(
text = "Мои подписки:" if subscriptions else "Нет подписок"
keyboard = InlineKeyboardBuilder()
for subscription in subscriptions:
keyboard.button(
keyboard.row(types.InlineKeyboardButton(
text=subscription.name,
callback_data=SubscriptionCallbackData(
to_user_id=subscription.to_user_id,
).pack(),
)
))
navigation_row = []
if page > 1:
navigation_row.append(types.InlineKeyboardButton(
@@ -226,7 +235,7 @@ async def show_subscriptions(
keyboard.row(
types.InlineKeyboardButton(
text="Добавить",
callback_data=AddSubscriptionCallbackData().pack(),
callback_data=NewSubscriptionCallbackData().pack(),
),
types.InlineKeyboardButton(
text="Назад",
@@ -273,7 +282,12 @@ async def show_subscription(
)
if subscription.pool is not None:
if subscription.pool.owner_id == from_user_id:
text += "Вы собираете деньги\n\n"
bank_title = constants.BANKS_TITLE_MAP[subscription.pool.payment_data.bank]
text += (
"Вы собираете деньги на:\n"
f"_Телефон_: {subscription.pool.payment_data.phone}\n"
f"_Банк_: {bank_title}\n\n"
)
else:
text += "Вы участвуете в сборе денег\n\n"
keyboard = InlineKeyboardBuilder()
@@ -333,7 +347,7 @@ async def delete_subscription(
await callback_query.answer(text="Подписка успешно удалена")
async def ask_add_subscription_user(
async def ask_new_subscription_user(
callback_query: types.CallbackQuery | None = None,
message: types.Message | None = None,
):
@@ -367,7 +381,7 @@ async def ask_add_subscription_user(
)
async def ask_add_subscription_user_birthday(
async def ask_new_subscription_user_birthday(
message: types.Message,
):
text = (
@@ -388,7 +402,7 @@ async def ask_add_subscription_user_birthday(
)
async def ask_add_subscription_name(
async def ask_new_subscription_name(
message: types.Message,
users_repository: UsersRepository,
subscription_user_id: uuid.UUID,
@@ -422,7 +436,7 @@ async def ask_add_subscription_name(
)
async def ask_add_subscription_pool_decision(
async def ask_new_subscription_pool_decision(
message: types.Message,
pools_repository: PoolsRepository,
users_repository: UsersRepository,
@@ -458,9 +472,11 @@ async def ask_add_subscription_pool_decision(
)
async def show_add_subscription_pools(
async def show_new_subscription_choosing_pools(
user: User,
users_repository: UsersRepository,
pools_repository: PoolsRepository,
subscription_user_id: uuid.UUID,
message: types.Message | None = None,
callback_query: types.CallbackQuery | None = None,
):
@@ -470,31 +486,34 @@ async def show_add_subscription_pools(
callback_data = SubscriptionsCallbackData.unpack(callback_query.data)
page = callback_data.page
async with subscriptions_repository.transaction():
total = await subscriptions_repository.get_user_subscriptions_count(user_id=user.id)
async with pools_repository.transaction():
total = await pools_repository.get_pools_by_birthday_user_id_count(
birthday_user_id=subscription_user_id,
)
pages_count = total // per_page + int(bool(total % per_page))
subscriptions = [
subscription
async for subscription in subscriptions_repository.get_user_subscriptions(
user_id=user.id,
pools = [
pool
async for pool in pools_repository.get_pools_by_birthday_user_id(
birthday_user_id=subscription_user_id,
pagination=PagePagination(page=page, per_page=per_page),
with_owner=True,
)
]
text = "Сборы:" if subscriptions else "Нет сборов"
text = "Сборы:" if pools else "Нет сборов"
keyboard = InlineKeyboardBuilder()
for subscription in subscriptions:
keyboard.button(
text=subscription.name,
callback_data=SubscriptionCallbackData(
to_user_id=subscription.to_user_id,
for pool in pools:
keyboard.row(types.InlineKeyboardButton(
text=pool.owner.name or "Аноним",
callback_data=PoolCallbackData(
id=pool.id,
).pack(),
)
))
navigation_row = []
if page > 1:
navigation_row.append(types.InlineKeyboardButton(
text="<",
callback_data=SubscriptionsCallbackData(page=page - 1).pack(),
callback_data=PoolsCallbackData(page=page - 1).pack(),
))
if pages_count > 1:
navigation_row.append(types.InlineKeyboardButton(
@@ -504,17 +523,13 @@ async def show_add_subscription_pools(
if page < pages_count:
navigation_row.append(types.InlineKeyboardButton(
text=">",
callback_data=SubscriptionsCallbackData(page=page + 1).pack(),
callback_data=PoolsCallbackData(page=page + 1).pack(),
))
keyboard.row(*navigation_row)
keyboard.row(
types.InlineKeyboardButton(
text="Добавить",
callback_data=AddSubscriptionCallbackData().pack(),
),
types.InlineKeyboardButton(
text="Назад",
callback_data=MenuCallbackData().pack(),
callback_data=PoolsBackCallbackData().pack(),
),
)
reply_markup = keyboard.as_markup()
@@ -535,7 +550,70 @@ async def show_add_subscription_pools(
)
async def ask_add_subscription_pool_description(
async def show_new_subscription_choosing_pool(
pools_repository: PoolsRepository,
pool_id: uuid.UUID,
message: types.Message | None = None,
callback_query: types.CallbackQuery | None = None,
):
async with pools_repository.transaction():
pool = await pools_repository.get_pool_by_id(
pool_id=pool_id,
with_owner=True,
with_birthday_user=True,
)
if pool is None:
raise FlowInternalError()
owner_name = (
pool.owner.name
or pool.owner.phone
or pool.owner.telegram_id
)
birthday_user_name = (
pool.birthday_user.name
or pool.birthday_user.phone
or pool.birthday_user.telegram_id
)
bank_name = constants.BANKS_TITLE_MAP[pool.payment_data.bank]
text = (
f"*{owner_name}* собирает деньги для {birthday_user_name}\n\n"
"Данные для отправки подарка:\n"
f"_Телефон_: {pool.payment_data.phone}\n"
f"_Банк_: {bank_name}\n"
)
keyboard = InlineKeyboardBuilder()
keyboard.button(
text="Выбрать",
callback_data=PoolCallbackData(
id=pool_id,
action=PoolActionEnum.CHOOSE,
).pack(),
)
keyboard.button(
text="Назад",
callback_data=PoolsCallbackData().pack()
)
keyboard.adjust(2)
reply_markup = keyboard.as_markup()
if message is not None:
await message.reply(
text=text,
parse_mode=ParseMode.MARKDOWN,
reply_markup=reply_markup,
)
elif callback_query is not None:
await callback_query.message.edit_text(
text=text,
parse_mode=ParseMode.MARKDOWN,
)
await callback_query.message.edit_reply_markup(
reply_markup=reply_markup,
)
async def ask_new_subscription_pool_description(
message: types.Message,
):
keyboard = ReplyKeyboardBuilder()
@@ -554,7 +632,7 @@ async def ask_add_subscription_pool_description(
)
async def ask_add_subscription_pool_payment_phone(
async def ask_new_subscription_pool_payment_phone(
message: types.Message,
user: User,
):
@@ -589,7 +667,7 @@ async def ask_add_subscription_pool_payment_phone(
)
async def ask_add_subscription_pool_payment_bank(
async def ask_new_subscription_pool_payment_bank(
message: types.Message,
):
text = "Выберите банк для приёма платежей"
@@ -611,7 +689,7 @@ async def ask_add_subscription_pool_payment_bank(
)
async def ask_add_subscription_confirmation(
async def ask_new_subscription_confirmation(
message: types.Message,
users_repository: UsersRepository,
pools_repository: PoolsRepository,
@@ -663,13 +741,13 @@ async def ask_add_subscription_confirmation(
keyboard = InlineKeyboardBuilder()
keyboard.button(
text="Да",
callback_data=AddSubscriptionConfirmCallbackData(
callback_data=NewSubscriptionConfirmCallbackData(
answer=ConfirmAnswerEnum.YES,
).pack(),
)
keyboard.button(
text="Нет",
callback_data=AddSubscriptionConfirmCallbackData(
callback_data=NewSubscriptionConfirmCallbackData(
answer=ConfirmAnswerEnum.NO,
).pack(),
)