Some checks failed
Test / test (push) Failing after 3m47s
- 替换 Field(max_length=X) 为 StrX/TextX 类型别名(21 个 sqlmodels 文件) - 替换 get + 404 检查为 get_exist_one()(17 个路由文件,约 50 处) - 替换 save + session.refresh 为 save(load=...) - 替换 session.add + commit 为 save()(dav/provider.py) - 更新所有依赖至最新版本 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
118 lines
2.7 KiB
Python
118 lines
2.7 KiB
Python
"""
|
||
WebDAV 账户模型
|
||
|
||
管理用户的 WebDAV 连接账户,每个账户对应一个挂载根路径。
|
||
通过 HTTP Basic Auth 认证访问 DAV 协议端点。
|
||
"""
|
||
from typing import TYPE_CHECKING
|
||
from uuid import UUID
|
||
|
||
from sqlmodel import Field, Relationship, UniqueConstraint
|
||
|
||
from sqlmodel_ext import SQLModelBase, TableBaseMixin, Str255
|
||
|
||
if TYPE_CHECKING:
|
||
from .user import User
|
||
|
||
|
||
# ==================== Base 模型 ====================
|
||
|
||
class WebDAVBase(SQLModelBase):
|
||
"""WebDAV 账户基础字段"""
|
||
|
||
name: Str255
|
||
"""账户名称(同一用户下唯一)"""
|
||
|
||
root: str = Field(default="/", sa_column_kwargs={"server_default": "'/'"})
|
||
"""挂载根目录路径"""
|
||
|
||
readonly: bool = Field(default=False, sa_column_kwargs={"server_default": "false"})
|
||
"""是否只读"""
|
||
|
||
use_proxy: bool = Field(default=False, sa_column_kwargs={"server_default": "false"})
|
||
"""是否使用代理下载"""
|
||
|
||
|
||
# ==================== 数据库模型 ====================
|
||
|
||
class WebDAV(WebDAVBase, TableBaseMixin):
|
||
"""WebDAV 账户模型"""
|
||
|
||
__table_args__ = (UniqueConstraint("name", "user_id", name="uq_webdav_name_user"),)
|
||
|
||
password: Str255
|
||
"""密码(Argon2 哈希)"""
|
||
|
||
# 外键
|
||
user_id: UUID = Field(
|
||
foreign_key="user.id",
|
||
index=True,
|
||
ondelete="CASCADE",
|
||
)
|
||
"""所属用户UUID"""
|
||
|
||
# 关系
|
||
user: "User" = Relationship(back_populates="webdavs")
|
||
|
||
|
||
# ==================== DTO 模型 ====================
|
||
|
||
class WebDAVCreateRequest(SQLModelBase):
|
||
"""创建 WebDAV 账户请求"""
|
||
|
||
name: Str255
|
||
"""账户名称"""
|
||
|
||
password: Str255 = Field(min_length=1)
|
||
"""账户密码(明文,服务端哈希后存储)"""
|
||
|
||
root: str = "/"
|
||
"""挂载根目录路径"""
|
||
|
||
readonly: bool = False
|
||
"""是否只读"""
|
||
|
||
use_proxy: bool = False
|
||
"""是否使用代理下载"""
|
||
|
||
|
||
class WebDAVUpdateRequest(SQLModelBase):
|
||
"""更新 WebDAV 账户请求"""
|
||
|
||
password: Str255 | None = Field(default=None, min_length=1)
|
||
"""新密码(为 None 时不修改)"""
|
||
|
||
root: str | None = None
|
||
"""新挂载根目录路径(为 None 时不修改)"""
|
||
|
||
readonly: bool | None = None
|
||
"""是否只读(为 None 时不修改)"""
|
||
|
||
use_proxy: bool | None = None
|
||
"""是否使用代理下载(为 None 时不修改)"""
|
||
|
||
|
||
class WebDAVAccountResponse(SQLModelBase):
|
||
"""WebDAV 账户响应"""
|
||
|
||
id: int
|
||
"""账户ID"""
|
||
|
||
name: str
|
||
"""账户名称"""
|
||
|
||
root: str
|
||
"""挂载根目录路径"""
|
||
|
||
readonly: bool
|
||
"""是否只读"""
|
||
|
||
use_proxy: bool
|
||
"""是否使用代理下载"""
|
||
|
||
created_at: str
|
||
"""创建时间"""
|
||
|
||
updated_at: str
|
||
"""更新时间"""
|