feat(ai-studio): add main workspace tab

This commit is contained in:
chengma
2026-07-11 14:16:11 +08:00
parent ab99737e03
commit 5451579073
14 changed files with 1369 additions and 27 deletions
+45
View File
@@ -452,6 +452,51 @@ def list_assets(project_id, kind=None, include_missing=True, path=None, conn=Non
return _fetch_all(database, sql, params, ImageStudioAsset)
def asset_reference_counts(asset_id, path=None, conn=None):
"""Return selection/job references for one asset before pool removal."""
asset_id = int(asset_id)
with _connection(conn, path) as database:
selection_count = database.execute(
"SELECT COUNT(*) FROM image_studio_selections WHERE asset_id = ?",
(asset_id,),
).fetchone()[0]
source_job_count = database.execute(
"SELECT COUNT(*) FROM image_studio_jobs WHERE source_asset_id = ?",
(asset_id,),
).fetchone()[0]
output_job_count = database.execute(
"SELECT COUNT(*) FROM image_studio_jobs WHERE output_asset_id = ?",
(asset_id,),
).fetchone()[0]
return {
"selection": int(selection_count),
"source_job": int(source_job_count),
"output_job": int(output_job_count),
"total": int(selection_count + source_job_count + output_job_count),
}
def remove_asset_if_unused(asset_id, path=None, conn=None):
"""Remove one pool asset row only when no job or selection references it.
The local image file is intentionally kept on disk. AI工场 removal is a
pool-level operation, not a destructive file cleanup.
"""
asset_id = int(asset_id)
with _connection(conn, path) as database:
asset = get_asset(asset_id, conn=database)
if asset is None:
raise db.DbError("照片不存在")
counts = asset_reference_counts(asset_id, conn=database)
if counts["total"]:
raise db.DbError("照片正在被生成任务或终选引用,不能移除")
with database:
database.execute("DELETE FROM image_studio_assets WHERE id = ?", (asset_id,))
return asset
def sync_original_asset_urls(project_id, image_urls, path=None, conn=None):
"""Store the read-only Shopee main image URL snapshot as remote-only assets."""