diff --git a/service_desk/handlers.py b/service_desk/handlers.py index 5f2a5cc..49d077d 100644 --- a/service_desk/handlers.py +++ b/service_desk/handlers.py @@ -219,46 +219,46 @@ def _extract_attachments_from_content(content, is_attachment_type=False): async def _create_ticket_and_attach_files(user_id, msg_text, session, msg, login): """Логика генерации темы, отправки в SD и загрузки всех очередей вложений.""" session["step"] = "creating_ticket" - ad_user = await asyncio.to_thread(get_ad_user_sync, login) - sd_workflow_logger.info(f"👤 [AD Lookup] User: {login} -> Found: {ad_user is not None}") - sender_email = ad_user.get("mail") if ad_user else DEFAULT_REQUESTER - city = ad_user.get("city") if ad_user else "Кемерово" - subject = await generate_smart_subject(msg_text) - sd_workflow_logger.info(f"📝 [Subject Gen] Text: {msg_text[:50]}... -> Subject: {subject}") + ad_user = await asyncio.to_thread(get_ad_user_sync, login) + sd_workflow_logger.info(f"👤 [AD Lookup] User: {login} -> Found: {ad_user is not None}") + sender_email = ad_user.get("mail") if ad_user else DEFAULT_REQUESTER + city = ad_user.get("city") if ad_user else "Кемерово" + subject = await generate_smart_subject(msg_text) + sd_workflow_logger.info(f"📝 [Subject Gen] Text: {msg_text[:50]}... -> Subject: {subject}") + + ticket_id = await create_ticket_in_sd(sender_email, subject, msg_text, city) + sd_workflow_logger.info(f"🎫 [Ticket Created] ID: {ticket_id}") + + if ticket_id: + session["ticket_id"] = ticket_id - ticket_id = await create_ticket_in_sd(sender_email, subject, msg_text, city) - sd_workflow_logger.info(f"🎫 [Ticket Created] ID: {ticket_id}") + # 1. Загрузка основных вложений (накопленных до и во время таймаута) + queued_files = list(session.get("files_queue", [])) + if queued_files: + sd_workflow_logger.info(f"📎 [Upload] Uploading {len(queued_files)} file(s) to ticket #{ticket_id}") + for f in queued_files: + await process_and_upload_file(f['file_id'], f['file_name'], ticket_id) + sd_workflow_logger.info(f"✅ [Upload] All queued file(s) uploaded") - if ticket_id: - session["ticket_id"] = ticket_id - - # 1. Загрузка основных вложений (накопленных до и во время таймаута) - queued_files = list(session.get("files_queue", [])) - if queued_files: - sd_workflow_logger.info(f"📎 [Upload] Uploading {len(queued_files)} file(s) to ticket #{ticket_id}") - for f in queued_files: - await process_and_upload_file(f['file_id'], f['file_name'], ticket_id) - sd_workflow_logger.info(f"✅ [Upload] All queued file(s) uploaded") - - # 2. Загрузка вложений, прилетевших во время выполнения API-запросов (из "черной дыры") - post_files = list(session.get("post_create_queue", [])) - if post_files: - sd_workflow_logger.info(f"📎 [Upload Extra] Uploading {len(post_files)} late file(s) to ticket #{ticket_id}") - for f in post_files: - await process_and_upload_file(f['file_id'], f['file_name'], ticket_id) - - session["files_queue"] = [] - session["post_create_queue"] = [] - session["step"] = "ticket_created" - - await msg.answer( - sd_ticket_created(ticket_id, subject, msg_text), - parse_mode="html" - ) - log_menu_stats(user_id, "Service Desk", f"Создание заявки #{ticket_id}") - else: - session["step"] = "need_text" - await msg.answer(system_error_text(EMOJI_DIGITS), parse_mode="html") + # 2. Загрузка вложений, прилетевших во время выполнения API-запросов (из "черной дыры") + post_files = list(session.get("post_create_queue", [])) + if post_files: + sd_workflow_logger.info(f"📎 [Upload Extra] Uploading {len(post_files)} late file(s) to ticket #{ticket_id}") + for f in post_files: + await process_and_upload_file(f['file_id'], f['file_name'], ticket_id) + + session["files_queue"] = [] + session["post_create_queue"] = [] + session["step"] = "ticket_created" + + await msg.answer( + sd_ticket_created(ticket_id, subject, msg_text), + parse_mode="html" + ) + log_menu_stats(user_id, "Service Desk", f"Создание заявки #{ticket_id}") + else: + session["step"] = "need_text" + await msg.answer(system_error_text(EMOJI_DIGITS), parse_mode="html") async def _wait_for_attachments_and_create(user_id, session): """Фоновый таймер с возможностью отмены (Debounce)."""