mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-07 04:40:00 +08:00
✨ Compatible with pydantic 2.0 using the pydantic compatibility layer provided by nonebot
This commit is contained in:
@@ -14,11 +14,11 @@ router = APIRouter(prefix="/menu")
|
||||
@router.get(
|
||||
"/get_menus",
|
||||
dependencies=[authentication()],
|
||||
response_model=Result[list[MenuData]],
|
||||
response_model=Result[MenuData],
|
||||
response_class=JSONResponse,
|
||||
description="获取菜单列表",
|
||||
)
|
||||
async def _() -> Result[list[MenuData]]:
|
||||
async def _() -> Result[MenuData]:
|
||||
try:
|
||||
return Result.ok(menu_manage.get_menus(), "拿到菜单了哦!")
|
||||
except Exception as e:
|
||||
|
||||
@@ -56,7 +56,7 @@ class MenuManage:
|
||||
|
||||
def save(self):
|
||||
self.file.parent.mkdir(parents=True, exist_ok=True)
|
||||
temp = [menu.dict() for menu in self.menu]
|
||||
temp = [menu.to_dict() for menu in self.menu]
|
||||
with self.file.open("w", encoding="utf8") as f:
|
||||
json.dump(temp, f, ensure_ascii=False, indent=4)
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from nonebot.compat import model_dump
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
@@ -13,6 +14,9 @@ class MenuItem(BaseModel):
|
||||
default: bool = False
|
||||
"""默认选中"""
|
||||
|
||||
def to_dict(self, **kwargs):
|
||||
return model_dump(self, **kwargs)
|
||||
|
||||
|
||||
class MenuData(BaseModel):
|
||||
bot_type: str = "zhenxun"
|
||||
|
||||
@@ -14,7 +14,13 @@ from zhenxun.utils.platform import PlatformUtils
|
||||
|
||||
from ....base_model import BaseResultModel, QueryModel
|
||||
from ..main.data_source import bot_live
|
||||
from .model import AllChatAndCallCount, BotInfo, ChatCallMonthCount, QueryChatCallCount
|
||||
from .model import (
|
||||
AllChatAndCallCount,
|
||||
BotConnectLogInfo,
|
||||
BotInfo,
|
||||
ChatCallMonthCount,
|
||||
QueryChatCallCount,
|
||||
)
|
||||
|
||||
driver: Driver = nonebot.get_driver()
|
||||
|
||||
@@ -235,6 +241,12 @@ class ApiDataSource:
|
||||
.offset((query.index - 1) * query.size)
|
||||
.limit(query.size)
|
||||
)
|
||||
result_list = []
|
||||
for v in data:
|
||||
v.connect_time = v.connect_time.replace(tzinfo=None).replace(microsecond=0)
|
||||
return BaseResultModel(total=total, data=data)
|
||||
result_list.append(
|
||||
BotConnectLogInfo(
|
||||
bot_id=v.bot_id, connect_time=v.connect_time, type=v.type
|
||||
)
|
||||
)
|
||||
return BaseResultModel(total=total, data=result_list)
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class BotConnectLogInfo(BaseModel):
|
||||
bot_id: str
|
||||
"""机器人ID"""
|
||||
connect_time: datetime
|
||||
"""连接日期"""
|
||||
type: int
|
||||
"""连接类型"""
|
||||
|
||||
|
||||
class BotInfo(BaseModel):
|
||||
self_id: str
|
||||
"""SELF ID"""
|
||||
|
||||
@@ -12,7 +12,7 @@ from zhenxun.services.log import logger
|
||||
from ....base_model import BaseResultModel, QueryModel, Result
|
||||
from ....utils import authentication
|
||||
from .data_source import ApiDataSource, type2sql
|
||||
from .models.model import Column, SqlModel, SqlText
|
||||
from .models.model import Column, SqlLogInfo, SqlModel, SqlText
|
||||
from .models.sql_log import SqlLog
|
||||
|
||||
router = APIRouter(prefix="/database")
|
||||
@@ -125,7 +125,8 @@ async def _(query: QueryModel) -> Result[BaseResultModel]:
|
||||
.offset((query.index - 1) * query.size)
|
||||
.limit(query.size)
|
||||
)
|
||||
return Result.ok(BaseResultModel(total=total, data=data))
|
||||
result_list = [SqlLogInfo(sql=e.sql) for e in data]
|
||||
return Result.ok(BaseResultModel(total=total, data=result_list))
|
||||
except Exception as e:
|
||||
logger.error(f"{router.prefix}/get_sql_log 调用错误", "WebUi", e=e)
|
||||
return Result.fail(f"发生了一点错误捏 {type(e)}: {e}")
|
||||
|
||||
@@ -3,6 +3,11 @@ from pydantic import BaseModel
|
||||
from zhenxun.utils.plugin_models.base import CommonSql
|
||||
|
||||
|
||||
class SqlLogInfo(BaseModel):
|
||||
sql: str
|
||||
"""sql语句"""
|
||||
|
||||
|
||||
class SqlText(BaseModel):
|
||||
"""
|
||||
sql语句
|
||||
|
||||
@@ -37,7 +37,7 @@ class BotLive:
|
||||
self._data = {}
|
||||
|
||||
def add(self, bot_id: str):
|
||||
self._data[bot_id] = time.time()
|
||||
self._data[bot_id] = int(time.time())
|
||||
|
||||
def get(self, bot_id: str) -> int | None:
|
||||
return self._data.get(bot_id)
|
||||
@@ -154,7 +154,7 @@ class ApiDataSource:
|
||||
for bot in bot_list:
|
||||
bot.bot = None # type: ignore
|
||||
select_bot.is_select = True
|
||||
return [BaseInfo(**e.dict()) for e in bot_list]
|
||||
return [BaseInfo(**e.to_dict()) for e in bot_list]
|
||||
|
||||
@classmethod
|
||||
async def get_all_chat_count(cls, bot_id: str | None) -> QueryCount:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from typing import Any
|
||||
|
||||
from nonebot.adapters import Bot
|
||||
from nonebot.compat import model_dump
|
||||
from nonebot.config import Config
|
||||
from pydantic import BaseModel
|
||||
|
||||
@@ -86,6 +87,9 @@ class BaseInfo(BaseModel):
|
||||
class Config:
|
||||
arbitrary_types_allowed = True
|
||||
|
||||
def to_dict(self, **kwargs):
|
||||
return model_dump(self, **kwargs)
|
||||
|
||||
|
||||
class TemplateBaseInfo(BaseInfo):
|
||||
"""
|
||||
|
||||
@@ -100,4 +100,4 @@ async def _(
|
||||
name=uname,
|
||||
ava_url=AVA_URL.format(session.user.id),
|
||||
)
|
||||
await ws_conn.send_json(data.dict())
|
||||
await ws_conn.send_json(data.to_dict())
|
||||
|
||||
@@ -107,7 +107,7 @@ class ApiDataSource:
|
||||
"""
|
||||
bot = nonebot.get_bot(bot_id)
|
||||
friend_list, _ = await PlatformUtils.get_friend_list(bot)
|
||||
fd = [x for x in friend_list if x == user_id]
|
||||
fd = [x for x in friend_list if x.user_id == user_id]
|
||||
if not fd:
|
||||
return None
|
||||
like_plugin_list = (
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from nonebot.compat import model_dump
|
||||
from pydantic import BaseModel
|
||||
|
||||
from zhenxun.utils.enum import RequestType
|
||||
@@ -256,6 +257,9 @@ class Message(BaseModel):
|
||||
ava_url: str
|
||||
"""用户头像"""
|
||||
|
||||
def to_dict(self, **kwargs):
|
||||
return model_dump(self, **kwargs)
|
||||
|
||||
|
||||
class SendMessageParam(BaseModel):
|
||||
"""
|
||||
|
||||
@@ -41,11 +41,11 @@ async def _(
|
||||
@router.get(
|
||||
"/get_plugin_count",
|
||||
dependencies=[authentication()],
|
||||
response_model=Result[int],
|
||||
response_model=Result[PluginCount],
|
||||
response_class=JSONResponse,
|
||||
description="获取插件数量", # type: ignore
|
||||
)
|
||||
async def _() -> Result[int]:
|
||||
async def _() -> Result[PluginCount]:
|
||||
try:
|
||||
plugin_count = PluginCount()
|
||||
plugin_count.normal = await DbPluginInfo.filter(
|
||||
|
||||
@@ -3,6 +3,7 @@ from fastapi.responses import JSONResponse
|
||||
from nonebot import require
|
||||
|
||||
from zhenxun.models.plugin_info import PluginInfo
|
||||
from zhenxun.services.log import logger
|
||||
|
||||
from ....base_model import Result
|
||||
from ....utils import authentication
|
||||
@@ -25,7 +26,7 @@ async def _() -> Result[dict]:
|
||||
|
||||
data = await ShopManage.get_data()
|
||||
plugin_list = [
|
||||
{**data[name].dict(), "name": name, "id": idx}
|
||||
{**data[name].to_dict(), "name": name, "id": idx}
|
||||
for idx, name in enumerate(data)
|
||||
]
|
||||
modules = await PluginInfo.filter(load_status=True).values_list(
|
||||
@@ -33,6 +34,7 @@ async def _() -> Result[dict]:
|
||||
)
|
||||
return Result.ok({"install_module": modules, "plugin_list": plugin_list})
|
||||
except Exception as e:
|
||||
logger.error("获取插件商店插件信息失败", "WebUi", e=e)
|
||||
return Result.fail(f"获取插件商店插件信息失败: {type(e)}: {e}")
|
||||
|
||||
|
||||
|
||||
@@ -44,11 +44,11 @@ async def _(path: str | None = None) -> Result[list[DirFile]]:
|
||||
@router.get(
|
||||
"/get_resources_size",
|
||||
dependencies=[authentication()],
|
||||
response_model=Result[SystemFolderSize],
|
||||
response_model=Result[list[SystemFolderSize]],
|
||||
response_class=JSONResponse,
|
||||
description="获取文件列表",
|
||||
)
|
||||
async def _(full_path: str | None = None) -> Result[SystemFolderSize]:
|
||||
async def _(full_path: str | None = None) -> Result[list[SystemFolderSize]]:
|
||||
return Result.ok(await get_system_disk(full_path))
|
||||
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ class AddFile(BaseModel):
|
||||
新建文件
|
||||
"""
|
||||
|
||||
parent: str | None
|
||||
parent: str | None = None
|
||||
"""父路径"""
|
||||
name: str
|
||||
"""新名称"""
|
||||
|
||||
Reference in New Issue
Block a user