From d45d49edbd6c0714cc50d33ab5bfd0792e20f97c Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 23 Dec 2024 11:35:38 +0800 Subject: [PATCH] fix schemas default_factory --- app/schemas/context.py | 44 +++++++++++++++++++------------------- app/schemas/file.py | 6 +++--- app/schemas/mediaserver.py | 10 ++++----- app/schemas/message.py | 6 +++--- app/schemas/plugin.py | 10 ++++----- app/schemas/response.py | 4 ++-- app/schemas/servarr.py | 12 +++++------ app/schemas/site.py | 8 +++---- app/schemas/subscribe.py | 12 +++++------ app/schemas/system.py | 14 ++++++------ app/schemas/tmdb.py | 6 +++--- app/schemas/transfer.py | 21 ++++++++++++------ app/schemas/user.py | 10 ++++----- 13 files changed, 86 insertions(+), 77 deletions(-) diff --git a/app/schemas/context.py b/app/schemas/context.py index bf065cbe..faaabdd9 100644 --- a/app/schemas/context.py +++ b/app/schemas/context.py @@ -1,6 +1,6 @@ from typing import Optional, Dict, List, Union -from pydantic import BaseModel +from pydantic import BaseModel, Field class MetaInfo(BaseModel): @@ -104,56 +104,56 @@ class MediaInfo(BaseModel): # 二级分类 category: Optional[str] = "" # 季季集清单 - seasons: Optional[Dict[int, list]] = {} + seasons: Optional[Dict[int, list]] = Field(default_factory=dict) # 季详情 - season_info: Optional[List[dict]] = [] + season_info: Optional[List[dict]] = Field(default_factory=list) # 别名和译名 - names: Optional[list] = [] + names: Optional[list] = Field(default_factory=list) # 演员 - actors: Optional[list] = [] + actors: Optional[list] = Field(default_factory=list) # 导演 - directors: Optional[list] = [] + directors: Optional[list] = Field(default_factory=list) # 详情链接 detail_link: Optional[str] = None # 其它TMDB属性 # 是否成人内容 adult: Optional[bool] = False # 创建人 - created_by: Optional[list] = [] + created_by: Optional[list] = Field(default_factory=list) # 集时长 - episode_run_time: Optional[list] = [] + episode_run_time: Optional[list] = Field(default_factory=list) # 风格 - genres: Optional[List[dict]] = [] + genres: Optional[List[dict]] = Field(default_factory=list) # 首播日期 first_air_date: Optional[str] = None # 首页 homepage: Optional[str] = None # 语种 - languages: Optional[list] = [] + languages: Optional[list] = Field(default_factory=list) # 最后上映日期 last_air_date: Optional[str] = None # 流媒体平台 - networks: Optional[list] = [] + networks: Optional[list] = Field(default_factory=list) # 集数 number_of_episodes: Optional[int] = 0 # 季数 number_of_seasons: Optional[int] = 0 # 原产国 - origin_country: Optional[list] = [] + origin_country: Optional[list] = Field(default_factory=list) # 原名 original_name: Optional[str] = None # 出品公司 - production_companies: Optional[list] = [] + production_companies: Optional[list] = Field(default_factory=list) # 出品国 - production_countries: Optional[list] = [] + production_countries: Optional[list] = Field(default_factory=list) # 语种 - spoken_languages: Optional[list] = [] + spoken_languages: Optional[list] = Field(default_factory=list) # 状态 status: Optional[str] = None # 标签 tagline: Optional[str] = None # 风格ID - genre_ids: Optional[list] = [] + genre_ids: Optional[list] = Field(default_factory=list) # 评价数量 vote_count: Optional[int] = 0 # 流行度 @@ -161,7 +161,7 @@ class MediaInfo(BaseModel): # 时长 runtime: Optional[int] = None # 下一集 - next_episode_to_air: Optional[dict] = {} + next_episode_to_air: Optional[dict] = Field(default_factory=dict) class TorrentInfo(BaseModel): @@ -213,7 +213,7 @@ class TorrentInfo(BaseModel): # HR hit_and_run: Optional[bool] = False # 种子标签 - labels: Optional[list] = [] + labels: Optional[list] = Field(default_factory=list) # 种子优先级 pri_order: Optional[int] = 0 # 促销 @@ -245,13 +245,13 @@ class MediaPerson(BaseModel): type: Optional[Union[str, int]] = 1 name: Optional[str] = None character: Optional[str] = None - images: Optional[dict] = {} + images: Optional[dict] = Field(default_factory=dict) # themoviedb profile_path: Optional[str] = None gender: Optional[Union[str, int]] = None original_name: Optional[str] = None credit_id: Optional[str] = None - also_known_as: Optional[list] = [] + also_known_as: Optional[list] = Field(default_factory=list) birthday: Optional[str] = None deathday: Optional[str] = None imdb_id: Optional[str] = None @@ -260,11 +260,11 @@ class MediaPerson(BaseModel): popularity: Optional[float] = None biography: Optional[str] = None # douban - roles: Optional[list] = [] + roles: Optional[list] = Field(default_factory=list) title: Optional[str] = None url: Optional[str] = None avatar: Optional[Union[str, dict]] = None latin_name: Optional[str] = None # bangumi - career: Optional[list] = [] + career: Optional[list] = Field(default_factory=list) relation: Optional[str] = None diff --git a/app/schemas/file.py b/app/schemas/file.py index 6c9781f0..4e941e3d 100644 --- a/app/schemas/file.py +++ b/app/schemas/file.py @@ -1,6 +1,6 @@ from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field class FileItem(BaseModel): @@ -21,7 +21,7 @@ class FileItem(BaseModel): # 修改时间 modify_time: Optional[float] = None # 子节点 - children: Optional[list] = [] + children: Optional[list] = Field(default_factory=list) # ID fileid: Optional[str] = None # 父ID @@ -45,4 +45,4 @@ class StorageUsage(BaseModel): class StorageTransType(BaseModel): # 传输类型 - transtype: Optional[dict] = {} + transtype: Optional[dict] = Field(default_factory=dict) diff --git a/app/schemas/mediaserver.py b/app/schemas/mediaserver.py index bb5b8113..30d1ffaf 100644 --- a/app/schemas/mediaserver.py +++ b/app/schemas/mediaserver.py @@ -1,7 +1,7 @@ from pathlib import Path from typing import Optional, Dict, Union, List, Any -from pydantic import BaseModel +from pydantic import BaseModel, Field from app.schemas.types import MediaType @@ -13,7 +13,7 @@ class ExistMediaInfo(BaseModel): # 类型 电影、电视剧 type: Optional[MediaType] # 季 - seasons: Optional[Dict[int, list]] = {} + seasons: Optional[Dict[int, list]] = Field(default_factory=dict) # 媒体服务器类型:plex、jellyfin、emby server_type: Optional[str] = None # 媒体服务器名称 @@ -29,7 +29,7 @@ class NotExistMediaInfo(BaseModel): # 季 season: Optional[int] = None # 剧集列表 - episodes: Optional[list] = [] + episodes: Optional[list] = Field(default_factory=list) # 总集数 total_episode: Optional[int] = 0 # 开始集 @@ -132,7 +132,7 @@ class MediaServerSeasonInfo(BaseModel): 媒体服务器媒体剧集信息 """ season: Optional[int] = None - episodes: Optional[List[int]] = [] + episodes: Optional[List[int]] = Field(default_factory=list) class WebhookEventInfo(BaseModel): @@ -173,4 +173,4 @@ class MediaServerPlayItem(BaseModel): image: Optional[str] = None link: Optional[str] = None percent: Optional[float] = None - BackdropImageTags: Optional[list] = [] + BackdropImageTags: Optional[list] = Field(default_factory=list) diff --git a/app/schemas/message.py b/app/schemas/message.py index 6065aa8f..de04138c 100644 --- a/app/schemas/message.py +++ b/app/schemas/message.py @@ -1,6 +1,6 @@ from typing import Optional, Union -from pydantic import BaseModel +from pydantic import BaseModel, Field from app.schemas.types import NotificationType, MessageChannel @@ -101,7 +101,7 @@ class Subscription(BaseModel): 客户端消息订阅 """ endpoint: Optional[str] - keys: Optional[dict] = {} + keys: Optional[dict] = Field(default_factory=dict) class SubscriptionMessage(BaseModel): @@ -112,4 +112,4 @@ class SubscriptionMessage(BaseModel): body: Optional[str] icon: Optional[str] url: Optional[str] - data: Optional[dict] = {} + data: Optional[dict] = Field(default_factory=dict) diff --git a/app/schemas/plugin.py b/app/schemas/plugin.py index 742ff1a7..3f186f07 100644 --- a/app/schemas/plugin.py +++ b/app/schemas/plugin.py @@ -1,6 +1,6 @@ from typing import Optional, List -from pydantic import BaseModel +from pydantic import BaseModel, Field class Plugin(BaseModel): @@ -43,7 +43,7 @@ class Plugin(BaseModel): # 安装次数 install_count: Optional[int] = 0 # 更新记录 - history: Optional[dict] = {} + history: Optional[dict] = Field(default_factory=dict) # 添加时间,值越小表示越靠后发布 add_time: Optional[int] = 0 # 插件公钥 @@ -60,8 +60,8 @@ class PluginDashboard(Plugin): # 仪表板key key: Optional[str] = None # 全局配置 - attrs: Optional[dict] = {} + attrs: Optional[dict] = Field(default_factory=dict) # col列数 - cols: Optional[dict] = {} + cols: Optional[dict] = Field(default_factory=dict) # 页面元素 - elements: Optional[List[dict]] = [] + elements: Optional[List[dict]] = Field(default_factory=list) diff --git a/app/schemas/response.py b/app/schemas/response.py index b42e7ce1..8e71d67e 100644 --- a/app/schemas/response.py +++ b/app/schemas/response.py @@ -1,6 +1,6 @@ from typing import Optional, Union -from pydantic import BaseModel +from pydantic import BaseModel, Field class Response(BaseModel): @@ -9,4 +9,4 @@ class Response(BaseModel): # 消息文本 message: Optional[str] = None # 数据 - data: Optional[Union[dict, list]] = {} + data: Optional[Union[dict, list]] = Field(default_factory=dict) diff --git a/app/schemas/servarr.py b/app/schemas/servarr.py index a4530e23..9eaa3cf4 100644 --- a/app/schemas/servarr.py +++ b/app/schemas/servarr.py @@ -1,5 +1,5 @@ from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field class RadarrMovie(BaseModel): @@ -28,9 +28,9 @@ class SonarrSeries(BaseModel): overview: Optional[str] network: Optional[str] airTime: Optional[str] - images: list = [] + images: list = Field(default_factory=list) remotePoster: Optional[str] - seasons: list = [] + seasons: list = Field(default_factory=list) year: Optional[str] path: Optional[str] profileId: Optional[int] @@ -49,9 +49,9 @@ class SonarrSeries(BaseModel): cleanTitle: Optional[str] titleSlug: Optional[str] certification: Optional[str] - genres: list = [] - tags: list = [] + genres: list = Field(default_factory=list) + tags: list = Field(default_factory=list) added: Optional[str] ratings: Optional[dict] qualityProfileId: Optional[int] - statistics: dict = {} + statistics: dict = Field(default_factory=dict) diff --git a/app/schemas/site.py b/app/schemas/site.py index 2ef02356..e59824f3 100644 --- a/app/schemas/site.py +++ b/app/schemas/site.py @@ -1,6 +1,6 @@ from typing import Optional, Any, Union, Dict -from pydantic import BaseModel +from pydantic import BaseModel, Field class Site(BaseModel): @@ -99,11 +99,11 @@ class SiteUserData(BaseModel): # 下载体积 leeching_size: Optional[int] = 0 # 做种人数, 种子大小 - seeding_info: Optional[list] = [] + seeding_info: Optional[list] = Field(default_factory=list) # 未读消息 message_unread: Optional[int] = 0 # 未读消息内容 - message_unread_contents: Optional[list] = [] + message_unread_contents: Optional[list] = Field(default_factory=list) # 错误信息 err_msg: Optional[str] = None # 更新日期 @@ -114,4 +114,4 @@ class SiteUserData(BaseModel): class SiteAuth(BaseModel): site: Optional[str] = None - params: Optional[Dict[str, Union[int, str]]] = {} + params: Optional[Dict[str, Union[int, str]]] = Field(default_factory=dict) diff --git a/app/schemas/subscribe.py b/app/schemas/subscribe.py index f69ffd8d..652f3e1a 100644 --- a/app/schemas/subscribe.py +++ b/app/schemas/subscribe.py @@ -1,6 +1,6 @@ from typing import Optional, List, Dict, Any -from pydantic import BaseModel +from pydantic import BaseModel, Field class Subscribe(BaseModel): @@ -53,7 +53,7 @@ class Subscribe(BaseModel): # 订阅用户 username: Optional[str] = None # 订阅站点 - sites: Optional[List[int]] = [] + sites: Optional[List[int]] = Field(default_factory=list) # 下载器 downloader: Optional[str] = None # 是否洗版 @@ -71,7 +71,7 @@ class Subscribe(BaseModel): # 自定义媒体类别 media_category: Optional[str] = None # 过滤规则组 - filter_groups: Optional[List[str]] = [] + filter_groups: Optional[List[str]] = Field(default_factory=list) class Config: orm_mode = True @@ -157,13 +157,13 @@ class SubscribeEpisodeInfo(BaseModel): # 背景图 backdrop: Optional[str] = None # 下载文件信息 - download: Optional[List[SubscribeDownloadFileInfo]] = [] + download: Optional[List[SubscribeDownloadFileInfo]] = Field(default_factory=list) # 媒体库文件信息 - library: Optional[List[SubscribeLibraryFileInfo]] = [] + library: Optional[List[SubscribeLibraryFileInfo]] = Field(default_factory=list) class SubscrbieInfo(BaseModel): # 订阅信息 subscribe: Optional[Subscribe] = None # 集信息 {集号: {download: 文件路径,library: 文件路径, backdrop: url, title: 标题, description: 描述}} - episodes: Optional[Dict[int, SubscribeEpisodeInfo]] = {} + episodes: Optional[Dict[int, SubscribeEpisodeInfo]] = Field(default_factory=dict) diff --git a/app/schemas/system.py b/app/schemas/system.py index 933c6d11..0e943b8c 100644 --- a/app/schemas/system.py +++ b/app/schemas/system.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from typing import Optional, Any -from pydantic import BaseModel +from pydantic import BaseModel, Field @dataclass @@ -30,11 +30,11 @@ class MediaServerConf(BaseModel): # 类型 emby/jellyfin/plex type: Optional[str] = None # 配置 - config: Optional[dict] = {} + config: Optional[dict] = Field(default_factory=dict) # 是否启用 enabled: Optional[bool] = False # 同步媒体体库列表 - sync_libraries: Optional[list] = [] + sync_libraries: Optional[list] = Field(default_factory=list) class DownloaderConf(BaseModel): @@ -48,7 +48,7 @@ class DownloaderConf(BaseModel): # 是否默认 default: Optional[bool] = False # 配置 - config: Optional[dict] = {} + config: Optional[dict] = Field(default_factory=dict) # 是否启用 enabled: Optional[bool] = False @@ -62,9 +62,9 @@ class NotificationConf(BaseModel): # 类型 telegram/wechat/vocechat/synologychat/slack/webpush type: Optional[str] = None # 配置 - config: Optional[dict] = {} + config: Optional[dict] = Field(default_factory=dict) # 场景开关 - switchs: Optional[list] = [] + switchs: Optional[list] = Field(default_factory=list) # 是否启用 enabled: Optional[bool] = False @@ -88,7 +88,7 @@ class StorageConf(BaseModel): # 名称 name: Optional[str] = None # 配置 - config: Optional[dict] = {} + config: Optional[dict] = Field(default_factory=dict) class TransferDirectoryConf(BaseModel): diff --git a/app/schemas/tmdb.py b/app/schemas/tmdb.py index 58c21618..bada2818 100644 --- a/app/schemas/tmdb.py +++ b/app/schemas/tmdb.py @@ -1,6 +1,6 @@ from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field class TmdbSeason(BaseModel): @@ -28,5 +28,5 @@ class TmdbEpisode(BaseModel): season_number: Optional[int] = None still_path: Optional[str] = None vote_average: Optional[float] = None - crew: Optional[list] = [] - guest_stars: Optional[list] = [] + crew: Optional[list] = Field(default_factory=list) + guest_stars: Optional[list] = Field(default_factory=list) diff --git a/app/schemas/transfer.py b/app/schemas/transfer.py index 6104afcb..251ccb6e 100644 --- a/app/schemas/transfer.py +++ b/app/schemas/transfer.py @@ -1,8 +1,9 @@ from pathlib import Path from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field +from app.core.meta import MetaBase from app.schemas.file import FileItem @@ -34,15 +35,23 @@ class DownloadingTorrent(BaseModel): state: Optional[str] = 'downloading' upspeed: Optional[str] = None dlspeed: Optional[str] = None - media: Optional[dict] = {} + media: Optional[dict] = Field(default_factory=dict) userid: Optional[str] = None username: Optional[str] = None left_time: Optional[str] = None +class TransferTask(BaseModel): + """ + 文件整理任务 + """ + fileitem: Optional[FileItem] = None + meta: Optional[MetaBase] = None + + class TransferInfo(BaseModel): """ - 文件转移结果信息 + 文件整理结果信息 """ # 是否成功标志 success: bool = True @@ -57,13 +66,13 @@ class TransferInfo(BaseModel): # 处理文件数 file_count: Optional[int] = 0 # 处理文件清单 - file_list: Optional[list] = [] + file_list: Optional[list] = Field(default_factory=list) # 目标文件清单 - file_list_new: Optional[list] = [] + file_list_new: Optional[list] = Field(default_factory=list) # 总文件大小 total_size: Optional[float] = 0 # 失败清单 - fail_list: Optional[list] = [] + fail_list: Optional[list] = Field(default_factory=list) # 错误信息 message: Optional[str] = None # 是否需要刮削 diff --git a/app/schemas/user.py b/app/schemas/user.py index b366d2d2..6d5dff0b 100644 --- a/app/schemas/user.py +++ b/app/schemas/user.py @@ -1,6 +1,6 @@ from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field # Shared properties @@ -18,9 +18,9 @@ class UserBase(BaseModel): # 是否开启二次验证 is_otp: Optional[bool] = False # 权限 - permissions: Optional[dict] = {} + permissions: Optional[dict] = Field(default_factory=dict) # 个性化设置 - settings: Optional[dict] = {} + settings: Optional[dict] = Field(default_factory=dict) class Config: orm_mode = True @@ -31,7 +31,7 @@ class UserCreate(UserBase): name: str email: Optional[str] = None password: Optional[str] = None - settings: Optional[dict] = {} + settings: Optional[dict] = Field(default_factory=dict) # Properties to receive via API on update @@ -40,7 +40,7 @@ class UserUpdate(UserBase): name: str email: Optional[str] = None password: Optional[str] = None - settings: Optional[dict] = {} + settings: Optional[dict] = Field(default_factory=dict) class UserInDBBase(UserBase):