fix: 修复图片创作删除与垃圾桶预览
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user