block.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. """block.py — Block 相关 Schema"""
  2. from typing import Optional
  3. from pydantic import BaseModel, Field
  4. class BlockBase(BaseModel):
  5. """Block 基础信息"""
  6. id: str = Field(..., validation_alias="id", serialization_alias="id")
  7. block_order: int = Field(..., validation_alias="blockOrder", serialization_alias="blockOrder")
  8. type: str = Field(..., validation_alias="type", serialization_alias="type")
  9. level: int = Field(..., validation_alias="level", serialization_alias="level")
  10. index: int = Field(..., validation_alias="index", serialization_alias="index")
  11. content: str | dict | list = Field(..., validation_alias="content", serialization_alias="content")
  12. word_style: str = Field(..., validation_alias="wordStyle", serialization_alias="wordStyle")
  13. style: dict = Field(..., validation_alias="style", serialization_alias="style")
  14. metadata: dict = Field(..., validation_alias="metadata", serialization_alias="metadata")
  15. class Config:
  16. populate_by_name = True
  17. class BlockUpdate(BaseModel):
  18. """Block 更新请求"""
  19. content: Optional[str | dict | list] = None
  20. style: Optional[dict] = None
  21. word_style: Optional[str] = None
  22. metadata: Optional[dict] = None
  23. class BlockCreate(BaseModel):
  24. """Block 创建请求
  25. 注意:
  26. - id, index, block_order 由后端自动生成,前端无需提供
  27. - level 对于 heading 类型是必填的(1-6),其他类型固定为 0(可省略)
  28. """
  29. type: str
  30. level: int = 0 # heading 类型必填(1-6),其他类型默认 0
  31. content: str | dict | list
  32. word_style: str = ""
  33. style: dict = {}
  34. metadata: dict = {}
  35. after_block_id: Optional[str] = None # 在哪个 block 后插入(null = 末尾)
  36. class TOCContent(BaseModel):
  37. """TOC Block content 结构"""
  38. title: str = "目录"
  39. class TOCConfig(BaseModel):
  40. """TOC 配置"""
  41. levels: str = "1-1" # 包含的标题层级
  42. use_hyperlinks: bool = True
  43. use_page_numbers: bool = True
  44. hide_page_numbers_in_web: bool = True
  45. use_outline_levels: bool = True
  46. show_leader_dots: bool = True
  47. leader_char: str = "."
  48. class TOCMetadata(BaseModel):
  49. """TOC Block metadata 结构"""
  50. toc_config: TOCConfig
  51. is_auto_generated: bool = True
  52. readonly: bool = True
  53. deletable: bool = True
  54. class TOCBlock(BaseModel):
  55. """完整的 TOC Block"""
  56. id: str
  57. block_order: int = Field(..., serialization_alias="blockOrder")
  58. type: str = "toc"
  59. level: int = 0
  60. index: int = 0
  61. content: TOCContent
  62. word_style: str = "TOC"
  63. metadata: TOCMetadata
  64. class Config:
  65. populate_by_name = True
  66. class TOCItem(BaseModel):
  67. """目录树节点"""
  68. id: str
  69. level: int
  70. content: str
  71. children: list['TOCItem'] = []
  72. class BlockSearchResult(BaseModel):
  73. """Block 搜索结果"""
  74. blocks: list[BlockBase]
  75. total: int
  76. class BlockStats(BaseModel):
  77. """Block 统计信息"""
  78. total: int
  79. by_type: dict[str, int] = Field(..., alias="byType")
  80. class Config:
  81. populate_by_name = True