You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
10 KiB
Python
432 lines
10 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import Field
|
|
|
|
from iti.schemas import ItiModel
|
|
|
|
from iti_system.enums import GenderEnum, LogType, MenuTypeEnum, StatusEnum
|
|
|
|
|
|
class PageQuery(ItiModel):
|
|
page: int = 1
|
|
size: int = 10
|
|
|
|
|
|
class UserOut(ItiModel):
|
|
id: str
|
|
username: str
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
realname: str | None = None
|
|
desc: str | None = None
|
|
avatar: str | None = None
|
|
gender: str = GenderEnum.SECURE.value
|
|
status: str = StatusEnum.ENABLED.value
|
|
roles: list[str] = Field(default_factory=list)
|
|
depts: list[str] = Field(default_factory=list)
|
|
permissions: list[str] = Field(default_factory=list)
|
|
attributes: dict[str, dict[str, Any]] = Field(default_factory=dict)
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class UserQuery(PageQuery):
|
|
keyword: str | None = None
|
|
username: str | None = None
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
realname: str | None = None
|
|
gender: str | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class UserCreate(ItiModel):
|
|
username: str
|
|
password: str | None = None
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
realname: str | None = None
|
|
desc: str | None = None
|
|
avatar: str | None = None
|
|
gender: str = GenderEnum.SECURE.value
|
|
status: str = StatusEnum.ENABLED.value
|
|
roles: list[str] = Field(default_factory=list)
|
|
depts: list[str] = Field(default_factory=list)
|
|
|
|
|
|
class UserUpdate(ItiModel):
|
|
username: str | None = None
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
realname: str | None = None
|
|
desc: str | None = None
|
|
avatar: str | None = None
|
|
gender: str | None = None
|
|
status: str | None = None
|
|
roles: list[str] | None = None
|
|
depts: list[str] | None = None
|
|
|
|
|
|
class PasswordLogin(ItiModel):
|
|
username: str | None = None
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
password: str
|
|
auto_register: bool = False
|
|
|
|
|
|
class CodeLogin(ItiModel):
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
code: str
|
|
auto_register: bool = False
|
|
|
|
|
|
class RegisterIn(ItiModel):
|
|
username: str | None = None
|
|
password: str | None = None
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
code: str | None = None
|
|
realname: str | None = None
|
|
avatar: str | None = None
|
|
gender: str = GenderEnum.SECURE.value
|
|
status: str = StatusEnum.ENABLED.value
|
|
auto_login: bool = True
|
|
|
|
|
|
class SendVerificationCodeIn(ItiModel):
|
|
phone: str | None = None
|
|
email: str | None = None
|
|
usage: str = "login"
|
|
|
|
|
|
class PasswordUpdate(ItiModel):
|
|
old_password: str | None = None
|
|
new_password: str
|
|
code: str | None = None
|
|
type: str = "updateByOldPassword"
|
|
|
|
|
|
class RoleOut(ItiModel):
|
|
id: str
|
|
name: str
|
|
code: str
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
permissions: list[str] = Field(default_factory=list)
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class RoleQuery(PageQuery):
|
|
keyword: str | None = None
|
|
name: str | None = None
|
|
code: str | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class RoleCreate(ItiModel):
|
|
name: str
|
|
code: str
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
permissions: list[str] = Field(default_factory=list)
|
|
|
|
|
|
class RoleUpdate(ItiModel):
|
|
name: str | None = None
|
|
code: str | None = None
|
|
desc: str | None = None
|
|
sort: int | None = None
|
|
status: str | None = None
|
|
permissions: list[str] | None = None
|
|
|
|
|
|
class MenuOut(ItiModel):
|
|
id: str
|
|
name: str
|
|
type: str = MenuTypeEnum.MENU.value
|
|
path: str | None = None
|
|
component: str | None = None
|
|
redirect: str | None = None
|
|
sort: int = 0
|
|
auth_code: str | None = None
|
|
meta: dict[str, Any] | None = None
|
|
status: str = StatusEnum.ENABLED.value
|
|
parent_id: str | None = None
|
|
children: list["MenuOut"] = Field(default_factory=list)
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class MenuCreate(ItiModel):
|
|
id: str | None = None
|
|
name: str
|
|
type: str = MenuTypeEnum.MENU.value
|
|
path: str | None = None
|
|
component: str | None = None
|
|
redirect: str | None = None
|
|
sort: int = 0
|
|
auth_code: str | None = None
|
|
meta: dict[str, Any] | None = None
|
|
status: str = StatusEnum.ENABLED.value
|
|
parent_id: str | None = None
|
|
|
|
|
|
class MenuUpdate(ItiModel):
|
|
name: str | None = None
|
|
type: str | None = None
|
|
path: str | None = None
|
|
component: str | None = None
|
|
redirect: str | None = None
|
|
sort: int | None = None
|
|
auth_code: str | None = None
|
|
meta: dict[str, Any] | None = None
|
|
status: str | None = None
|
|
parent_id: str | None = None
|
|
|
|
|
|
class DeptOut(ItiModel):
|
|
id: str
|
|
name: str
|
|
parent_id: str | None = None
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
leader_id: str | None = None
|
|
status: str = StatusEnum.ENABLED.value
|
|
children: list["DeptOut"] = Field(default_factory=list)
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class DeptQuery(PageQuery):
|
|
keyword: str | None = None
|
|
name: str | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class DeptCreate(ItiModel):
|
|
name: str
|
|
parent_id: str | None = None
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
leader_id: str | None = None
|
|
status: str = StatusEnum.ENABLED.value
|
|
|
|
|
|
class DeptUpdate(ItiModel):
|
|
name: str | None = None
|
|
parent_id: str | None = None
|
|
desc: str | None = None
|
|
sort: int | None = None
|
|
leader_id: str | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class ConfigOut(ItiModel):
|
|
id: str
|
|
type: str
|
|
name: str
|
|
code: str
|
|
value: str | None = None
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class ConfigQuery(PageQuery):
|
|
keyword: str | None = None
|
|
type: str | None = None
|
|
code: str | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class ConfigCreate(ItiModel):
|
|
type: str = "SYSTEM"
|
|
name: str
|
|
code: str
|
|
value: str | None = None
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
|
|
|
|
class ConfigUpdate(ItiModel):
|
|
type: str | None = None
|
|
name: str | None = None
|
|
code: str | None = None
|
|
value: str | None = None
|
|
desc: str | None = None
|
|
sort: int | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class DictTypeOut(ItiModel):
|
|
id: str
|
|
type_name: str
|
|
type_code: str
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
data_list: list["DictDataOut"] = Field(default_factory=list)
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class DictDataOut(ItiModel):
|
|
id: str
|
|
type_code: str
|
|
label: str
|
|
code: str
|
|
value: str | None = None
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class DictTypeQuery(PageQuery):
|
|
keyword: str | None = None
|
|
type_code: str | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class DictDataQuery(PageQuery):
|
|
keyword: str | None = None
|
|
type_code: str | None = None
|
|
code: str | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class DictTypeCreate(ItiModel):
|
|
type_name: str
|
|
type_code: str
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
|
|
|
|
class DictTypeUpdate(ItiModel):
|
|
type_name: str | None = None
|
|
type_code: str | None = None
|
|
desc: str | None = None
|
|
sort: int | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class DictDataCreate(ItiModel):
|
|
type_code: str
|
|
label: str
|
|
code: str
|
|
value: str | None = None
|
|
desc: str | None = None
|
|
sort: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
|
|
|
|
class DictDataUpdate(ItiModel):
|
|
type_code: str | None = None
|
|
label: str | None = None
|
|
code: str | None = None
|
|
value: str | None = None
|
|
desc: str | None = None
|
|
sort: int | None = None
|
|
status: str | None = None
|
|
|
|
|
|
class LogOut(ItiModel):
|
|
id: str
|
|
name: str | None = None
|
|
method: str | None = None
|
|
user_id: str | None = None
|
|
path: str | None = None
|
|
ip: str | None = None
|
|
user_agent: str | None = None
|
|
execution_time: float | None = None
|
|
success: bool | None = None
|
|
desc: str | None = None
|
|
type: str = LogType.OPERATION.value
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class LogQuery(PageQuery):
|
|
keyword: str | None = None
|
|
user_id: str | None = None
|
|
type: str | None = None
|
|
success: bool | None = None
|
|
|
|
|
|
class AuditEventIn(ItiModel):
|
|
type: str = LogType.OPERATION.value
|
|
title: str
|
|
success: bool = True
|
|
actor_id: str | None = None
|
|
actor_type: str | None = None
|
|
method: str | None = None
|
|
path: str | None = None
|
|
ip: str | None = None
|
|
user_agent: str | None = None
|
|
target_type: str | None = None
|
|
target_id: str | None = None
|
|
diff: dict[str, Any] | None = None
|
|
desc: str | None = None
|
|
error: str | None = None
|
|
trace_id: str | None = None
|
|
occurred_at: datetime | None = None
|
|
|
|
|
|
class AuditEventsIn(ItiModel):
|
|
events: list[AuditEventIn] = Field(default_factory=list)
|
|
|
|
|
|
class FileOut(ItiModel):
|
|
id: str
|
|
filename: str
|
|
file_key: str
|
|
file_hash: str | None = None
|
|
mime_type: str | None = None
|
|
file_size: int = 0
|
|
extension: str | None = None
|
|
storage_type: str = "local"
|
|
storage_info: dict[str, Any] | None = None
|
|
directory_id: str | None = None
|
|
metadata_: dict[str, Any] | None = Field(default=None, serialization_alias="metadata")
|
|
is_deleted: bool = False
|
|
share_code: str | None = None
|
|
share_expire_at: datetime | None = None
|
|
share_count: int = 0
|
|
status: str = StatusEnum.ENABLED.value
|
|
url: str | None = None
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class FileShareIn(ItiModel):
|
|
password: str | None = None
|
|
expires_seconds: int | None = None
|
|
|
|
|
|
class AttributeSet(ItiModel):
|
|
attributes: dict[str, dict[str, Any]]
|
|
|
|
|
|
class AttributeItem(ItiModel):
|
|
value: Any = None
|
|
attr_type: str = "string"
|
|
description: str | None = None
|
|
sort: int = 0
|
|
|
|
|
|
class AttributeBatch(ItiModel):
|
|
items: dict[str, dict[str, Any]]
|