ai_meeting.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import enum
  2. import json
  3. import time
  4. from datetime import datetime
  5. from app.models.db import Base
  6. from sqlalchemy import Column, Integer, String, DateTime, Enum, text, TEXT
  7. from pydantic import BaseModel
  8. from app.errors.base import ParamsError
  9. class AIMeetingStatus(enum.Enum):
  10. UNKNOW = 0
  11. CREATED = 1
  12. RECRODING = 2
  13. PROCESSING = 3
  14. FINISHED = 4
  15. FAILED = 5
  16. class AIMeeting(Base):
  17. __tablename__ = "ai_meeting"
  18. id = Column("id", String(36), primary_key=True)
  19. name = Column("name", String(255), nullable=False, default="")
  20. description = Column(
  21. "description", String(255), nullable=False, default=""
  22. )
  23. status = Column(
  24. "status", Enum(AIMeetingStatus), nullable=False, default=AIMeetingStatus.UNKNOW
  25. )
  26. duration = Column("duration", Integer, nullable=False, default=0)
  27. file_url = Column("file_url", String(255), nullable=False, default="")
  28. content = Column("content", TEXT, default="")
  29. view_content = Column("view_content", TEXT, default=json.dumps([]))
  30. asr_task_id = Column("asr_task_id", String(36), nullable=False, default="")
  31. created_time = Column("created_time", Integer, default=int(time.time()))
  32. created_at = Column(
  33. "created_at",
  34. DateTime(timezone=True),
  35. nullable=False,
  36. default=datetime.now,
  37. server_default=text("CURRENT_TIMESTAMP"),
  38. index=True
  39. )
  40. updated_at = Column(
  41. "updated_at",
  42. DateTime(timezone=True),
  43. nullable=False,
  44. default=datetime.now,
  45. server_default=text("CURRENT_TIMESTAMP"),
  46. onupdate=datetime.now,
  47. server_onupdate=text("CURRENT_TIMESTAMP"),
  48. )
  49. def to_dict(self):
  50. return {
  51. 'id': self.id,
  52. 'name': self.name,
  53. 'description': self.description,
  54. 'status': self.status,
  55. 'duration': self.duration,
  56. 'file_url': self.file_url,
  57. 'view_content': json.loads(self.view_content) if self.view_content else [],
  58. 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  59. 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'),
  60. }
  61. def to_list_dict(self):
  62. return {
  63. 'id': self.id,
  64. 'name': self.name,
  65. 'description': self.description,
  66. 'status': self.status,
  67. 'duration': self.duration,
  68. 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  69. 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'),
  70. }
  71. class AIMeetingModel(BaseModel):
  72. id: str = ""
  73. name: str = ""
  74. description: str = ""
  75. status: AIMeetingStatus = 0
  76. duration: float = 0
  77. file_url: str = ""
  78. asr_task_id: str = ""
  79. content: dict = {}
  80. view_content: str= ""
  81. replace_word: list = []
  82. def get_create(self):
  83. if not self.name:
  84. self.name = datetime.now().strftime("%Y年%m月%d日会议")
  85. return self
  86. else:
  87. return self
  88. def get_create_offline(self):
  89. if not self.file_url or not self.duration:
  90. raise ParamsError(message="Required parameters are missing: file_url")
  91. if not self.name:
  92. self.name = datetime.now().strftime("%Y年%m月%d日会议")
  93. return self
  94. else:
  95. return self
  96. def get_update(self):
  97. if self.id and (self.name or self.description or self.status or self.duration or self.file_url or self.asr_task_id):
  98. return self
  99. else:
  100. raise ParamsError(message="ID and at least one of name, description, status, duration, file URL, or ASR task ID can't be empty")
  101. def get_delete(self):
  102. if self.id:
  103. return self
  104. else:
  105. raise ParamsError(message="ID can't be empty")
  106. class AIMeetingRecord(Base):
  107. __tablename__ = "ai_meeting_record"
  108. id = Column("id", Integer, primary_key=True, autoincrement=True)
  109. meeting_id = Column("meeting_id", Integer, nullable=False, default=0, index=True)
  110. name = Column("name", String(255), nullable=False, default="")
  111. content = Column("content", TEXT, default="")
  112. view_content = Column("view_content", TEXT, default="")
  113. created_at = Column(
  114. "created_at",
  115. DateTime(timezone=True),
  116. nullable=False,
  117. default=datetime.now,
  118. server_default=text("CURRENT_TIMESTAMP"),
  119. )
  120. updated_at = Column(
  121. "updated_at",
  122. DateTime(timezone=True),
  123. nullable=False,
  124. default=datetime.now,
  125. server_default=text("CURRENT_TIMESTAMP"),
  126. onupdate=datetime.now,
  127. server_onupdate=text("CURRENT_TIMESTAMP"),
  128. )
  129. class AIMeetingRecordModel(BaseModel):
  130. id: int = 0
  131. meeting_id: int = 0
  132. name: str = ""
  133. content: str = ""
  134. view_content: str = ""
  135. order: int = 0
  136. def get_create(self):
  137. if self.meeting_id and self.name and self.content and self.view_content and self.order:
  138. return self
  139. else:
  140. raise ParamsError(message="Meeting ID, name, content, view content, and order can't be empty")
  141. def get_update(self):
  142. if self.id and (self.name or self.content or self.view_content or self.order):
  143. return self
  144. else:
  145. raise ParamsError(message="ID and at least one of name, content, view content, or order can't be empty")
  146. def get_delete(self):
  147. if self.id:
  148. return self
  149. else:
  150. raise ParamsError(message="ID can't be empty")
  151. class AIMeetingMinutesTemplate(Base):
  152. __tablename__ = "ai_meeting_minutes_template"
  153. id = Column("id", Integer, primary_key=True, autoincrement=True)
  154. name = Column("name", String(255), nullable=False, default="")
  155. content = Column("content", String(4000), nullable=False, default="")
  156. description = Column("description", String(255), nullable=False, default="")
  157. icon_url = Column("icon_url", String(255), nullable=False, default="")
  158. created_at = Column(
  159. "created_at",
  160. DateTime(timezone=True),
  161. nullable=False,
  162. default=datetime.now,
  163. server_default=text("CURRENT_TIMESTAMP"),
  164. )
  165. updated_at = Column(
  166. "updated_at",
  167. DateTime(timezone=True),
  168. nullable=False,
  169. default=datetime.now,
  170. server_default=text("CURRENT_TIMESTAMP"),
  171. onupdate=datetime.now,
  172. server_onupdate=text("CURRENT_TIMESTAMP"),
  173. )
  174. class AIMeetingMinutesTemplateModel(BaseModel):
  175. id: int = 0
  176. name: str = ""
  177. content: str = ""
  178. description: str = ""
  179. icon_url: str = ""
  180. def get_create(self):
  181. if self.name and self.content:
  182. return self
  183. else:
  184. raise ParamsError(message="Name and content can't be empty")
  185. def get_update(self):
  186. if self.id and (self.name or self.content or self.description or self.icon_url):
  187. return self
  188. else:
  189. raise ParamsError(message="ID and at least one of name, content, description, or icon URL can't be empty")
  190. def get_delete(self):
  191. if self.id:
  192. return self
  193. else:
  194. raise ParamsError(message="ID can't be empty")
  195. class AIMeetingSpeakModel(BaseModel):
  196. content: str = ""
  197. def get_create(self):
  198. if self.content:
  199. return self
  200. else:
  201. raise ParamsError(message="Content can't be empty")
  202. class AIMeetingUser(Base):
  203. __tablename__ = "ai_meeting_user"
  204. id = Column("id", String(32), primary_key=True)
  205. name = Column("name", String(255), default="")
  206. created_at = Column(
  207. "created_at",
  208. DateTime(timezone=True),
  209. nullable=False,
  210. default=datetime.now,
  211. server_default=text("CURRENT_TIMESTAMP"),
  212. )
  213. def to_dict(self):
  214. return {
  215. 'id': self.id,
  216. 'name': self.name,
  217. }
  218. class AIMeetingUserModel(BaseModel):
  219. id: str = ""
  220. name: str = ""
  221. def get_create(self):
  222. if not self.id:
  223. raise ParamsError(message="Content can't be empty")
  224. elif not self.name:
  225. self.name = self.id
  226. return self
  227. else:
  228. return self