import uuid from datetime import datetime from typing import Optional from uuid import UUID from pydantic import BaseModel from sqlalchemy import DateTime, func, Column, Text, JSON from sqlmodel import Field, Relationship, SQLModel from app.writer.prompt import TargetLanguage from app.models.confluence_page import ConfluencePage from app.models.kb_issue_case import KBIssueCase from app.models.support_ticket import SupportTicket class KBDocumentCreateConfig(BaseModel): target_confluence_site_id: int target_confluence_space_id: str target_confluence_parent_page_id: str target_language: Optional[TargetLanguage] = None class SupportTicketFieldsConfig(BaseModel): root_cause_field_key: Optional[str] = None solution_field_key: Optional[str] = None workaround_field_key: Optional[str] = None kb_feedback_field_key: Optional[str] = None kb_issue_case_link_field_key: Optional[str] = None class KBGenerateConfig(SupportTicketFieldsConfig, KBDocumentCreateConfig): pass class KBGenerateTask(SQLModel, table=True): __tablename__ = "kb_generate_tasks" id: UUID = Field(primary_key=True, default_factory=uuid.uuid4) config: dict = Field(sa_column=Column(JSON, nullable=False)) jira_issue_guid: str = Field( nullable=False, max_length=32, foreign_key="jira_issues.guid" ) jira_issue: "JiraIssue" = Relationship( sa_relationship_kwargs={ "lazy": "joined", "primaryjoin": "KBGenerateTask.jira_issue_guid == JiraIssue.guid", }, ) support_ticket: Optional["SupportTicket"] = Field(sa_column=Column(JSON)) kb_issue_case: Optional["KBIssueCase"] = Field(sa_column=Column(JSON)) confluence_page_guid: Optional[str] = Field( max_length=32, foreign_key="confluence_pages.guid" ) confluence_page: "ConfluencePage" = Relationship( sa_relationship_kwargs={ "lazy": "joined", "primaryjoin": "KBGenerateTask.confluence_page_guid == ConfluencePage.guid", }, ) result: Optional[str] = Field(sa_column=Column(Text)) trace_link: Optional[str] = Field(max_length=512) created_at: Optional[datetime] = Field( sa_column=Column(DateTime, server_default=func.now()) ) started_at: Optional[datetime] = Field(sa_column=Column(DateTime)) ended_at: Optional[datetime] = Field(sa_column=Column(DateTime))