Initial MVP for QA asset backend
This commit is contained in:
255
hy_qa_asset_backend/backend/app/schemas.py
Normal file
255
hy_qa_asset_backend/backend/app/schemas.py
Normal file
@@ -0,0 +1,255 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import date as DateType, datetime as DateTime
|
||||
from typing import Any
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class ORMModel(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True, use_enum_values=True)
|
||||
|
||||
|
||||
class UserRead(ORMModel):
|
||||
id: int
|
||||
name: str
|
||||
email: str
|
||||
role: str
|
||||
created_at: DateTime
|
||||
updated_at: DateTime
|
||||
|
||||
|
||||
class FeishuSessionBase(BaseModel):
|
||||
title: str
|
||||
date: DateType | None = None
|
||||
teachers: str | None = None
|
||||
feishu_doc_url: str | None = None
|
||||
feishu_record_id: str | None = None
|
||||
source_file_name: str | None = None
|
||||
source_text: str | None = None
|
||||
|
||||
|
||||
class FeishuSessionCreate(FeishuSessionBase):
|
||||
session_code: str | None = None
|
||||
|
||||
|
||||
class FeishuSessionUpdate(BaseModel):
|
||||
title: str | None = None
|
||||
date: DateType | None = None
|
||||
teachers: str | None = None
|
||||
feishu_doc_url: str | None = None
|
||||
source_file_name: str | None = None
|
||||
source_text: str | None = None
|
||||
process_status: str | None = None
|
||||
failed_reason: str | None = None
|
||||
|
||||
|
||||
class FeishuSessionRead(ORMModel):
|
||||
id: int
|
||||
session_code: str
|
||||
title: str
|
||||
date: DateType | None
|
||||
teachers: str | None
|
||||
feishu_doc_url: str | None
|
||||
feishu_record_id: str | None
|
||||
source_file_name: str | None
|
||||
source_text: str | None
|
||||
process_status: str
|
||||
qa_count: int
|
||||
pending_review_count: int
|
||||
approved_count: int
|
||||
standard_qa_count: int
|
||||
failed_reason: str | None
|
||||
created_at: DateTime
|
||||
updated_at: DateTime
|
||||
|
||||
|
||||
class RawQAItemUpdate(BaseModel):
|
||||
normalized_question: str | None = None
|
||||
normalized_answer: str | None = None
|
||||
suggested_standard_question: str | None = None
|
||||
suggested_standard_answer: str | None = None
|
||||
answer_person: str | None = None
|
||||
primary_topic: str | None = None
|
||||
problem_tags: list[str] | None = None
|
||||
course_stage: str | None = None
|
||||
audience_tags: list[str] | None = None
|
||||
emotion_intensity: str | None = None
|
||||
risk_level: str | None = None
|
||||
risk_types: list[str] | None = None
|
||||
risk_notes: str | None = None
|
||||
need_desensitization: bool | None = None
|
||||
desensitization_status: str | None = None
|
||||
review_status: str | None = None
|
||||
review_notes: str | None = None
|
||||
suggested_to_standard_qa: bool | None = None
|
||||
|
||||
|
||||
class ReviewActionRequest(BaseModel):
|
||||
reviewer_id: int | None = None
|
||||
comment: str | None = None
|
||||
|
||||
|
||||
class RawQAItemRead(ORMModel):
|
||||
id: int
|
||||
session_id: int
|
||||
qa_code: str
|
||||
raw_question: str
|
||||
normalized_question: str | None
|
||||
raw_answer: str
|
||||
normalized_answer: str | None
|
||||
suggested_standard_question: str | None
|
||||
suggested_standard_answer: str | None
|
||||
answer_person: str | None
|
||||
primary_topic: str
|
||||
problem_tags: list[str]
|
||||
course_stage: str
|
||||
audience_tags: list[str]
|
||||
emotion_intensity: str | None
|
||||
risk_level: str
|
||||
risk_types: list[str]
|
||||
risk_notes: str | None
|
||||
need_desensitization: bool
|
||||
desensitization_status: str
|
||||
review_status: str
|
||||
reviewer_id: int | None
|
||||
review_notes: str | None
|
||||
suggested_to_standard_qa: bool
|
||||
source_timestamp: str | None
|
||||
created_at: DateTime
|
||||
updated_at: DateTime
|
||||
|
||||
|
||||
class StandardQAUpdate(BaseModel):
|
||||
standard_question: str | None = None
|
||||
standard_answer: str | None = None
|
||||
similar_questions: list[str] | None = None
|
||||
primary_topic: str | None = None
|
||||
problem_tags: list[str] | None = None
|
||||
course_stage: str | None = None
|
||||
audience_tags: list[str] | None = None
|
||||
answer_boundary: str | None = None
|
||||
forbidden_expressions: list[str] | None = None
|
||||
risk_level: str | None = None
|
||||
audit_status: str | None = None
|
||||
call_status: str | None = None
|
||||
disabled_reason: str | None = None
|
||||
|
||||
|
||||
class StandardQARead(ORMModel):
|
||||
id: int
|
||||
standard_code: str
|
||||
source_raw_qa_id: int
|
||||
session_id: int
|
||||
standard_question: str
|
||||
standard_answer: str
|
||||
similar_questions: list[str]
|
||||
primary_topic: str
|
||||
problem_tags: list[str]
|
||||
course_stage: str
|
||||
audience_tags: list[str]
|
||||
answer_boundary: str | None
|
||||
forbidden_expressions: list[str]
|
||||
risk_level: str
|
||||
audit_status: str
|
||||
call_status: str
|
||||
last_reviewer_id: int | None
|
||||
disabled_reason: str | None
|
||||
created_at: DateTime
|
||||
updated_at: DateTime
|
||||
|
||||
|
||||
class CallableQARead(ORMModel):
|
||||
id: int
|
||||
standard_code: str
|
||||
standard_question: str
|
||||
standard_answer: str
|
||||
similar_questions: list[str]
|
||||
primary_topic: str
|
||||
problem_tags: list[str]
|
||||
course_stage: str
|
||||
audience_tags: list[str]
|
||||
answer_boundary: str | None
|
||||
forbidden_expressions: list[str]
|
||||
source_raw_qa_id: int
|
||||
session_id: int
|
||||
|
||||
|
||||
class TaskRunRead(ORMModel):
|
||||
id: int
|
||||
task_type: str
|
||||
task_status: str
|
||||
started_at: DateTime | None
|
||||
ended_at: DateTime | None
|
||||
sessions_scanned: int
|
||||
sessions_processed: int
|
||||
qa_created: int
|
||||
qa_failed: int
|
||||
error_message: str | None
|
||||
retry_count: int
|
||||
created_at: DateTime
|
||||
|
||||
|
||||
class AuditLogRead(ORMModel):
|
||||
id: int
|
||||
user_id: int | None
|
||||
target_type: str
|
||||
target_id: int
|
||||
action: str
|
||||
before_status: str | None
|
||||
after_status: str | None
|
||||
comment: str | None
|
||||
created_at: DateTime
|
||||
|
||||
|
||||
class DashboardSummary(BaseModel):
|
||||
total_sessions: int
|
||||
processed_sessions: int
|
||||
pending_review_count: int
|
||||
high_risk_count: int
|
||||
approved_qa_count: int
|
||||
standard_qa_count: int
|
||||
callable_qa_count: int
|
||||
last_task_status: str | None
|
||||
last_task_time: DateTime | None
|
||||
last_task_error: str | None
|
||||
|
||||
|
||||
class SafeSettingsRead(BaseModel):
|
||||
feishu_configured: bool
|
||||
openai_configured: bool
|
||||
model_name: str
|
||||
schedule_cron: str
|
||||
schedule_timezone: str
|
||||
mock_mode: bool
|
||||
database_url: str = Field(description="敏感连接串不原样返回,仅返回驱动类型")
|
||||
feishu_tables_configured: dict[str, bool]
|
||||
system_settings: list[dict[str, Any]]
|
||||
|
||||
|
||||
class SettingsPatch(BaseModel):
|
||||
settings: dict[str, str]
|
||||
|
||||
|
||||
class FeishuStatus(BaseModel):
|
||||
configured: bool
|
||||
mock_mode: bool
|
||||
app_token_configured: bool
|
||||
wiki_node_token_configured: bool = False
|
||||
table_ids: dict[str, bool]
|
||||
token_ok: bool
|
||||
message: str
|
||||
|
||||
|
||||
class FeishuTableTemplate(BaseModel):
|
||||
table_key: str
|
||||
table_name: str
|
||||
env_name: str
|
||||
required_fields: list[str]
|
||||
|
||||
|
||||
class FeishuSetupGuide(BaseModel):
|
||||
required_env: list[str]
|
||||
required_permissions: list[str]
|
||||
tables: list[FeishuTableTemplate]
|
||||
notes: list[str]
|
||||
Reference in New Issue
Block a user