模特库标签分页与全能创作收口:藏长视频、选择器分页

角色库导入打标签并支持筛选;模特库与全能创作角色/商品选择改为每页 20 条分页。临时限制成片 ≤60 秒,过滤对话里的超长时长选项,并收拢本地全能创作与后台用户相关修复。
This commit is contained in:
Azmat@qq.com
2026-09-21 16:24:37 +08:00
parent 690eb3d843
commit 0bd1db6bf9
48 changed files with 3386 additions and 896 deletions
+40 -9
View File
@@ -888,22 +888,52 @@ class ReviewScopeTests(TestCase):
("person", "model_portrait", "tri_view", "storyboard", "scene", "product_image"),
)
def test_poll_team_reviews_only_scans_review_categories(self):
def test_poll_only_covers_assets_that_really_reached_volcano(self):
"""轮询的判据是「拿到了火山远端 Id」,不是类别。
force 送审的上传视频、临时图也会是 processing,worker 必须盯到绿/红;
反过来,没有远端 Id 的 processing 是没真正送出去的,轮它只会白打请求。
送审范围仍然只挑 REVIEW_CATEGORIES(见下一条)。
"""
from apps.assets import review
_, team = _mk_team("uc", "TeamC")
keep = {}
polled = {}
for cat in ("person", "model_portrait", "tri_view", "storyboard", "scene", "product_image"):
a = Asset.objects.create(team=team, name=cat, asset_type="image", source="ai_generated",
category=cat, review_status="processing")
keep[cat] = str(a.id)
# 图片趴:不应进送审队列
for cat in ("model_tryon", "platform_kit", "free_create"):
Asset.objects.create(team=team, name=cat, asset_type="image", source="ai_generated",
category=cat, review_status="processing")
category=cat, review_status="processing",
review_remote_id=f"remote-{cat}")
polled[cat] = str(a.id)
# 图片趴不在送审范围里,但已经 force 送出去的同样要盯到终态。
forced = Asset.objects.create(
team=team, name="force", asset_type="image", source="ai_generated",
category="free_create", review_status="processing", review_remote_id="remote-force",
)
# 没有远端 Id = 没真送出去,不该被轮询。
Asset.objects.create(team=team, name="没送出去", asset_type="image", source="ai_generated",
category="person", review_status="processing")
with patch("apps.assets.review.assets_client.is_enabled", return_value=False):
out = review.poll_team_reviews(team)
self.assertEqual(set(out.keys()), set(keep.values()))
self.assertEqual(set(out.keys()), set(polled.values()) | {str(forced.id)})
def test_submission_still_only_covers_review_categories(self):
from apps.assets import review
_, team = _mk_team("uc-sub", "TeamCSub")
for cat in ("person", "product_image"):
Asset.objects.create(team=team, name=cat, asset_type="image", source="ai_generated",
category=cat, review_status="")
for cat in ("model_tryon", "platform_kit", "free_create"):
Asset.objects.create(team=team, name=cat, asset_type="image", source="ai_generated",
category=cat, review_status="")
with patch("apps.assets.review.submit_asset_for_review", return_value=True) as sub:
review.submit_unsubmitted_reviews(team=team)
submitted = {asset.category for (asset,), _ in (call for call in sub.call_args_list)}
self.assertEqual(submitted, {"person", "product_image"})
def test_poll_team_reviews_auto_submits_unsubmitted(self):
from apps.assets import review
@@ -931,6 +961,7 @@ class ReviewScopeTests(TestCase):
proc = Asset.objects.create(
team=team, name="审中", asset_type="image", source="ai_generated",
category=Asset.Category.PERSON, review_status="processing",
review_remote_id="remote-proc", # 只有真的送到火山、拿到 Id 的才会被轮询
)
with patch("apps.assets.review.submit_asset_for_review", return_value=True) as sub, patch(
"apps.assets.review.poll_asset_review", return_value="active"