fix: 修复换火山账号导致素材库操作失败问题

This commit is contained in:
hh
2026-07-09 17:54:05 +08:00
parent 8c50096888
commit 3e52942547
5 changed files with 247 additions and 15 deletions
+26 -10
View File
@@ -32,6 +32,8 @@ _VIDEO_MAX = 50 * 1024 * 1024
_AUDIO_MAX = 15 * 1024 * 1024
DEFAULT_GROUP_NAME = "默认素材"
DEFAULT_GROUP_MARKER = "__airshelf_free_asset_default__"
OTHER_REMOTE_ASSET_MESSAGE = "该素材属于其他火山账号,请重新上传后再编辑"
OTHER_REMOTE_GROUP_MESSAGE = "该素材组属于其他火山账号,请新建素材组后重新上传"
def _serialize_asset(fa: FreeAsset) -> dict:
@@ -63,10 +65,7 @@ def _assets_api_unavailable() -> Response:
return Response({"detail": "素材库服务未配置,请联系管理员"}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
def _get_or_create_default_group(*, team, user) -> FreeAssetGroup:
group = FreeAssetGroup.objects.filter(team=team, is_deleted=False, description=DEFAULT_GROUP_MARKER).first()
if group is not None:
return group
def _create_default_group(*, team, user) -> FreeAssetGroup:
remote_group_id = assets_client.create_asset_group(DEFAULT_GROUP_NAME, DEFAULT_GROUP_MARKER)
return FreeAssetGroup.objects.create(
team=team,
@@ -77,6 +76,19 @@ def _get_or_create_default_group(*, team, user) -> FreeAssetGroup:
)
def _get_or_create_default_group(*, team, user) -> FreeAssetGroup:
group = FreeAssetGroup.objects.filter(team=team, is_deleted=False, description=DEFAULT_GROUP_MARKER).first()
if group is not None:
try:
assets_client.get_asset_group(group.remote_group_id)
except AssetsAPIError as exc:
if not assets_client.is_group_not_found_code(exc.code):
raise
return _create_default_group(team=team, user=user)
return group
return _create_default_group(team=team, user=user)
def _upload_asset_to_group(request, *, team, group: FreeAssetGroup, image_only: bool = False) -> Response:
upload = request.FILES.get("file")
if upload is None:
@@ -138,6 +150,8 @@ def _upload_asset_to_group(request, *, team, group: FreeAssetGroup, image_only:
try:
remote_asset_id = assets_client.create_asset(group.remote_group_id, url, name=name, asset_type=asset_type)
except AssetsAPIError as exc:
if assets_client.is_group_not_found_code(exc.code):
return Response({"detail": OTHER_REMOTE_GROUP_MESSAGE}, status=status.HTTP_400_BAD_REQUEST)
return Response({"detail": exc.user_message}, status=status.HTTP_400_BAD_REQUEST)
fa = FreeAsset.objects.create(
@@ -215,8 +229,9 @@ class FreeAssetGroupDetailView(APIView):
try:
assets_client.update_asset_group(group.remote_group_id, name=group.name, description=group.description)
except AssetsAPIError as exc:
if exc.code != "NotFound":
return Response({"detail": exc.user_message}, status=status.HTTP_400_BAD_REQUEST)
if assets_client.is_group_not_found_code(exc.code):
return Response({"detail": OTHER_REMOTE_GROUP_MESSAGE}, status=status.HTTP_400_BAD_REQUEST)
return Response({"detail": exc.user_message}, status=status.HTTP_400_BAD_REQUEST)
group.save(update_fields=update_fields)
return Response({"group": _serialize_group(group)})
@@ -228,7 +243,7 @@ class FreeAssetGroupDetailView(APIView):
assets_client.delete_asset_group(group.remote_group_id)
except AssetsAPIError as exc:
# 远程已不存在 → 幂等继续清本地;其它错误如实反馈
if exc.code != "NotFound":
if not assets_client.is_group_not_found_code(exc.code):
return Response({"detail": exc.user_message}, status=status.HTTP_400_BAD_REQUEST)
group.is_deleted = True
group.save(update_fields=["is_deleted", "updated_at"])
@@ -286,8 +301,9 @@ class FreeAssetDetailView(APIView):
try:
assets_client.update_asset(fa.remote_asset_id, name=name)
except AssetsAPIError as exc:
if exc.code != "NotFound":
return Response({"detail": exc.user_message}, status=status.HTTP_400_BAD_REQUEST)
if assets_client.is_asset_not_found_code(exc.code):
return Response({"detail": OTHER_REMOTE_ASSET_MESSAGE}, status=status.HTTP_400_BAD_REQUEST)
return Response({"detail": exc.user_message}, status=status.HTTP_400_BAD_REQUEST)
fa.name = name[:128]
fa.save(update_fields=["name", "updated_at"])
return Response({"asset": _serialize_asset(fa)})
@@ -299,7 +315,7 @@ class FreeAssetDetailView(APIView):
try:
assets_client.delete_asset(fa.remote_asset_id)
except AssetsAPIError as exc:
if exc.code != "NotFound":
if not assets_client.is_asset_not_found_code(exc.code):
return Response({"detail": exc.user_message}, status=status.HTTP_400_BAD_REQUEST)
fa.delete()
return Response(status=status.HTTP_204_NO_CONTENT)