fix(compute): 修复图标/系列接口 AsyncSession 未 await 导致的 500
- list_icons/list_series 等 20 处 db.session.execute/get/commit 补 await - series_to_dict/icon_to_dict 的图标 URL 统一 resolve_url 补全(兼容相对路径) - 全局核查:其余 execute 均为 sqlite 同步连接,无同类问题
This commit is contained in:
@@ -48,7 +48,7 @@ def series_to_dict(s: ComputeSeries) -> dict:
|
||||
"name": s.name,
|
||||
"display_name": s.display_name,
|
||||
"supplier": s.supplier,
|
||||
"icon": s.icon,
|
||||
"icon": resolve_url(s.icon or s.icon_file),
|
||||
"icon_file": s.icon_file,
|
||||
"description": s.description,
|
||||
"sort_order": s.sort_order,
|
||||
@@ -119,8 +119,8 @@ async def list_series(
|
||||
stmt = stmt.where(and_(*conditions))
|
||||
stmt = stmt.order_by(ComputeSeries.sort_order.asc(), ComputeSeries.created_at.desc())
|
||||
|
||||
total = len(list(db.session.execute(stmt).scalars()))
|
||||
items = list(db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size)).scalars())
|
||||
total = len(list((await db.session.execute(stmt)).scalars()))
|
||||
items = list((await db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size))).scalars())
|
||||
return {
|
||||
"items": [series_to_dict(s) for s in items],
|
||||
"total": total,
|
||||
@@ -141,7 +141,7 @@ async def series_options(
|
||||
if status:
|
||||
stmt = stmt.where(ComputeSeries.status == status)
|
||||
stmt = stmt.order_by(ComputeSeries.sort_order.asc(), ComputeSeries.name.asc())
|
||||
items = list(db.session.execute(stmt).scalars())
|
||||
items = list((await db.session.execute(stmt)).scalars())
|
||||
return {
|
||||
"items": [
|
||||
{
|
||||
@@ -163,7 +163,7 @@ async def get_series(
|
||||
user: dict = Depends(get_current_user),
|
||||
):
|
||||
check_role(user, ["operator", "park_admin", "enterprise_admin"])
|
||||
s = db.session.get(ComputeSeries, series_id)
|
||||
s = await db.session.get(ComputeSeries, series_id)
|
||||
if not s:
|
||||
raise HTTPException(status_code=404, detail="系列不存在")
|
||||
return series_to_dict(s)
|
||||
@@ -177,9 +177,9 @@ async def create_series(
|
||||
):
|
||||
check_role(user, ["operator", "park_admin"])
|
||||
# 检查名称唯一性
|
||||
existing = db.session.execute(
|
||||
existing = (await db.session.execute(
|
||||
select(ComputeSeries).where(ComputeSeries.name == body.name)
|
||||
).scalar_one_or_none()
|
||||
)).scalar_one_or_none()
|
||||
if existing:
|
||||
raise HTTPException(status_code=400, detail=f"系列名称「{body.name}」已存在")
|
||||
|
||||
@@ -198,7 +198,7 @@ async def create_series(
|
||||
updated_at=now,
|
||||
)
|
||||
db.session.add(s)
|
||||
db.session.commit()
|
||||
await db.session.commit()
|
||||
await write_audit(db, user, "create_compute_series", f"创建系列 {body.name}")
|
||||
return series_to_dict(s)
|
||||
|
||||
@@ -211,16 +211,16 @@ async def update_series(
|
||||
user: dict = Depends(get_current_user),
|
||||
):
|
||||
check_role(user, ["operator", "park_admin"])
|
||||
s = db.session.get(ComputeSeries, series_id)
|
||||
s = await db.session.get(ComputeSeries, series_id)
|
||||
if not s:
|
||||
raise HTTPException(status_code=404, detail="系列不存在")
|
||||
# 检查名称唯一性(排除自身)
|
||||
if body.name != s.name:
|
||||
existing = db.session.execute(
|
||||
existing = (await db.session.execute(
|
||||
select(ComputeSeries).where(
|
||||
and_(ComputeSeries.name == body.name, ComputeSeries.id != series_id)
|
||||
)
|
||||
).scalar_one_or_none()
|
||||
)).scalar_one_or_none()
|
||||
if existing:
|
||||
raise HTTPException(status_code=400, detail=f"系列名称「{body.name}」已存在")
|
||||
|
||||
@@ -233,7 +233,7 @@ async def update_series(
|
||||
s.sort_order = body.sort_order
|
||||
s.status = body.status
|
||||
s.updated_at = now_str()
|
||||
db.session.commit()
|
||||
await db.session.commit()
|
||||
await write_audit(db, user, "update_compute_series", f"更新系列 {body.name}")
|
||||
return series_to_dict(s)
|
||||
|
||||
@@ -245,12 +245,12 @@ async def delete_series(
|
||||
user: dict = Depends(get_current_user),
|
||||
):
|
||||
check_role(user, ["operator", "park_admin"])
|
||||
s = db.session.get(ComputeSeries, series_id)
|
||||
s = await db.session.get(ComputeSeries, series_id)
|
||||
if not s:
|
||||
raise HTTPException(status_code=404, detail="系列不存在")
|
||||
name = s.name
|
||||
db.session.delete(s)
|
||||
db.session.commit()
|
||||
await db.session.commit()
|
||||
await write_audit(db, user, "delete_compute_series", f"删除系列 {name}")
|
||||
return {"ok": True, "message": f"已删除系列 {name}"}
|
||||
|
||||
@@ -301,8 +301,8 @@ async def list_icons(
|
||||
stmt = stmt.where(and_(*conditions))
|
||||
stmt = stmt.order_by(ComputeIcon.created_at.desc())
|
||||
|
||||
total = len(list(db.session.execute(stmt).scalars()))
|
||||
items = list(db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size)).scalars())
|
||||
total = len(list((await db.session.execute(stmt)).scalars()))
|
||||
items = list((await db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size))).scalars())
|
||||
return {
|
||||
"items": [icon_to_dict(i) for i in items],
|
||||
"total": total,
|
||||
@@ -332,7 +332,7 @@ async def icon_options(
|
||||
if conditions:
|
||||
stmt = stmt.where(and_(*conditions))
|
||||
stmt = stmt.order_by(ComputeIcon.name.asc())
|
||||
items = list(db.session.execute(stmt).scalars())
|
||||
items = list((await db.session.execute(stmt)).scalars())
|
||||
return {
|
||||
"items": [
|
||||
{
|
||||
@@ -353,7 +353,7 @@ async def get_icon(
|
||||
user: dict = Depends(get_current_user),
|
||||
):
|
||||
check_role(user, ["operator", "park_admin", "enterprise_admin"])
|
||||
i = db.session.get(ComputeIcon, icon_id)
|
||||
i = await db.session.get(ComputeIcon, icon_id)
|
||||
if not i:
|
||||
raise HTTPException(status_code=404, detail="图标不存在")
|
||||
return icon_to_dict(i)
|
||||
@@ -384,7 +384,7 @@ async def create_icon(
|
||||
updated_at=now,
|
||||
)
|
||||
db.session.add(i)
|
||||
db.session.commit()
|
||||
await db.session.commit()
|
||||
await write_audit(db, user, "create_compute_icon", f"创建图标 {body.name}")
|
||||
return icon_to_dict(i)
|
||||
|
||||
@@ -397,7 +397,7 @@ async def update_icon(
|
||||
user: dict = Depends(get_current_user),
|
||||
):
|
||||
check_role(user, ["operator", "park_admin"])
|
||||
i = db.session.get(ComputeIcon, icon_id)
|
||||
i = await db.session.get(ComputeIcon, icon_id)
|
||||
if not i:
|
||||
raise HTTPException(status_code=404, detail="图标不存在")
|
||||
i.name = body.name
|
||||
@@ -411,7 +411,7 @@ async def update_icon(
|
||||
i.description = body.description
|
||||
i.status = body.status
|
||||
i.updated_at = now_str()
|
||||
db.session.commit()
|
||||
await db.session.commit()
|
||||
await write_audit(db, user, "update_compute_icon", f"更新图标 {body.name}")
|
||||
return icon_to_dict(i)
|
||||
|
||||
@@ -423,11 +423,11 @@ async def delete_icon(
|
||||
user: dict = Depends(get_current_user),
|
||||
):
|
||||
check_role(user, ["operator", "park_admin"])
|
||||
i = db.session.get(ComputeIcon, icon_id)
|
||||
i = await db.session.get(ComputeIcon, icon_id)
|
||||
if not i:
|
||||
raise HTTPException(status_code=404, detail="图标不存在")
|
||||
name = i.name
|
||||
db.session.delete(i)
|
||||
db.session.commit()
|
||||
await db.session.commit()
|
||||
await write_audit(db, user, "delete_compute_icon", f"删除图标 {name}")
|
||||
return {"ok": True, "message": f"已删除图标 {name}"}
|
||||
|
||||
Reference in New Issue
Block a user