用户生成资源容量管控
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from app.schemas.common import NaiveDatetime, NaiveDatetimeOptional
|
||||
from app.schemas.resource_capacity import ResourceCapacityUsageOut
|
||||
|
||||
|
||||
class CreditAdjustRequest(BaseModel):
|
||||
@@ -54,6 +55,7 @@ class AdminUserOut(BaseModel):
|
||||
created_at: NaiveDatetime
|
||||
last_login_at: NaiveDatetimeOptional = None
|
||||
allowed_menus: list | None = None
|
||||
resource_capacity: ResourceCapacityUsageOut | None = None
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, Field, field_validator, model_validator
|
||||
|
||||
from app.enums.resource_capacity import ResourceCapacitySourceEnum, ResourceCapacityUnitEnum
|
||||
|
||||
|
||||
class ResourceCapacityConfigUpdate(BaseModel):
|
||||
enabled: bool = Field(
|
||||
...,
|
||||
description="是否开启容量管控。true=开启,false=关闭。全局配置关闭表示全局不限制;用户配置关闭表示该用户个人明确关闭限制,优先级高于全局。",
|
||||
examples=[True],
|
||||
)
|
||||
limit_value: Decimal | None = Field(
|
||||
None,
|
||||
description="容量数值,最小1,不能为负数,最多3位小数。例如:1、10、10.5、10.500。enabled=true 时必填。",
|
||||
examples=["10.500"],
|
||||
)
|
||||
limit_unit: ResourceCapacityUnitEnum | None = Field(
|
||||
None,
|
||||
description="容量单位枚举:MB=1024*1024字节,GB=1024*1024*1024字节,TB=1024*1024*1024*1024字节。enabled=true 时必填。",
|
||||
examples=[ResourceCapacityUnitEnum.GB.value],
|
||||
)
|
||||
|
||||
@field_validator("limit_value")
|
||||
@classmethod
|
||||
def validate_limit_value(cls, value: Decimal | None) -> Decimal | None:
|
||||
if value is None:
|
||||
return value
|
||||
if value < Decimal("1"):
|
||||
raise ValueError("容量数值不能小于1")
|
||||
if value.as_tuple().exponent < -3:
|
||||
raise ValueError("容量数值最多支持3位小数")
|
||||
return value
|
||||
|
||||
@model_validator(mode="after")
|
||||
def validate_enabled_payload(self) -> "ResourceCapacityConfigUpdate":
|
||||
if self.enabled:
|
||||
if self.limit_value is None:
|
||||
raise ValueError("开启容量管控时必须填写容量数值")
|
||||
if self.limit_unit is None:
|
||||
raise ValueError("开启容量管控时必须选择容量单位:MB、GB、TB")
|
||||
return self
|
||||
|
||||
|
||||
class ResourceCapacityConfigOut(BaseModel):
|
||||
enabled: bool = Field(..., description="是否开启容量管控")
|
||||
limit_value: str = Field(..., description="容量数值字符串,最多3位小数")
|
||||
limit_unit: ResourceCapacityUnitEnum = Field(..., description="容量单位枚举:MB、GB、TB")
|
||||
limit_bytes: int = Field(..., ge=0, description="按单位换算后的字节数")
|
||||
|
||||
|
||||
class ResourceCapacityUsageOut(BaseModel):
|
||||
enabled: bool = Field(..., description="当前用户最终是否启用容量管控")
|
||||
source: ResourceCapacitySourceEnum = Field(..., description="最终配置来源:user=用户个人配置,global=全局配置,disabled=容量管控未开启")
|
||||
has_user_config: bool = Field(..., description="该用户是否存在个人容量配置记录。注意:存在且 enabled=false 表示用户个人明确关闭限制")
|
||||
used_bytes: int = Field(..., ge=0, description="当前用户已用有效资源容量,来自 UserResourceTotalStat.active_size_bytes")
|
||||
available_bytes: int | None = Field(None, description="当前用户可用容量字节数。未开启容量管控时为 null")
|
||||
total_bytes: int | None = Field(None, description="当前用户总容量字节数。未开启容量管控时为 null")
|
||||
usage_percent: float | None = Field(None, description="当前用户容量使用百分比,未开启容量管控时为 null")
|
||||
exceeded: bool = Field(..., description="是否已超额。判断规则:enabled=true 且 used_bytes >= total_bytes")
|
||||
limit_value: str | None = Field(None, description="最终生效容量数值。未开启容量管控时为 null")
|
||||
limit_unit: ResourceCapacityUnitEnum | None = Field(None, description="最终生效容量单位。未开启容量管控时为 null")
|
||||
|
||||
|
||||
class AdminUserResourceCapacityOut(BaseModel):
|
||||
has_user_config: bool = Field(..., description="该用户是否已单独设置容量配置")
|
||||
user_config: ResourceCapacityConfigOut | None = Field(None, description="用户个人容量配置。未单独设置时为 null")
|
||||
global_config: ResourceCapacityConfigOut = Field(..., description="当前全局容量配置")
|
||||
effective: ResourceCapacityUsageOut = Field(..., description="该用户最终生效的容量使用数据")
|
||||
@@ -1,5 +1,7 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
from app.schemas.resource_capacity import ResourceCapacityUsageOut
|
||||
|
||||
|
||||
class UserOut(BaseModel):
|
||||
id: str
|
||||
@@ -12,5 +14,6 @@ class UserOut(BaseModel):
|
||||
user_type: str = "frontend"
|
||||
allowed_menus: list | None = None
|
||||
must_set_password: bool = False
|
||||
resource_capacity: ResourceCapacityUsageOut | None = None
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
Reference in New Issue
Block a user