执行 Ruff 安全自动修复
This commit is contained in:
+127
-126
@@ -1,8 +1,9 @@
|
||||
"""Pydantic 请求/响应模型"""
|
||||
|
||||
from datetime import datetime, timezone
|
||||
from typing import Optional, Any
|
||||
from pydantic import BaseModel, Field, ConfigDict, model_serializer
|
||||
from datetime import UTC, datetime
|
||||
from typing import Any
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_serializer
|
||||
|
||||
from .huya_defaults import (
|
||||
HUYA_DEFAULT_BIND_ACT_ID,
|
||||
@@ -32,16 +33,16 @@ class YybSelectionRequest(BaseModel):
|
||||
role_name: str = Field(..., min_length=1, max_length=128)
|
||||
|
||||
|
||||
def _ensure_tz(dt: Optional[datetime]) -> Optional[datetime]:
|
||||
def _ensure_tz(dt: datetime | None) -> datetime | None:
|
||||
"""确保 datetime 带有 UTC 时区信息,无时区的视为 UTC。"""
|
||||
if dt is None:
|
||||
return None
|
||||
if dt.tzinfo is None:
|
||||
return dt.replace(tzinfo=timezone.utc)
|
||||
return dt.replace(tzinfo=UTC)
|
||||
return dt
|
||||
|
||||
|
||||
def _isoformat(dt: Optional[datetime]) -> str | None:
|
||||
def _isoformat(dt: datetime | None) -> str | None:
|
||||
normalized = _ensure_tz(dt)
|
||||
return normalized.isoformat() if normalized is not None else None
|
||||
|
||||
@@ -66,9 +67,9 @@ class UserInfo(BaseModel):
|
||||
role: str
|
||||
is_active: bool
|
||||
remark: str = ""
|
||||
created_at: Optional[datetime] = None
|
||||
created_at: datetime | None = None
|
||||
permissions: list[str] = []
|
||||
custom_permissions: Optional[list[str]] = None
|
||||
custom_permissions: list[str] | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -95,11 +96,11 @@ class UserCreate(BaseModel):
|
||||
|
||||
|
||||
class UserUpdate(BaseModel):
|
||||
password: Optional[str] = None
|
||||
role: Optional[str] = None
|
||||
is_active: Optional[bool] = None
|
||||
remark: Optional[str] = None
|
||||
custom_permissions: Optional[list[str]] = None
|
||||
password: str | None = None
|
||||
role: str | None = None
|
||||
is_active: bool | None = None
|
||||
remark: str | None = None
|
||||
custom_permissions: list[str] | None = None
|
||||
|
||||
|
||||
class UserRename(BaseModel):
|
||||
@@ -119,12 +120,12 @@ class AccountImport(BaseModel):
|
||||
|
||||
|
||||
class AccountAssign(BaseModel):
|
||||
assigned_to: Optional[int] = None
|
||||
assigned_to: int | None = None
|
||||
|
||||
|
||||
class BatchAssign(BaseModel):
|
||||
account_ids: list[int]
|
||||
assigned_to: Optional[int] = None # None=取消分配
|
||||
assigned_to: int | None = None # None=取消分配
|
||||
|
||||
|
||||
class AccountBulkSelection(BaseModel):
|
||||
@@ -143,22 +144,22 @@ class AccountBulkTag(AccountBulkSelection):
|
||||
|
||||
|
||||
class AccountTag(BaseModel):
|
||||
tag: Optional[str] = None
|
||||
account_ids: Optional[list[int]] = None
|
||||
tag: str | None = None
|
||||
account_ids: list[int] | None = None
|
||||
|
||||
|
||||
class AccountOut(BaseModel):
|
||||
id: int
|
||||
username: str
|
||||
# 敏感字段根据角色决定是否返回
|
||||
password: Optional[str] = None
|
||||
email: Optional[str] = None
|
||||
email_password: Optional[str] = None
|
||||
password: str | None = None
|
||||
email: str | None = None
|
||||
email_password: str | None = None
|
||||
tag: str = ""
|
||||
assigned_to: Optional[int] = None
|
||||
assigned_username: Optional[str] = None
|
||||
assigned_to: int | None = None
|
||||
assigned_username: str | None = None
|
||||
remark: str = ""
|
||||
created_at: Optional[datetime] = None
|
||||
created_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -203,8 +204,8 @@ class LoginTaskOut(BaseModel):
|
||||
cookie: str = ""
|
||||
message: str = ""
|
||||
created_by: int
|
||||
created_at: Optional[datetime] = None
|
||||
finished_at: Optional[datetime] = None
|
||||
created_at: datetime | None = None
|
||||
finished_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -239,8 +240,8 @@ class AccountCheckItemOut(BaseModel):
|
||||
email: str
|
||||
status: str
|
||||
message: str
|
||||
started_at: Optional[datetime] = None
|
||||
finished_at: Optional[datetime] = None
|
||||
started_at: datetime | None = None
|
||||
finished_at: datetime | None = None
|
||||
|
||||
|
||||
class AccountCheckBatchOut(BaseModel):
|
||||
@@ -256,9 +257,9 @@ class AccountCheckBatchOut(BaseModel):
|
||||
finished_count: int
|
||||
running_count: int
|
||||
status_counts: dict[str, int]
|
||||
created_at: Optional[datetime] = None
|
||||
started_at: Optional[datetime] = None
|
||||
finished_at: Optional[datetime] = None
|
||||
created_at: datetime | None = None
|
||||
started_at: datetime | None = None
|
||||
finished_at: datetime | None = None
|
||||
items: list[AccountCheckItemOut]
|
||||
|
||||
|
||||
@@ -327,12 +328,12 @@ class HuyaAutoRegisterRetryRequest(BaseModel):
|
||||
"""
|
||||
|
||||
mode: str = Field("continue", max_length=32)
|
||||
concurrency: Optional[int] = Field(None, ge=1, le=5)
|
||||
wait_seconds: Optional[float] = Field(None, ge=15, le=600)
|
||||
poll_interval: Optional[float] = Field(None, ge=1, le=30)
|
||||
password_prefix: Optional[str] = Field(None, max_length=8)
|
||||
fixed_password: Optional[str] = Field(None, max_length=64)
|
||||
use_proxy: Optional[bool] = None
|
||||
concurrency: int | None = Field(None, ge=1, le=5)
|
||||
wait_seconds: float | None = Field(None, ge=15, le=600)
|
||||
poll_interval: float | None = Field(None, ge=1, le=30)
|
||||
password_prefix: str | None = Field(None, max_length=8)
|
||||
fixed_password: str | None = Field(None, max_length=64)
|
||||
use_proxy: bool | None = None
|
||||
|
||||
|
||||
class HuyaAutoRegisterItemOut(BaseModel):
|
||||
@@ -346,15 +347,15 @@ class HuyaAutoRegisterItemOut(BaseModel):
|
||||
change_code: str = ""
|
||||
attempts: int = 0
|
||||
change_attempts: int = 0
|
||||
account_id: Optional[int] = None
|
||||
account_id: int | None = None
|
||||
username: str = ""
|
||||
uid: str = ""
|
||||
password: str = ""
|
||||
password_changed: bool = False
|
||||
cookie: str = ""
|
||||
cookie_preview: str = ""
|
||||
started_at: Optional[datetime] = None
|
||||
finished_at: Optional[datetime] = None
|
||||
started_at: datetime | None = None
|
||||
finished_at: datetime | None = None
|
||||
|
||||
|
||||
class HuyaAutoRegisterBatchOut(BaseModel):
|
||||
@@ -373,17 +374,17 @@ class HuyaAutoRegisterBatchOut(BaseModel):
|
||||
failed_count: int
|
||||
stopped_count: int
|
||||
running_count: int
|
||||
created_at: Optional[datetime] = None
|
||||
started_at: Optional[datetime] = None
|
||||
finished_at: Optional[datetime] = None
|
||||
created_at: datetime | None = None
|
||||
started_at: datetime | None = None
|
||||
finished_at: datetime | None = None
|
||||
items: list[HuyaAutoRegisterItemOut] = []
|
||||
|
||||
|
||||
class HuyaRegisterSuccessLogOut(BaseModel):
|
||||
id: int
|
||||
batch_id: str = ""
|
||||
item_id: Optional[int] = None
|
||||
account_id: Optional[int] = None
|
||||
item_id: int | None = None
|
||||
account_id: int | None = None
|
||||
phone: str = ""
|
||||
username: str = ""
|
||||
uid: str = ""
|
||||
@@ -391,8 +392,8 @@ class HuyaRegisterSuccessLogOut(BaseModel):
|
||||
sms_url: str = ""
|
||||
tag: str = ""
|
||||
provider: str = ""
|
||||
created_by: Optional[int] = None
|
||||
created_at: Optional[datetime] = None
|
||||
created_by: int | None = None
|
||||
created_at: datetime | None = None
|
||||
export_line: str = ""
|
||||
|
||||
|
||||
@@ -435,14 +436,14 @@ class HuyaAccountOut(BaseModel):
|
||||
status: str = ""
|
||||
# 上次成功登录渠道: web / app / sms (空 = 仅导入 Cookie, 从未协议登录)
|
||||
login_channel: str = ""
|
||||
points: Optional[int] = None
|
||||
points: int | None = None
|
||||
game_name: str = ""
|
||||
game_channel: str = ""
|
||||
game_phone: str = ""
|
||||
assigned_to: Optional[int] = None
|
||||
assigned_username: Optional[str] = None
|
||||
created_at: Optional[datetime] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
assigned_to: int | None = None
|
||||
assigned_username: str | None = None
|
||||
created_at: datetime | None = None
|
||||
updated_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -477,7 +478,7 @@ class HuyaConfigOut(BaseModel):
|
||||
outer_act_id: str = HUYA_DEFAULT_OUTER_ACT_ID
|
||||
bind_act_id: str = HUYA_DEFAULT_BIND_ACT_ID
|
||||
pay_channel: str = HUYA_DEFAULT_PAY_CHANNEL
|
||||
updated_at: Optional[datetime] = None
|
||||
updated_at: datetime | None = None
|
||||
|
||||
@model_serializer
|
||||
def _serialize(self) -> dict[str, Any]:
|
||||
@@ -492,11 +493,11 @@ class HuyaConfigOut(BaseModel):
|
||||
|
||||
|
||||
class HuyaConfigUpdate(BaseModel):
|
||||
room_pid: Optional[str] = None
|
||||
sid: Optional[str] = None
|
||||
outer_act_id: Optional[str] = None
|
||||
bind_act_id: Optional[str] = None
|
||||
pay_channel: Optional[str] = None
|
||||
room_pid: str | None = None
|
||||
sid: str | None = None
|
||||
outer_act_id: str | None = None
|
||||
bind_act_id: str | None = None
|
||||
pay_channel: str | None = None
|
||||
|
||||
|
||||
class HuyaTaskBatchRequest(BaseModel):
|
||||
@@ -515,10 +516,10 @@ class HuyaTaskOut(BaseModel):
|
||||
task_type: str
|
||||
status: str
|
||||
message: str = ""
|
||||
result: Optional[dict[str, Any]] = None
|
||||
result: dict[str, Any] | None = None
|
||||
created_by: int
|
||||
created_at: Optional[datetime] = None
|
||||
finished_at: Optional[datetime] = None
|
||||
created_at: datetime | None = None
|
||||
finished_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -544,10 +545,10 @@ class HuyaGoodsOut(BaseModel):
|
||||
id: int
|
||||
product_id: str
|
||||
name: str = ""
|
||||
price: Optional[int] = None
|
||||
price: int | None = None
|
||||
remain_text: str = ""
|
||||
raw: Optional[dict[str, Any]] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
raw: dict[str, Any] | None = None
|
||||
updated_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -569,15 +570,15 @@ class HuyaRechargeGoodsOut(BaseModel):
|
||||
spu_id: str
|
||||
sku_id: str = ""
|
||||
name: str = ""
|
||||
price: Optional[int] = None
|
||||
stock: Optional[int] = None
|
||||
buy_limit: Optional[int] = None
|
||||
price: int | None = None
|
||||
stock: int | None = None
|
||||
buy_limit: int | None = None
|
||||
icon: str = ""
|
||||
description: str = ""
|
||||
task_id: str = ""
|
||||
task_name: str = ""
|
||||
raw: Optional[dict[str, Any]] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
raw: dict[str, Any] | None = None
|
||||
updated_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -625,7 +626,7 @@ class DouyuConfigOut(BaseModel):
|
||||
gold_api_account_template_name: str = "斗鱼昵称"
|
||||
gift_id: str = "23643"
|
||||
skin_id: str = "2942"
|
||||
updated_at: Optional[datetime] = None
|
||||
updated_at: datetime | None = None
|
||||
|
||||
@model_serializer
|
||||
def _serialize(self) -> dict[str, Any]:
|
||||
@@ -658,31 +659,31 @@ class DouyuConfigOut(BaseModel):
|
||||
|
||||
|
||||
class DouyuConfigUpdate(BaseModel):
|
||||
manual_id: Optional[str] = None
|
||||
rid: Optional[str] = None
|
||||
bind_act_alias: Optional[str] = None
|
||||
confirm_act_alias: Optional[str] = None
|
||||
legacy_act_alias: Optional[str] = None
|
||||
room_id: Optional[str] = None
|
||||
elite_amount: Optional[int] = Field(None, ge=1)
|
||||
esports_manual_id: Optional[str] = None
|
||||
esports_act_alias: Optional[str] = None
|
||||
esports_amount: Optional[int] = Field(None, ge=1)
|
||||
esports_chicken_gift_id: Optional[str] = None
|
||||
esports_chicken_skin_id: Optional[str] = None
|
||||
esports_firework_gift_id: Optional[str] = None
|
||||
esports_firework_skin_id: Optional[str] = None
|
||||
xpd_act_alias: Optional[str] = None
|
||||
xpd_act_id: Optional[str] = None
|
||||
xpd_rid: Optional[str] = None
|
||||
gold_pay_type: Optional[int] = Field(None, ge=1, le=9)
|
||||
gold_recharge_channel: Optional[str] = Field(
|
||||
manual_id: str | None = None
|
||||
rid: str | None = None
|
||||
bind_act_alias: str | None = None
|
||||
confirm_act_alias: str | None = None
|
||||
legacy_act_alias: str | None = None
|
||||
room_id: str | None = None
|
||||
elite_amount: int | None = Field(None, ge=1)
|
||||
esports_manual_id: str | None = None
|
||||
esports_act_alias: str | None = None
|
||||
esports_amount: int | None = Field(None, ge=1)
|
||||
esports_chicken_gift_id: str | None = None
|
||||
esports_chicken_skin_id: str | None = None
|
||||
esports_firework_gift_id: str | None = None
|
||||
esports_firework_skin_id: str | None = None
|
||||
xpd_act_alias: str | None = None
|
||||
xpd_act_id: str | None = None
|
||||
xpd_rid: str | None = None
|
||||
gold_pay_type: int | None = Field(None, ge=1, le=9)
|
||||
gold_recharge_channel: str | None = Field(
|
||||
None, pattern="^(wechat_qr|supplier_api)$"
|
||||
)
|
||||
gold_api_product_id: Optional[str] = Field(None, max_length=128)
|
||||
gold_api_account_template_name: Optional[str] = Field(None, max_length=64)
|
||||
gift_id: Optional[str] = None
|
||||
skin_id: Optional[str] = None
|
||||
gold_api_product_id: str | None = Field(None, max_length=128)
|
||||
gold_api_account_template_name: str | None = Field(None, max_length=64)
|
||||
gift_id: str | None = None
|
||||
skin_id: str | None = None
|
||||
|
||||
|
||||
class DouyuTaskBatchRequest(BaseModel):
|
||||
@@ -709,10 +710,10 @@ class DouyuTaskOut(BaseModel):
|
||||
handbook_scope: str = "legacy"
|
||||
status: str
|
||||
message: str = ""
|
||||
result: Optional[dict[str, Any]] = None
|
||||
result: dict[str, Any] | None = None
|
||||
created_by: int
|
||||
created_at: Optional[datetime] = None
|
||||
finished_at: Optional[datetime] = None
|
||||
created_at: datetime | None = None
|
||||
finished_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -740,10 +741,10 @@ class DouyuGoodsOut(BaseModel):
|
||||
id: int
|
||||
commodity_id: str
|
||||
name: str = ""
|
||||
score: Optional[int] = None
|
||||
score: int | None = None
|
||||
status: str = ""
|
||||
raw: Optional[dict[str, Any]] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
raw: dict[str, Any] | None = None
|
||||
updated_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -766,41 +767,41 @@ class DouyuTaskAccountOut(BaseModel):
|
||||
uid: str = ""
|
||||
nickname: str = ""
|
||||
tag: str = ""
|
||||
points: Optional[int] = None
|
||||
points: int | None = None
|
||||
game_name: str = ""
|
||||
game_channel: str = ""
|
||||
gold_balance: Optional[int] = None
|
||||
exchange_balance: Optional[int] = None
|
||||
gold_balance: int | None = None
|
||||
exchange_balance: int | None = None
|
||||
bind_status: str = ""
|
||||
change_role_wait_time: Optional[int] = None
|
||||
esports_points: Optional[int] = None
|
||||
change_role_wait_time: int | None = None
|
||||
esports_points: int | None = None
|
||||
esports_game_name: str = ""
|
||||
esports_game_channel: str = ""
|
||||
esports_bind_status: str = ""
|
||||
esports_change_role_wait_time: Optional[int] = None
|
||||
esports_can_change_time: Optional[int] = None
|
||||
esports_change_role_wait_time: int | None = None
|
||||
esports_can_change_time: int | None = None
|
||||
xpd_game_name: str = ""
|
||||
xpd_openid: str = ""
|
||||
xpd_role_id: str = ""
|
||||
xpd_plat_id: Optional[int] = None
|
||||
xpd_area_id: Optional[int] = None
|
||||
xpd_balance: Optional[int] = None
|
||||
xpd_fragments: Optional[int] = None
|
||||
xpd_plat_id: int | None = None
|
||||
xpd_area_id: int | None = None
|
||||
xpd_balance: int | None = None
|
||||
xpd_fragments: int | None = None
|
||||
xpd_bind_status: str = ""
|
||||
assigned_to: Optional[int] = None
|
||||
assigned_username: Optional[str] = None
|
||||
assigned_to: int | None = None
|
||||
assigned_username: str | None = None
|
||||
|
||||
|
||||
class DouyuXpdGoodsOut(BaseModel):
|
||||
id: int
|
||||
commodity_id: str
|
||||
name: str = ""
|
||||
price: Optional[int] = None
|
||||
org_price: Optional[int] = None
|
||||
price: int | None = None
|
||||
org_price: int | None = None
|
||||
category: str = ""
|
||||
goods_left: Optional[int] = None
|
||||
raw: Optional[dict[str, Any]] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
goods_left: int | None = None
|
||||
raw: dict[str, Any] | None = None
|
||||
updated_at: datetime | None = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -827,23 +828,23 @@ class ProxyConfigOut(BaseModel):
|
||||
https: str = ""
|
||||
whitelist_enabled: bool = False
|
||||
whitelist_platform: str = "xiequ"
|
||||
whitelist_credentials: Optional[dict] = None
|
||||
whitelist_credentials: dict | None = None
|
||||
# 旧字段保留(向后兼容)
|
||||
whitelist_uid: str = ""
|
||||
whitelist_ukey: str = ""
|
||||
|
||||
|
||||
class ProxyConfigUpdate(BaseModel):
|
||||
enabled: Optional[bool] = None
|
||||
api_url: Optional[str] = None
|
||||
http: Optional[str] = None
|
||||
https: Optional[str] = None
|
||||
whitelist_enabled: Optional[bool] = None
|
||||
whitelist_platform: Optional[str] = "xiequ"
|
||||
whitelist_credentials: Optional[dict] = None
|
||||
enabled: bool | None = None
|
||||
api_url: str | None = None
|
||||
http: str | None = None
|
||||
https: str | None = None
|
||||
whitelist_enabled: bool | None = None
|
||||
whitelist_platform: str | None = "xiequ"
|
||||
whitelist_credentials: dict | None = None
|
||||
# 旧字段保留(向后兼容)
|
||||
whitelist_uid: Optional[str] = None
|
||||
whitelist_ukey: Optional[str] = None
|
||||
whitelist_uid: str | None = None
|
||||
whitelist_ukey: str | None = None
|
||||
|
||||
|
||||
# ---- 代理平台元信息 ----
|
||||
|
||||
Reference in New Issue
Block a user