diff --git a/repos/assets_repo.py b/repos/assets_repo.py index 58d45e0..7a284b6 100644 --- a/repos/assets_repo.py +++ b/repos/assets_repo.py @@ -27,8 +27,8 @@ class AssetsRepo: return assets - async def get_asset(self, asset_id: str) -> Asset: - res = await self.collection.find_one({"_id": ObjectId(asset_id)}) + async def get_asset(self, asset_id: str, with_data: bool = True) -> Asset: + res = await self.collection.find_one({"_id": ObjectId(asset_id)}, {"data": 0 if not with_data else 1}) res["id"] = str(res.pop("_id")) return Asset(**res) diff --git a/routers/assets_router.py b/routers/assets_router.py index 9ab7e5e..e773e8e 100644 --- a/routers/assets_router.py +++ b/routers/assets_router.py @@ -1,6 +1,7 @@ -from aiogram import Router +from aiogram import Router, F from aiogram.filters import Command -from aiogram.types import Message, InputMediaPhoto, InputMedia, BufferedInputFile +from aiogram.types import Message, InputMediaPhoto, InputMedia, BufferedInputFile, InlineKeyboardButton, CallbackQuery, \ + InlineKeyboardMarkup from repos.dao import DAO @@ -11,7 +12,8 @@ router = Router() async def assets_command(msg: Message, dao: DAO): assets = await dao.assets.get_assets(limit=10, offset=0) media_group = [] - for asset in assets: + keyboard = [] + for index, asset in enumerate(assets): if asset.tg_photo_file_id: media_group.append(InputMediaPhoto(media=asset.tg_photo_file_id)) elif asset.tg_doc_file_id: @@ -19,8 +21,26 @@ async def assets_command(msg: Message, dao: DAO): media_group.append(InputMediaPhoto(media=BufferedInputFile(asset_full_info.data, asset_full_info.name))) else: continue - mg = await msg.answer_media_group(media_group) + keyboard.append(InlineKeyboardButton(text=F"{index + 1}", callback_data=f"asset_doc_{asset.id}")) + mg = await msg.answer_media_group(media_group, + reply_markup=InlineKeyboardMarkup(inline_keyboard=[keyboard])) + await msg.answer("Для запроса документов выбери фото и на кнопку ниже:", + reply_markup=InlineKeyboardMarkup(inline_keyboard=[keyboard])) for media_index, media in enumerate(mg): if assets[media_index].tg_photo_file_id is None: assets[media_index].tg_photo_file_id = media.photo[-1].file_id await dao.assets.update_asset(assets[media_index].id, assets[media_index]) + + +@router.callback_query(F.data.startswith("asset_doc_")) +async def assets_callback_query(call: CallbackQuery, dao: DAO): + await call.answer() + assets_id = call.data.split("asset_doc_")[-1] + asset = await dao.assets.get_asset(assets_id, with_data=False) + if asset.tg_doc_file_id: + await call.message.answer_document(asset.tg_doc_file_id) + else: + asset_full_info = await dao.assets.get_asset(assets_id) + doc = await call.message.answer_document(BufferedInputFile(asset_full_info.data, asset_full_info.name)) + asset_full_info.tg_doc_file_id = doc.document.file_id + await dao.assets.update_asset(assets_id, asset_full_info)