83 lines
2 KiB
Python
83 lines
2 KiB
Python
from typing import List, Literal, get_args, get_origin
|
|
|
|
from pydantic import BaseModel, model_validator
|
|
from pydantic_core import PydanticUndefined
|
|
|
|
|
|
class ConfModel(BaseModel):
|
|
@model_validator(mode="before")
|
|
@classmethod
|
|
def nested_defaults(cls, data):
|
|
for name, field in cls.model_fields.items():
|
|
expected_type = field.annotation
|
|
if name not in data:
|
|
if field.default is PydanticUndefined:
|
|
data[name] = expected_type
|
|
else:
|
|
data[name] = field.default
|
|
value = data[name]
|
|
|
|
# 检查 Literal 类型并修正
|
|
if get_origin(expected_type) is Literal:
|
|
valid_literals = get_args(expected_type)
|
|
if value not in valid_literals:
|
|
# 修正为默认值
|
|
data[name] = (
|
|
field.default
|
|
if field.default is not PydanticUndefined
|
|
else None
|
|
)
|
|
return data
|
|
|
|
|
|
class Total(ConfModel):
|
|
"""整体"""
|
|
|
|
# 所在页面
|
|
page: str = "init"
|
|
# 是否已展示帮助文档
|
|
is_already_show_doc: bool = False
|
|
|
|
|
|
class UpdatePart(ConfModel):
|
|
"""更新代码"""
|
|
|
|
# mower-ng 代码分支
|
|
branch: str = "slow"
|
|
# PyPI 仓库镜像
|
|
mirror: str = "aliyun"
|
|
|
|
|
|
class LaunchPart(ConfModel):
|
|
"""启动程序"""
|
|
|
|
class Instance(ConfModel):
|
|
"""实例"""
|
|
|
|
# 是否选中
|
|
checked: bool = False
|
|
# 实例名
|
|
name: str = ""
|
|
# 实例路径
|
|
path: str = ""
|
|
|
|
# 实例列表
|
|
instances: List[Instance] = []
|
|
# 是否展示日志窗口
|
|
is_show_log: bool = False
|
|
|
|
|
|
class OtherPart(ConfModel):
|
|
"""其他配置"""
|
|
|
|
# xx.zhaozuohong.vip镜像 (访问xx.zhaozuohong.vip url时,0=原路径 1=在.zhaozuohong.vip前添加-cf前缀)
|
|
base_mirror: Literal["0", "1"] = "0"
|
|
|
|
|
|
class Conf(
|
|
Total,
|
|
UpdatePart,
|
|
LaunchPart,
|
|
OtherPart,
|
|
):
|
|
pass
|