#!/usr/bin/env python # -*- coding: utf-8 -*- """ 大屏设计器 Schema 定义 """ from datetime import datetime from typing import Any, Dict, Optional from pydantic import BaseModel, ConfigDict, Field class ScreenProjectBase(BaseModel): """大屏项目基础信息""" application_id: Optional[str] = Field(None, description="所属应用ID") name: str = Field(..., description="项目名称") code: str = Field(..., pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="项目编码(字母开头,只能包含字母、数字和下划线)") description: str = Field(default='', description="项目描述") sort: int = Field(default=0, description="排序") class ScreenProjectCreateIn(ScreenProjectBase): """创建大屏项目请求""" screen_config: Dict[str, Any] = Field(default_factory=dict, description="大屏设计配置") thumbnail: str = Field(default='', description="缩略图") class ScreenProjectUpdateIn(BaseModel): """更新大屏项目请求""" name: Optional[str] = Field(default=None, description="项目名称") description: Optional[str] = Field(default=None, description="项目描述") sort: Optional[int] = Field(default=None, description="排序") screen_config: Optional[Dict[str, Any]] = Field(default=None, description="大屏设计配置") thumbnail: Optional[str] = Field(default=None, description="缩略图") class ScreenProjectOut(BaseModel): """大屏项目详情输出""" id: str application_id: Optional[str] = None name: str code: str description: str status: str version: int thumbnail: str screen_config: Dict[str, Any] sort: int access_password: str = Field(default='', description="访问密码") published_at: Optional[str] = Field(default=None, description="发布时间") sys_create_datetime: str sys_update_datetime: str model_config = ConfigDict(from_attributes=True) @classmethod def from_orm_model(cls, obj): """从ORM模型转换""" return cls( id=str(obj.id), application_id=obj.application_id, name=obj.name, code=obj.code, description=obj.description or '', status=obj.status or 'draft', version=obj.version or 1, thumbnail=obj.thumbnail or '', screen_config=obj.screen_config or {}, sort=obj.sort or 0, access_password=obj.access_password or '', published_at=obj.published_at.strftime('%Y-%m-%d %H:%M:%S') if obj.published_at else None, sys_create_datetime=obj.sys_create_datetime.strftime('%Y-%m-%d %H:%M:%S') if obj.sys_create_datetime else '', sys_update_datetime=obj.sys_update_datetime.strftime('%Y-%m-%d %H:%M:%S') if obj.sys_update_datetime else '', ) class ScreenProjectListOut(BaseModel): """大屏项目列表输出(不含screen_config)""" id: str application_id: Optional[str] = None name: str code: str description: str status: str version: int thumbnail: str sort: int access_password: str = Field(default='', description="访问密码") published_at: Optional[str] = Field(default=None, description="发布时间") sys_create_datetime: str sys_update_datetime: str model_config = ConfigDict(from_attributes=True) @classmethod def from_orm_model(cls, obj): """从ORM模型转换""" return cls( id=str(obj.id), application_id=obj.application_id, name=obj.name, code=obj.code, description=obj.description or '', status=obj.status or 'draft', version=obj.version or 1, thumbnail=obj.thumbnail or '', sort=obj.sort or 0, access_password=obj.access_password or '', published_at=obj.published_at.strftime('%Y-%m-%d %H:%M:%S') if obj.published_at else None, sys_create_datetime=obj.sys_create_datetime.strftime('%Y-%m-%d %H:%M:%S') if obj.sys_create_datetime else '', sys_update_datetime=obj.sys_update_datetime.strftime('%Y-%m-%d %H:%M:%S') if obj.sys_update_datetime else '', ) class ScreenExportOut(BaseModel): """大屏配置导出""" name: str code: str description: str screen_config: Dict[str, Any] class ScreenImportCheckIn(BaseModel): """大屏导入预检查请求""" code: str = Field(..., description="项目编码") class ScreenImportCheckOut(BaseModel): """大屏导入预检查结果""" code_exists: bool = Field(..., description="项目编码是否已存在") can_import: bool = Field(..., description="是否可以直接导入(编码不冲突)") class ScreenImportIn(BaseModel): """大屏配置导入""" application_id: Optional[str] = Field(None, description="所属应用ID") name: str = Field(..., description="项目名称") code: str = Field(..., description="项目编码") description: str = Field(default='', description="项目描述") screen_config: Dict[str, Any] = Field(default_factory=dict, description="大屏设计配置") class ScreenPublishIn(BaseModel): """发布大屏请求""" access_password: Optional[str] = Field(default=None, description="访问密码") class ScreenSetPasswordIn(BaseModel): """设置访问密码请求""" access_password: str = Field(default='', description="访问密码,空字符串表示清除密码")