import logging from sqlmodel import Session from app.db import engine from app.models.jira_site import JiraSiteConfig from app.repositories.jira_site import jira_site_repo from app.writer.common import load_jira_issue from app.repositories.kb_generate_task import kb_generate_task_repo from app.tasks.ticket_to_kb_issue_case import ticket_to_kb_issue_case_task logger = logging.getLogger(__name__) def create_ticket_to_kb_issue_case_task( site_id_or_host: int or str, issue_key: str, async_task: bool = True, check_issue: bool = True, ): logger.info(f"Creating write_issue_case task for jira issue #{issue_key}") with Session(engine) as session: # Load jira site. if isinstance(site_id_or_host, int): site = jira_site_repo.must_get(session, site_id_or_host) assert site is not None site_id = site.id logger.info(f"Found jira site {site.host} by id") else: site = jira_site_repo.must_get_by_host(session, site_id_or_host) assert site is not None site_id = site.id logger.info(f"Found jira site {site.host} by host") # Loaded Jira issue. site_config = JiraSiteConfig.model_validate(site.config) jira_issue = load_jira_issue(session, site_id, issue_key, site_config) logger.info( f"Loaded jira issue {issue_key} from {jira_issue.link} (guid: {jira_issue.guid})" ) if check_issue: # Check KB Feedback kb_feedback = jira_issue.fields[site_config.kb_feedback_field_key] if not kb_feedback: logger.info(f"Issue {issue_key} doesn't not have kb feedback, skip.") return if kb_feedback["value"] != "现象明确,需要KB": logger.info(f"Issue {issue_key} doesn't need KB, skip.") return # Check if exists generated KB Link. kb_link = jira_issue.fields[site_config.kb_issue_case_link_field_key] if kb_link: logger.info( f"Issue {issue_key} has generated KB link (link: {kb_link}), skip." ) return # TODO: check if exists task # Create Task. task = kb_generate_task_repo.create_task(session, jira_issue) logger.info( f"Created ticket_to_issue_case task #{task.id} for jira issue {jira_issue.key}" ) if async_task: ticket_to_kb_issue_case_task.apply_async(task_id=task.id, args=[task.id]) logger.info(f"Triggered async ticket_to_issue_case task #{task.id}") else: ticket_to_kb_issue_case_task(task_id=task.id) logger.info(f"Triggered sync ticket_to_issue_case task #{task.id}")