import logging from uuid import UUID from sqlmodel import Session from app.job_server import celery_app from app.repositories.jira_site import jira_site_repo from app.writer.openai_writer import ticket_to_kb_issue_case from app.writer.common import ( jira_issue_to_support_ticket, create_confluence_page_for_kb_document, create_jira_instance_by_site, ) from app.models.kb_generate_task import KBGenerateConfig from app.repositories.kb_generate_task import kb_generate_task_repo from app.db import engine logger = logging.getLogger(__name__) @celery_app.task(bind=True, name="support_ticket_to_kb_issue_case_task") def ticket_to_kb_issue_case_task(self, task_id: UUID): with Session(engine) as session: task = kb_generate_task_repo.must_get(session, task_id) task_config = KBGenerateConfig.model_validate(task.config) jira_issue = task.jira_issue logger.info( f"Handling support_ticket_to_kb_issue_case task #{task_id} (jira_issue_key: {jira_issue.key})..." ) # Issue case to support ticket. support_ticket = jira_issue_to_support_ticket(jira_issue, task_config) kb_generate_task_repo.update_support_ticket(session, task, support_ticket) logger.info(f"Finished jira issue to support ticket for task #{task_id}.") # Support ticket to KB issue case. kb_issue_case = ticket_to_kb_issue_case( support_ticket=support_ticket, target_language=task_config.target_language ) kb_generate_task_repo.update_kb_issue_case(session, task, kb_issue_case) logger.info(f"Finished support ticket to kb issue case on task #{task_id}.") # Create confluence page. confluence_page = create_confluence_page_for_kb_document( session, kb_issue_case, task_config ) kb_generate_task_repo.update_confluence_page(session, task, confluence_page) logger.info(f"Created confluence page (guid: {confluence_page.guid}) for task #{task_id}.") # Update Jira Issue. jira_issue.kb_issue_case_link = confluence_page.link session.merge(jira_issue) session.commit() # Update the KB link to Jira. if task_config.kb_issue_case_link_field_key: site = jira_site_repo.must_get(session, jira_issue.site_id) jira = create_jira_instance_by_site(site) jira.update_issue_field( jira_issue.key, {task_config.kb_issue_case_link_field_key: confluence_page.link}, ) logger.info(f"Updated KB issue case link on jira issue {jira_issue.key}.") logger.debug(f"KB issue case document: \n{kb_issue_case.model_dump_json(indent=4)}") logger.info(f"Generated KB Link: {confluence_page.link}") logger.info(f"Task #{task_id} completed.")