Untitled
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