fix(projects+assets): 项目封面引用真实商品图 + 资产库排除软删资产

- 项目卡封面:废弃「项目名关键词→静态 mock 假图」映射(与真实数据脱节,导致全是假面膜图),
  改用后端 cover_preview_url(取商品 cover_asset 主图);无商品图 → 干净占位
- 资产库 queryset/summary/facets 补 is_deleted=False:软删资产不再出现在资产库与 tab 计数
  (此前 is_deleted 字段在资产库未生效,软删无效)
- 单测 AssetSoftDeleteTests:列表 + 计数均排除软删

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
seaislee1209
2026-06-21 19:44:45 +08:00
co-authored by Claude Opus 4.8
parent c6e9c7e77b
commit 9e791a4db9
4 changed files with 56 additions and 21 deletions
+19
View File
@@ -86,6 +86,25 @@ class ModelLibraryApiTests(TestCase):
self.assertEqual(model.portrait_asset.category, Asset.Category.MODEL_PORTRAIT)
class AssetSoftDeleteTests(TestCase):
"""资产库不展示软删资产(is_deleted=True):列表 + tab 计数都排除。"""
def setUp(self):
self.user, self.team = _mk_team("usd", "TeamSD")
self.client = APIClient()
self.client.force_authenticate(self.user)
self.live = Asset.objects.create(team=self.team, name="留存图", asset_type="image", source="ai_generated", category=Asset.Category.PERSON)
self.dead = Asset.objects.create(team=self.team, name="废图", asset_type="image", source="ai_generated", category=Asset.Category.PERSON, is_deleted=True)
def test_list_excludes_soft_deleted(self):
ids = {a["id"] for a in self.client.get("/api/assets/?page_size=50").json()["results"]}
self.assertIn(str(self.live.id), ids)
self.assertNotIn(str(self.dead.id), ids)
def test_summary_excludes_soft_deleted(self):
self.assertEqual(self.client.get("/api/assets/summary/").json()["people"], 1)
class ReviewScopeTests(TestCase):
"""送审范围 = 角色定妆照(person)/ 三视图(tri_view)/ 分镜图(storyboard);图片趴不送审。"""