Untitled

 avatar
4ae4d
plain_text
14 days ago
4.7 kB
4
Indexable
from dialog_bot_sdk.entities.messaging import UpdateInteractiveMediaEvent, UpdateMessage
from dialog_bot_sdk.interactive_media import Button

from core.bot_kit.fsm import FSMContext, State, StatesGroup
from core.bot_kit.router import Router
from core.config import bot
from core.handlers.projects_ui import send_project_card
from core.handlers.request import build_request_actions_keyboard
from core.handlers.validators import EventValidationError, validate_title
from core.markups import back_to_moderation_keyboard, format_request_details
from core.schemas import UserSchema
from core.services import ProjectService, RequestService, TerbankService
from core.utils import delete_prev_message, delete_prev_message_by_peer, logger

from .moderation_common import _msg_err_create, send_tb_select_menu

create_project_rt = Router()


class ProjectCreateState(StatesGroup):
    title = State()
    terbank = State()


@bot.di
def create_project_start_handler(event: UpdateInteractiveMediaEvent, context: FSMContext):
    delete_prev_message_by_peer(bot, event.peer)
    context.clear()

    bot.messaging.send_message(
        peer=event.peer,
        text="Создание проекта.\n\nШаг 1/2: введи, пожалуйста, название проекта:",
        interactive_media_groups=back_to_moderation_keyboard(),
    )
    context.set_state(ProjectCreateState.title)


@create_project_rt.message(state=ProjectCreateState.title)
@bot.di
def project_create_title_step(
    message: UpdateMessage,
    context: FSMContext,
    terbank_service: TerbankService,
):
    delete_prev_message(bot, message)

    try:
        title = validate_title(message.message.text_message.text.strip())
    except EventValidationError as e:
        _msg_err_create(message, e)
        return

    context.update_data({"project_name": title})

    send_tb_select_menu(
        peer=message.peer,
        terbank_service=terbank_service,
        context=context,
        is_edit=False,
        next_state=ProjectCreateState.terbank,
        title="Шаг 2/2: выбери, пожалуйста, ТБ:",
        create_footer_buttons=[
            Button(media_id="moderation", value="", label="⬅️ В мастерскую"),
        ],
    )


@bot.di
def project_tb_approved_handler(
    event: UpdateInteractiveMediaEvent,
    context: FSMContext,
    project_service: ProjectService,
    request_service: RequestService,
    user: UserSchema,
):
    delete_prev_message_by_peer(bot, event.peer)

    data = context.get_data() or {}
    terbank_id = str(data.get("tb_id") or "").strip()

    if not terbank_id:
        bot.messaging.send_message(
            peer=event.peer,
            text="⚠️ Сначала выбери ТБ.",
            interactive_media_groups=back_to_moderation_keyboard(),
        )
        context.set_state(ProjectCreateState.terbank)
        return

    context.update_data({"terbank_id": terbank_id})
    data = context.get_data() or {}

    try:
        created = project_service.create_from_wizard(data, event.peer)
    except Exception as e:
        logger.error("Error while creating project: %s", e)
        bot.messaging.send_message(
            peer=event.peer,
            text="⚠️ Произошла ошибка при создании проекта.",
            interactive_media_groups=back_to_moderation_keyboard(),
        )
        context.clear()
        return

    context.clear()

    note = {
        "REQUEST": "✅ Заявка на создание проекта успешно создана.",
        "COMPLETELY": "✅ Проект создан.",
    }.get(created.get("TYPE", ""), "⚠️ Ошибка создания проекта.")

    project_id = str(created.get("project_id") or "")
    request_id = str(created.get("request_id") or "")

    if created.get("TYPE") == "COMPLETELY" and project_id:
        send_project_card(
            event.peer,
            project_id=project_id,
            project_service=project_service,
            user=user,
            ctx_name="projects",
            note=note,
        )
        return

    if created.get("TYPE") == "REQUEST" and request_id:
        req = request_service.get_request_by_id(request_id, str(event.peer.id))
        if req:
            bot.messaging.send_message(
                peer=event.peer,
                text=f"{note}\n\n{format_request_details(req)}",
                interactive_media_groups=build_request_actions_keyboard(req, ctx_name="moderation"),
            )
            return

    bot.messaging.send_message(
        peer=event.peer,
        text=note,
        interactive_media_groups=back_to_moderation_keyboard(),
    )
Editor is loading...
Leave a Comment