ааа

2024-08-12 17:46 | Публичная
from idlelib import query
from sqlite3 import IntegrityError
from turtle import pd
from typing import Union

from aiogram import Dispatcher, F, types
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.types import Message, CallbackQuery
from aiogram.utils.markdown import hbold
import os
import pandas as pd

from bot.constants import SAVE_PATH
from bot.core_bot import Form, add_region_to_database, disable_buttons
from bot.decorators import user_permission
from bot.keyboards.inline_keyboard import RetailerKeyboards, CancelActionCallback, RetailerCallback, SalesDataKeyboards
from data_management_app.data_manager import SalesDataUploader


async def return_to_main_menu(event: Union[Message, CallbackQuery], message_text: str, state: FSMContext=None):
    if state:
        await state.clear()

    keyboard = RetailerKeyboards().create_main_keyboard()

    if isinstance(event, CallbackQuery):
        await event.message.edit_reply_markup(reply_markup=disable_buttons(event.message.reply_markup))
        await event.message.answer(
            text=message_text,
            reply_markup=keyboard
        )
    elif isinstance(event, Message):
        # await event.message.edit_reply_markup(reply_markup=disable_buttons(event.message.reply_markup))
        await event.answer(
            text=message_text,
            reply_markup=keyboard
        )
    else:
        raise ValueError("Unsupported event type passed to return_to_main_menu.")


class GeneralControlHandler:
    def __init__(self, dp: Dispatcher):
        self.dp = dp
        self.register_handlers()


    def register_handlers(self):
        @self.dp.message(Command("activate_menu"))
        @user_permission
        async def activate_menu(message: Message) -> None:
            """Handler for showing retailers"""
            main_keyboard = RetailerKeyboards().create_main_keyboard()
            await message.answer(
                "Главное меню",
                reply_markup=main_keyboard
            )

        @self.dp.callback_query(CancelActionCallback.filter(F.foo == 'cancel_action'))
        async def command_cancel_action(
                query: CallbackQuery,
                state: FSMContext,
        ):
            await return_to_main_menu(query, message_text='Действие отменено. Возвращение в главное меню:', state=state)

        @self.dp.message(Command("id"))
        async def command_id(message: types.Message) -> None:
            """
            This handler receives messages with `/id` command
            """
            if message.chat.id == message.from_user.id:
                response_text = f"Ваш id: {hbold(message.from_user.id)}"
            else:
                response_text = (
                    f"ID Группы: {hbold(message.chat.id)}\n"
                    f"Ваш id: {hbold(message.from_user.id)}"
                )

            await message.answer(text=response_text, parse_mode='HTML')

        @self.dp.callback_query(RetailerCallback.filter(F.foo == 'remove_data_menu'))
        @user_permission
        async def command_remove_data_menu(
                query: CallbackQuery,
                state: FSMContext,
        ):
            message = "Добро пожаловать в меню удаления данных"
            keyboard = SalesDataKeyboards().delete_data_keyboard()
            await query.message.edit_text(
                text=message,
                reply_markup=keyboard
            )

        @self.dp.callback_query(RetailerCallback.filter(F.foo == 'download_data_menu'))
        @user_permission
        async def command_download_data_menu(
                query: CallbackQuery,
                state: FSMContext,
        ):
            message = "Добро пожаловать в меню выгрузки данных!"
            keyboard = SalesDataKeyboards().unload_data_keyboard()
            await query.message.edit_text(
                text=message,
                reply_markup=keyboard
            )

        @self.dp.callback_query(RetailerCallback.filter(F.foo == 'upload_specification'))
        @user_permission
        async def uploading_specification(
                query: CallbackQuery,
                state: FSMContext
        ) -> None:
            await query.message.edit_reply_markup(reply_markup=None)
            await query.message.answer("Пожалуйста загрузите спецификацию!")
            await state.set_state(Form.uploading_specification)


        @self.dp.message(Form.uploading_specification)
        @user_permission
        async def handle_document(message: Message, state: FSMContext):
            file_path = None
            try:
                document = message.document
                if not document.file_name.endswith(('.xls', '.xlsx')):
                    await message.answer(
                        "Формат файла не соответствует Excel. Проверьте, что отправили правильный формат.")
                    await return_to_main_menu(message, "Возвращение в главное меню:", state=state)
                    return

                bot = message.bot
                file_id = message.document.file_id
                file = await bot.get_file(file_id)
                file_path = f'databases/specification.xls'

                await bot.download_file(file.file_path, destination=file_path)

                await message.answer(
                    text=f"Загрузка спецификации прошла успешно!",
                    parse_mode='HTML'
                )

            except Exception as e:
                await message.answer(f"Произошла непредвиденная ошибка: {e}")
                if file_path and os.path.isfile(file_path):
                    try:
                        os.remove(file_path)
                        print(f"File {file_path} successfully deleted.")
                    except Exception as e:
                        print(f"Error deleting file {file_path}: {e}")
            finally:
                await return_to_main_menu(message, message_text='Главное меню.', state=state)
Вернуться ко Всем Вставкам
Открыть чат
Чат с Send-Code AI Закрыть чат