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]]