feat: 图片创作每张图加「加入模特库」按钮 (row41)
图片工作台单图「更多」气泡新增「加入模特库」(与「加入资产库」并列): 把该生成图复用为模特形象图建 Model 条目,加入后变「已加入模特库」禁用。 后端新增 POST /api/models/enroll-asset/(ModelLibraryViewSet.enroll_asset): 复用已有资产作 portrait_asset 建 Model,不重新上传/不二次扣费;同一资产幂等返回。 需部署生效(后端)。 构建: tsc --noEmit=0, npm run build=0; 后端 py_compile OK。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -399,6 +399,29 @@ class ModelLibraryViewSet(ModelViewSet):
|
||||
)
|
||||
return Response(ModelLibrarySerializer(model).data, status=status.HTTP_201_CREATED)
|
||||
|
||||
@action(detail=False, methods=["post"], url_path="enroll-asset")
|
||||
def enroll_asset(self, request):
|
||||
"""图片创作「加入模特库」:把一张已生成的图复用为模特形象图建 Model 条目。
|
||||
资产生成时已落库扣过费,此处只引用、不重新上传/不二次扣费。同一资产已建过则幂等返回。"""
|
||||
team = self.get_team()
|
||||
asset_id = request.data.get("asset_id")
|
||||
asset = Asset.objects.filter(id=asset_id, team=team, is_deleted=False).first() if asset_id else None
|
||||
if asset is None:
|
||||
raise ValidationError({"asset_id": "资产不存在或不属于本团队"})
|
||||
existing = Model.objects.filter(team=team, portrait_asset=asset, is_deleted=False).first()
|
||||
if existing is not None:
|
||||
return Response(ModelLibrarySerializer(existing).data, status=status.HTTP_200_OK)
|
||||
name = (request.data.get("name") or (asset.name or "模特").split("·")[0].strip() or "模特")[:255]
|
||||
model = Model.objects.create(
|
||||
team=team,
|
||||
created_by=request.user,
|
||||
name=name,
|
||||
source=Model.Source.AI,
|
||||
portrait_asset=asset,
|
||||
metadata={"source": "enroll_from_asset", "asset_id": str(asset.id)},
|
||||
)
|
||||
return Response(ModelLibrarySerializer(model).data, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
||||
class AssetUploadView(APIView):
|
||||
parser_classes = [MultiPartParser, FormParser]
|
||||
|
||||
Reference in New Issue
Block a user