Compare commits

...

4 Commits

Author SHA1 Message Date
279e0c6a70 Обновить README.md 2025-12-14 10:22:18 +00:00
5cf9455f76 add logging to mailing error 2025-11-14 14:42:25 +03:00
da3af83b3a mailig skip blocked users 2025-11-14 14:28:18 +03:00
1be3401d09 fix after merge 2025-11-14 14:14:15 +03:00
6 changed files with 33 additions and 29 deletions

View File

@@ -1,5 +1,4 @@
# Бот для записи на курсы и мероприятия от школы фасциопатии # Бот для записи на курсы и мероприятия от школы фасциопатии
# Бот для записи на курсы и мероприятия от школы фасциопатии
## Текущие возможности ## Текущие возможности

View File

@@ -4,11 +4,7 @@ from aiogram_dialog.widgets.text import Case, Const, Format, Jinja
from app.bot.dialogs.templates import event_template from app.bot.dialogs.templates import event_template
<<<<<<< HEAD
from .getters import event_getter, events_list_getter, registration_getter from .getters import event_getter, events_list_getter, registration_getter
=======
from .getters import event_getter, events_list_getter
>>>>>>> 7e5939394de1e40064ccf364bcfabbbd117d5d32
from .handlers import change_registration, on_event_selected from .handlers import change_registration, on_event_selected
from .states import EventsSG from .states import EventsSG
@@ -35,10 +31,7 @@ events_dialog = Dialog(
[Const("зарегистрироваться"), Const("отменить регистрацию")], [Const("зарегистрироваться"), Const("отменить регистрацию")],
selector="is_registered_to_event", selector="is_registered_to_event",
), ),
<<<<<<< HEAD
id="change_registration_btn", id="change_registration_btn",
=======
>>>>>>> 7e5939394de1e40064ccf364bcfabbbd117d5d32
on_click=change_registration, on_click=change_registration,
), ),
Back(Const("Назад")), Back(Const("Назад")),

View File

@@ -5,10 +5,7 @@ from app.infrastructure.database.crud import (
get_event_by_id, get_event_by_id,
get_events_list, get_events_list,
) )
<<<<<<< HEAD
from app.infrastructure.database.enums import UserEventStatus from app.infrastructure.database.enums import UserEventStatus
=======
>>>>>>> 7e5939394de1e40064ccf364bcfabbbd117d5d32
from app.infrastructure.database.models import Event from app.infrastructure.database.models import Event

View File

@@ -19,7 +19,6 @@ async def on_event_selected(
manager.dialog_data["selected_event"] = int(item_id) manager.dialog_data["selected_event"] = int(item_id)
await manager.next() await manager.next()
<<<<<<< HEAD
async def change_registration( async def change_registration(
callback: CallbackQuery, callback: CallbackQuery,
@@ -40,7 +39,3 @@ async def change_registration(
await register_user_to_event( await register_user_to_event(
manager.middleware_data["session"], user.id, event_id manager.middleware_data["session"], user.id, event_id
) )
=======
async def change_registration():
...
>>>>>>> 7e5939394de1e40064ccf364bcfabbbd117d5d32

View File

@@ -4,9 +4,11 @@ from aiogram.types import CallbackQuery, Message
from aiogram_dialog import DialogManager from aiogram_dialog import DialogManager
from aiogram_dialog.widgets.input import MessageInput from aiogram_dialog.widgets.input import MessageInput
from aiogram_dialog.widgets.kbd import Button from aiogram_dialog.widgets.kbd import Button
from structlog import get_logger
from app.infrastructure.database.crud import get_users from app.infrastructure.database.crud import get_users
logger = get_logger()
async def message_data( async def message_data(
message: Message, message: Message,
@@ -26,29 +28,50 @@ async def choose_recipients(
await manager.next() await manager.next()
async def confirm_mailing( async def confirm_mailing(
callback: CallbackQuery, callback: CallbackQuery,
button: Button, button: Button,
manager: DialogManager, manager: DialogManager,
): ):
print(manager.dialog_data["recipients"]) print(manager.dialog_data["recipients"])
users = list(await get_users( users = list(await get_users(
manager.middleware_data["session"], manager.middleware_data["session"],
exclude_admins=manager.dialog_data["recipients"] == "send_users", exclude_admins=manager.dialog_data["recipients"] == "send_users",
)) ))
await asyncio.gather( message = manager.dialog_data["message"]
*[ source_chat_id = message.chat.id
callback.bot.copy_message( source_message_id = message.message_id
success_count = 0
# Создаём задачу с обработкой ошибок для каждого пользователя
async def send_to_user(user):
nonlocal success_count
try:
await callback.bot.copy_message(
chat_id=user.tg_id, chat_id=user.tg_id,
from_chat_id=manager.dialog_data["message"].chat.id, from_chat_id=source_chat_id,
message_id=manager.dialog_data["message"].message_id, message_id=source_message_id,
) )
for user in users success_count += 1
] except Exception as e:
) logger.warning(
"не удалось отправить сообщение",
user_id=user.tg_id,
error=str(e),
exc_info=True, # добавит traceback
)
pass
await asyncio.gather(*[send_to_user(user) for user in users])
await callback.bot.send_message( await callback.bot.send_message(
chat_id=callback.from_user.id, chat_id=callback.from_user.id,
text=f"Разослано сообщений: {len(users)}", text=f"Рассылка завершена.\nУспешно отправлено: {success_count} из {len(users)}",
) )
await manager.done() await manager.done()

View File

@@ -104,7 +104,6 @@ async def update_event(
event.end_date = end_date event.end_date = end_date
await session.commit() await session.commit()
return event return event
<<<<<<< HEAD
async def register_user_to_event(session: AsyncSession, user_id: int, event_id: int): async def register_user_to_event(session: AsyncSession, user_id: int, event_id: int):
@@ -134,5 +133,3 @@ async def unregister_user_to_event(session: AsyncSession, user_id: int, event_id
).scalar_one() ).scalar_one()
user_event.status = UserEventStatus.CANCELLED.value user_event.status = UserEventStatus.CANCELLED.value
await session.commit() await session.commit()
=======
>>>>>>> 7e5939394de1e40064ccf364bcfabbbd117d5d32