refactor: move MediaGroupCollector to dishka DI instead of module-level dicts

This commit is contained in:
2026-07-15 00:48:31 +03:00
parent 53f30c923b
commit 05b4a79b40
2 changed files with 43 additions and 22 deletions
@@ -11,10 +11,6 @@ from aiogram_dialog.widgets.input import MessageInput
from dishka import FromDishka
from dishka.integrations.aiogram_dialog import inject
_media_group_photos: dict[tuple[int, str], list[str]] = {}
_media_group_remarks: dict[tuple[int, str], str] = {}
_media_group_counters: dict[tuple[int, str], int] = {}
from dutylog.application.bot.user_dialogs.states import AdminMenuSG
from dutylog.infrastructure.database.repositories.residents_repository import (
ResidentsRepository,
@@ -25,6 +21,7 @@ from dutylog.infrastructure.database.repositories.hours_transactions_repository
from dutylog.infrastructure.database.repositories.users_repository import (
UsersRepository,
)
from dutylog.infrastructure.ioc import MediaGroupCollector
async def on_add_hours_click(
@@ -103,25 +100,22 @@ async def on_custom_hours_input(
await message.answer("⚠️ Пожалуйста, введите корректное число")
@inject
async def on_add_hours_remark_input(
message: Message,
widget: MessageInput,
dialog_manager: DialogManager,
media_group_collector: FromDishka[MediaGroupCollector],
):
if message.media_group_id:
chat_id = message.chat.id
mgid = message.media_group_id
key = (chat_id, mgid)
_media_group_counters[key] = _media_group_counters.get(key, 0) + 1
my_count = _media_group_counters[key]
_media_group_photos.setdefault(key, []).append(message.photo[-1].file_id)
my_count = media_group_collector.add_photo(chat_id, mgid, message.photo[-1].file_id)
if message.caption and message.caption.strip():
_media_group_remarks[key] = message.caption.strip()
media_group_collector.set_remark(chat_id, mgid, message.caption.strip())
await asyncio.sleep(2.0)
if _media_group_counters.get(key, 0) == my_count:
remark = _media_group_remarks.pop(key, None)
file_ids = _media_group_photos.pop(key, [])
_media_group_counters.pop(key, None)
if media_group_collector.is_last(chat_id, mgid, my_count):
file_ids, remark = media_group_collector.pop(chat_id, mgid)
dialog_manager.dialog_data["hours_remark"] = remark
dialog_manager.dialog_data["photo_file_ids"] = file_ids
await dialog_manager.switch_to(AdminMenuSG.add_hours_confirm)
@@ -145,25 +139,22 @@ async def on_add_hours_remark_input(
await dialog_manager.switch_to(AdminMenuSG.add_hours_confirm)
@inject
async def on_remove_hours_remark_input(
message: Message,
widget: MessageInput,
dialog_manager: DialogManager,
media_group_collector: FromDishka[MediaGroupCollector],
):
if message.media_group_id:
chat_id = message.chat.id
mgid = message.media_group_id
key = (chat_id, mgid)
_media_group_counters[key] = _media_group_counters.get(key, 0) + 1
my_count = _media_group_counters[key]
_media_group_photos.setdefault(key, []).append(message.photo[-1].file_id)
my_count = media_group_collector.add_photo(chat_id, mgid, message.photo[-1].file_id)
if message.caption and message.caption.strip():
_media_group_remarks[key] = message.caption.strip()
media_group_collector.set_remark(chat_id, mgid, message.caption.strip())
await asyncio.sleep(2.0)
if _media_group_counters.get(key, 0) == my_count:
remark = _media_group_remarks.pop(key, None)
file_ids = _media_group_photos.pop(key, [])
_media_group_counters.pop(key, None)
if media_group_collector.is_last(chat_id, mgid, my_count):
file_ids, remark = media_group_collector.pop(chat_id, mgid)
dialog_manager.dialog_data["hours_remark"] = remark
dialog_manager.dialog_data["photo_file_ids"] = file_ids
await dialog_manager.switch_to(AdminMenuSG.remove_hours_confirm)
+30
View File
@@ -36,11 +36,41 @@ from dutylog.infrastructure.utils.config import Config, load_config
from dutylog.services.report_service import ReportService
class MediaGroupCollector:
def __init__(self) -> None:
self._photos: dict[tuple[int, str], list[str]] = {}
self._remarks: dict[tuple[int, str], str] = {}
self._counters: dict[tuple[int, str], int] = {}
def add_photo(self, chat_id: int, media_group_id: str, file_id: str) -> int:
key = (chat_id, media_group_id)
self._counters[key] = self._counters.get(key, 0) + 1
self._photos.setdefault(key, []).append(file_id)
return self._counters[key]
def set_remark(self, chat_id: int, media_group_id: str, remark: str) -> None:
self._remarks[(chat_id, media_group_id)] = remark
def is_last(self, chat_id: int, media_group_id: str, my_count: int) -> bool:
return self._counters.get((chat_id, media_group_id), 0) == my_count
def pop(self, chat_id: int, media_group_id: str) -> tuple[list[str], str | None]:
key = (chat_id, media_group_id)
file_ids = self._photos.pop(key, [])
remark = self._remarks.pop(key, None)
self._counters.pop(key, None)
return file_ids, remark
class ConfigProvider(Provider):
@provide(scope=Scope.APP)
def get_config(self) -> Config:
return load_config()
@provide(scope=Scope.APP)
def get_media_group_collector(self) -> MediaGroupCollector:
return MediaGroupCollector()
class DatabaseProvider(Provider):
@provide(scope=Scope.APP)