feat: redesign metadata as KV store, add custom properties and WOPI Discovery
Some checks failed
Test / test (push) Failing after 2m32s
Some checks failed
Test / test (push) Failing after 2m32s
Replace one-to-one FileMetadata table with flexible ObjectMetadata KV pairs, add custom property definitions, WOPI Discovery auto-configuration, and per-extension action URL support. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
135
sqlmodels/custom_property.py
Normal file
135
sqlmodels/custom_property.py
Normal file
@@ -0,0 +1,135 @@
|
||||
"""
|
||||
用户自定义属性定义模型
|
||||
|
||||
允许用户定义类型化的自定义属性模板(如标签、评分、分类等),
|
||||
实际值通过 ObjectMetadata KV 表存储,键名格式:custom:{property_definition_id}。
|
||||
|
||||
支持的属性类型:text, number, boolean, select, multi_select, rating, link
|
||||
"""
|
||||
from enum import StrEnum
|
||||
from typing import TYPE_CHECKING
|
||||
from uuid import UUID
|
||||
|
||||
from sqlalchemy import JSON
|
||||
from sqlmodel import Field, Relationship
|
||||
|
||||
from sqlmodel_ext import SQLModelBase, UUIDTableBaseMixin
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .user import User
|
||||
|
||||
|
||||
# ==================== 枚举 ====================
|
||||
|
||||
class CustomPropertyType(StrEnum):
|
||||
"""自定义属性值类型枚举"""
|
||||
TEXT = "text"
|
||||
"""文本"""
|
||||
NUMBER = "number"
|
||||
"""数字"""
|
||||
BOOLEAN = "boolean"
|
||||
"""布尔值"""
|
||||
SELECT = "select"
|
||||
"""单选"""
|
||||
MULTI_SELECT = "multi_select"
|
||||
"""多选"""
|
||||
RATING = "rating"
|
||||
"""评分(1-5)"""
|
||||
LINK = "link"
|
||||
"""链接"""
|
||||
|
||||
|
||||
# ==================== Base 模型 ====================
|
||||
|
||||
class CustomPropertyDefinitionBase(SQLModelBase):
|
||||
"""自定义属性定义基础模型"""
|
||||
|
||||
name: str = Field(max_length=100)
|
||||
"""属性显示名称"""
|
||||
|
||||
type: CustomPropertyType
|
||||
"""属性值类型"""
|
||||
|
||||
icon: str | None = Field(default=None, max_length=100)
|
||||
"""图标标识(iconify 名称)"""
|
||||
|
||||
options: list[str] | None = Field(default=None, sa_type=JSON)
|
||||
"""可选值列表(仅 select/multi_select 类型)"""
|
||||
|
||||
default_value: str | None = Field(default=None, max_length=500)
|
||||
"""默认值"""
|
||||
|
||||
|
||||
# ==================== 数据库模型 ====================
|
||||
|
||||
class CustomPropertyDefinition(CustomPropertyDefinitionBase, UUIDTableBaseMixin):
|
||||
"""
|
||||
用户自定义属性定义
|
||||
|
||||
每个用户独立管理自己的属性模板。
|
||||
实际属性值存储在 ObjectMetadata 表中,键名格式:custom:{id}。
|
||||
"""
|
||||
|
||||
owner_id: UUID = Field(
|
||||
foreign_key="user.id",
|
||||
ondelete="CASCADE",
|
||||
index=True,
|
||||
)
|
||||
"""所有者用户UUID"""
|
||||
|
||||
sort_order: int = 0
|
||||
"""排序顺序"""
|
||||
|
||||
# 关系
|
||||
owner: "User" = Relationship()
|
||||
"""所有者"""
|
||||
|
||||
|
||||
# ==================== DTO 模型 ====================
|
||||
|
||||
class CustomPropertyCreateRequest(SQLModelBase):
|
||||
"""创建自定义属性请求 DTO"""
|
||||
|
||||
name: str = Field(max_length=100)
|
||||
"""属性显示名称"""
|
||||
|
||||
type: CustomPropertyType
|
||||
"""属性值类型"""
|
||||
|
||||
icon: str | None = None
|
||||
"""图标标识"""
|
||||
|
||||
options: list[str] | None = None
|
||||
"""可选值列表(仅 select/multi_select 类型)"""
|
||||
|
||||
default_value: str | None = None
|
||||
"""默认值"""
|
||||
|
||||
|
||||
class CustomPropertyUpdateRequest(SQLModelBase):
|
||||
"""更新自定义属性请求 DTO"""
|
||||
|
||||
name: str | None = None
|
||||
"""属性显示名称"""
|
||||
|
||||
icon: str | None = None
|
||||
"""图标标识"""
|
||||
|
||||
options: list[str] | None = None
|
||||
"""可选值列表"""
|
||||
|
||||
default_value: str | None = None
|
||||
"""默认值"""
|
||||
|
||||
sort_order: int | None = None
|
||||
"""排序顺序"""
|
||||
|
||||
|
||||
class CustomPropertyResponse(CustomPropertyDefinitionBase):
|
||||
"""自定义属性响应 DTO"""
|
||||
|
||||
id: UUID
|
||||
"""属性定义UUID"""
|
||||
|
||||
sort_order: int
|
||||
"""排序顺序"""
|
||||
Reference in New Issue
Block a user