fix: 修复图片创作删除与垃圾桶预览

This commit is contained in:
hh
2026-07-16 23:24:44 +08:00
parent 5fc316112c
commit 81fdb02517
7 changed files with 172 additions and 9 deletions
+52 -2
View File
@@ -19,7 +19,12 @@ from apps.products.models import Product
from .generation_errors import classify_generation_error, public_error_for_task
from .models import AITask, ImageConversation, ModelConfig
from .serializers import AITaskSerializer, ImageConversationSerializer, ModelConfigSerializer
from .serializers import (
AITaskSerializer,
ImageConversationSerializer,
ImageConversationTrashSerializer,
ModelConfigSerializer,
)
from .services import enqueue_standalone_images
@@ -476,6 +481,11 @@ class ImageConversationViewSet(TeamScopedViewSetMixin, ModelViewSet):
serializer_class = ImageConversationSerializer
queryset = ImageConversation.objects.select_related("product").order_by("-last_active_at")
def get_serializer_class(self):
if self.action == "trash":
return ImageConversationTrashSerializer
return super().get_serializer_class()
def get_queryset(self):
queryset = super().get_queryset().annotate(_task_count=Count("tasks"))
if self.action in ("trash", "restore", "purge"):
@@ -524,8 +534,48 @@ class ImageConversationViewSet(TeamScopedViewSetMixin, ModelViewSet):
qs = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(qs)
if page is not None:
self._attach_trash_cover_preview_urls(page)
return self.get_paginated_response(self.get_serializer(page, many=True).data)
return Response(self.get_serializer(qs, many=True).data)
conversations = list(qs)
self._attach_trash_cover_preview_urls(conversations)
return Response(self.get_serializer(conversations, many=True).data)
def _attach_trash_cover_preview_urls(self, conversations):
"""给当前页对话挂一张展示封面;全部资产仍由对话统一恢复/彻底删除。"""
conversation_ids = [conversation.id for conversation in conversations]
if not conversation_ids:
return
covers = {}
assets = (
Asset.objects.filter(
team=self.get_team(),
origin_task__conversation_id__in=conversation_ids,
origin_task__status=AITask.Status.SUCCEEDED,
origin_task__is_deleted=True,
origin_task__purged_at__isnull=True,
asset_type=Asset.Type.IMAGE,
is_deleted=True,
purged_at__isnull=True,
)
.select_related("origin_task")
.prefetch_related("files")
.order_by("origin_task__conversation_id", "-origin_task__created_at", "created_at", "id")
)
for asset in assets:
conversation_id = asset.origin_task.conversation_id
if conversation_id in covers:
continue
files = sorted(
asset.files.all(),
key=lambda item: (not item.is_primary, item.created_at, str(item.id)),
)
for file in files:
preview_url = AssetFileSerializer(file).data.get("preview_url", "")
if preview_url:
covers[conversation_id] = preview_url
break
for conversation in conversations:
conversation._trash_cover_preview_url = covers.get(conversation.id, "")
@action(detail=True, methods=["post"], url_path="restore")
def restore(self, request, pk=None):