diff --git a/app/handlers/orders.py b/app/handlers/orders.py index e00e39c..cbb44a6 100644 --- a/app/handlers/orders.py +++ b/app/handlers/orders.py @@ -1,25 +1,19 @@ -import asyncio import os -from pathlib import Path import re +from pathlib import Path from aiogram import Router, Bot, F -from aiogram.filters import CommandStart, Command +from aiogram.filters import Command from aiogram.types import Message, CallbackQuery, FSInputFile, InputMediaPhoto, InputMediaVideo, ReplyKeyboardRemove from aiogram.exceptions import AiogramError -from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.context import FSMContext - -from sqlalchemy import select, insert +from sqlalchemy import select from loguru import logger -from filters import IsAdmin -from keyboards import create_inline_kb, commands, button_create +from keyboards import create_inline_kb, button_create from database import async_session_, Order, Worker from FSM import SearchForm, OrderForm orders_router = Router() -# orders_router.message.filter() - order_operation_base = {"add_order_photo": "Добавить фото", "get_order_photo": "Получить фото", "get_order_components": "Получить список комплектующих", @@ -27,7 +21,7 @@ order_operation_base = {"add_order_photo": "Добавить фото", } order_operation_update = {"add_order_documentation": "Добавить документацию"} -order_main = {"find_orders": "Найти заказ"} +order_main = {"find_orders": "Найти заказ", "create_order": "Создать заказ"} order_main_update = {"create_order": "Создать заказ"} find_order_params = {"search_by_name": "Поиск по названию", "search_by_description": "Поиск по описанию ", @@ -36,9 +30,9 @@ find_order_params = {"search_by_name": "Поиск по названию", "sear @orders_router.message(Command(commands="orders")) async def orders_menu(message: Message): - order_main_upd = order_main_update if await IsAdmin()(message) else {} await message.answer(text="Доступные действия с заказами:", - reply_markup=create_inline_kb(width=1, **order_main, **order_main_upd)) + reply_markup=create_inline_kb(width=1, **order_main)) + await message.delete() @orders_router.callback_query(lambda x: x.data.startswith("create_order")) @@ -69,10 +63,6 @@ async def get_order_customer(callback: CallbackQuery, state: FSMContext): await state.set_state(OrderForm.customer) -# @orders_router.callback_query(OrderForm.counterparty) -# async def get_order_customer(message: Message, state: FSMContext): -# - @orders_router.message(OrderForm.customer) async def order_description(message: Message, state: FSMContext): await message.answer("Введите описание заказа в виде ключевых слов (АВР, ПСС, НКУ и т.д.) )") @@ -119,13 +109,18 @@ async def search_by_item(message: Message, state: FSMContext): selected_orders = result.scalars().all() if selected_orders: - await message.answer(text="Список найденных заказов: ", - reply_markup=create_inline_kb(width=1, **dict( - (f"show_order_{order.id}", f"Описание: {order.description or "Отсутствует"}" - f"Заказ: №{order.id}\n" - f"Заказчик: {order.customer}\n" - ) for order in - selected_orders))) + await message.answer(text="Список найденных заказов: ") + sent_messages = [] + for order in selected_orders: + sent_messages.append(await message.answer(text=f"Номер заказа: {order.id}\n" + f"Заказчик: {order.customer}\n" + f"Статус: {order.status_id}\n" + f"Дата отгрузки: {order.end_work}\n" + f"Дата создания: {order.created_at}\n" + f"Описание: {order.description}", + reply_markup=create_inline_kb(width=1, **{ + f"show_order_{order.id}": f"Заказ: №{order.id}"}))) + await state.update_data(sent_messages=sent_messages) await state.update_data(search_result=selected_orders) await state.set_state(SearchForm.search_result) else: @@ -133,8 +128,8 @@ async def search_by_item(message: Message, state: FSMContext): await state.clear() -@orders_router.callback_query(SearchForm.search_result) -async def show_order(callback: CallbackQuery, state: FSMContext): +@orders_router.callback_query(SearchForm.search_result and (lambda x: "show_order_" in x.data)) +async def show_order(callback: CallbackQuery, state: FSMContext, bot: Bot): order_id = int(re.search(r"(\d+)", callback.data).group()) try: @@ -145,7 +140,7 @@ async def show_order(callback: CallbackQuery, state: FSMContext): except Exception as err: logger.warning(err) - order_operation_upd = order_operation_update if await IsAdmin()(callback) else {} + order = next(filter(lambda item: order_id == item.id, await state.get_value("search_result")), None) if order: await callback.message.answer(text=f"Номер заказа: {order.id}\n" @@ -159,17 +154,18 @@ async def show_order(callback: CallbackQuery, state: FSMContext): (f"{clbk}_{order.id}", text) for clbk, text in order_operation_base.items())) ) - await callback.message.delete() - await state.clear() + for message in SearchForm.sent_messages: + await bot.delete_message(chat_id=callback.message.chat.id, message_id=message.message_id) + await state.clear() @orders_router.callback_query(lambda x: x.data.startswith("get_order_photo")) async def send_order_photos(callback: CallbackQuery, bot: Bot): order_id = callback.data.split("_")[-1] - media_item: Path media_group = [] - os.makedirs(Path(f"./photos/{order_id}/"), exist_ok=True) - media_path = Path(f"./photos/{order_id}/").iterdir() + order_photos_path = Path(f"/app/photos/{order_id}/") + os.makedirs(order_photos_path, exist_ok=True) + media_path = order_photos_path.iterdir() if not (media_item := next(media_path, None)): text = f"Фото по заказу \"{order_id}\" отсутствуют " else: @@ -177,7 +173,7 @@ async def send_order_photos(callback: CallbackQuery, bot: Bot): f"") await bot.send_message(chat_id=callback.from_user.id, text=text) while media_item or media_group: - if len(media_group) == 10 or (media_group and not media_item): + if len(media_group) == 10 or not media_item: await bot.send_media_group(chat_id=callback.from_user.id, media=media_group) media_group.clear() if media_item: @@ -188,8 +184,10 @@ async def send_order_photos(callback: CallbackQuery, bot: Bot): logger.error(f"Ошибка при обработке {media_path}: {err}") media_item = next(media_path, None) - await asyncio.sleep(600) - await callback.message.delete() + try: + await callback.message.delete() + except: + pass @orders_router.callback_query(lambda x: x.data.startswith("add_order_photo")) @@ -204,7 +202,7 @@ async def reply_for_photo(callback: CallbackQuery, bot: Bot): F.reply_to_message) async def add_order_photo(message: Message, bot: Bot): order_id = re.search(r"(\d+)", message.reply_to_message.text).group() - order_photos_path = f"/app/photos/{order_id}/" + order_photos_path = Path(f"/app/photos/{order_id}/") os.makedirs(order_photos_path, exist_ok=True) item = message.video or message.photo[-1]