diff --git a/src/common/data_models/expression_data_model.py b/src/common/data_models/expression_data_model.py new file mode 100644 index 00000000..8b8a9e28 --- /dev/null +++ b/src/common/data_models/expression_data_model.py @@ -0,0 +1,89 @@ +from datetime import datetime +from typing import List, Optional, Literal + +import json + +from src.common.database.database_model import Expression + +from . import BaseDatabaseDataModel + + +class MaiExpression(BaseDatabaseDataModel[Expression]): + def __init__( + self, + item_id: int, + situation: str, + style: str, + context: str, + # up_content: str, + content: List[str], + count: int, + last_active_time: datetime, + create_time: datetime, + session_id: Optional[str] = None, + checked: bool = False, + rejected: bool = False, + modified_by: Optional[Literal["ai", "user"]] = None, + ): + self.item_id = item_id + """自增主键ID""" + self.situation = situation + """表达方式使用情景""" + self.style = style + """表达方式风格""" + self.context = context + """表达方式上下文""" + # self.up_content = up_content + self.content: List[str] = content + """内容列表""" + self.count: int = count + self.last_active_time: datetime = last_active_time or datetime.now() + self.create_time: datetime = create_time or datetime.now() + self.session_id: Optional[str] = session_id + + self.checked: bool = checked + """是否已经被检查过""" + self.rejected: bool = rejected + """是否被拒绝但是未更新""" + self.modified_by: Optional[Literal["ai", "user"]] = modified_by + """最后修改者,标记用户或AI,为空表示未检查""" + + @classmethod + def from_db_instance(cls, db_record: Expression): + content_list = json.loads(db_record.content_list) if db_record.content_list else [] + for item in content_list: + if not isinstance(item, str): + raise ValueError(f"Content item must be a string, got {type(item)}") + return cls( + item_id=db_record.id, # type: ignore + situation=db_record.situation, + style=db_record.style, + context=db_record.context, + content=content_list, + count=db_record.count, + last_active_time=db_record.last_active_time, + create_time=db_record.create_time, + session_id=db_record.session_id, + checked=db_record.checked, + rejected=db_record.rejected, + modified_by=db_record.modified_by, + ) + + def to_db_instance(self): + for item in self.content: + if not isinstance(item, str): + raise ValueError(f"Content item must be a string, got {type(item)}") + return Expression( + id=self.item_id, + situation=self.situation, + style=self.style, + context=self.context, + content_list=json.dumps(self.content), + count=self.count, + last_active_time=self.last_active_time, + create_time=self.create_time, + session_id=self.session_id, + checked=self.checked, + rejected=self.rejected, + modified_by=self.modified_by, + ) diff --git a/src/common/database/database_model.py b/src/common/database/database_model.py index bc03758e..112ce2bd 100644 --- a/src/common/database/database_model.py +++ b/src/common/database/database_model.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Optional, Literal from sqlalchemy import Column, Float, Enum as SQLEnum, DateTime from sqlmodel import SQLModel, Field, LargeBinary from enum import Enum @@ -171,7 +171,7 @@ class Expression(SQLModel, table=True): style: str = Field(index=True, max_length=255, primary_key=True) # 风格 context: str # 上下文 - up_content: str + # up_content: str content_list: str # 内容列表,JSON格式存储 count: int = Field(default=0) # 使用次数 @@ -181,6 +181,10 @@ class Expression(SQLModel, table=True): create_time: datetime = Field(default_factory=datetime.now, sa_column=Column(DateTime)) # 创建时间 session_id: Optional[str] = Field(default=None, max_length=255, nullable=True) # 会话ID,区分是否为全局表达方式 + checked: bool = Field(default=False) # 是否已经被检查过 + rejected: bool = Field(default=False) # 是否被拒绝但是未更新 + modified_by: Optional[Literal["ai", "user"]] = Field(default=None) # 最后修改者,标记用户或AI,为空表示未检查 + class Jargon(SQLModel, table=True): """存黑话的模型"""