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

角色库导入打标签并支持筛选;模特库与全能创作角色/商品选择改为每页 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
+43 -19
View File
@@ -337,6 +337,25 @@ def _character_triview_asset(team, portrait_id):
)
def _newest_asset(*assets):
"""多张可用图里取最新一张。已删/空值直接跳过。"""
living = [
asset for asset in assets
if asset is not None and not getattr(asset, "is_deleted", False)
]
if not living:
return None
return max(living, key=lambda asset: (asset.created_at, str(asset.id)))
def _single_entity_asset(cover, *triviews):
"""一个角色/商品只喂一张参考图:有三视图用最新三视图,没有才用封面/立绘。
封面和三视图衣服经常不一致;两张一起送,出片模型会当成多出来的角色或 SKU。
"""
return _newest_asset(*triviews) or cover
def _append_ref(resolved: ResolvedRefs, asset, type_: str, label: str) -> bool:
entry = _asset_reference(asset, type_, label)
if not entry:
@@ -386,12 +405,17 @@ def resolve_refs(team, refs: list[dict]) -> ResolvedRefs:
resolved.missing.append(ref)
continue
resolved.facts.append(product_facts_text(product))
chosen = _single_entity_asset(
product.cover_asset,
_product_triview_asset(product),
)
if chosen is not None and _append_ref(resolved, chosen, "product", product.title):
continue
entry = _product_reference(product)
if entry:
resolved.references.append(entry)
triview = _product_triview_asset(product)
if triview is not None:
_append_ref(resolved, triview, "product", f"{product.title}三视图")
elif chosen is None:
resolved.missing.append(ref)
continue
if type_ == "model":
model = Model.objects.filter(
@@ -413,13 +437,14 @@ def resolve_refs(team, refs: list[dict]) -> ResolvedRefs:
person_lines.extend(meta_lines)
if desc or meta_lines:
resolved.facts.append("\n".join(person_lines))
# 形象图和三视图都带上(有就带,没有不加、不报错)。三视图锁脸更稳。
added = False
if _append_ref(resolved, model.portrait_asset, "model", model.name):
added = True
if _append_ref(resolved, model.triview_asset, "model", f"{model.name}三视图"):
added = True
if not added:
# 一人一张图:有三视图只用最新三视图。形象图和三视图衣服经常不一致,
# 两张一起送会被当成多出来的角色。
chosen = _single_entity_asset(
model.portrait_asset,
model.triview_asset,
_character_triview_asset(team, getattr(model.portrait_asset, "id", None)),
)
if not _append_ref(resolved, chosen, "model", model.name):
resolved.missing.append(ref)
continue
asset = Asset.objects.filter(
@@ -435,15 +460,14 @@ def resolve_refs(team, refs: list[dict]) -> ResolvedRefs:
person_lines.extend(meta_lines)
if desc or meta_lines:
resolved.facts.append("\n".join(person_lines))
added = _append_ref(resolved, asset, type_, asset.name)
# 角色/模特立绘若有配对三视图,一并带给出片;没有就跳过,不要当成引用失败。
if type_ in {"character", "model", "asset"}:
portrait_id = asset.id
# 用户 @ 的就是三视图本身时,不再反查。
if asset.category != Asset.Category.TRI_VIEW:
paired = _character_triview_asset(team, portrait_id)
if paired is not None:
_append_ref(resolved, paired, type_, f"{asset.name}三视图")
if type_ in {"character", "model", "asset"} and asset.category != Asset.Category.TRI_VIEW:
chosen = _single_entity_asset(
asset,
_character_triview_asset(team, asset.id),
)
else:
chosen = asset
added = _append_ref(resolved, chosen, type_, asset.name)
if not added:
resolved.missing.append(ref)