fix: 完善商品—模特库-视频项目-自由创作等删除先进垃圾桶及可恢复等流程

This commit is contained in:
hh
2026-07-10 15:06:07 +08:00
parent 3e52942547
commit 564215dc53
28 changed files with 1086 additions and 190 deletions
+61 -1
View File
@@ -5,7 +5,7 @@ from rest_framework.test import APIClient
from apps.accounts.models import Team, TeamMember, User
from apps.ai.models import AITask, ModelConfig, ModelProvider
from apps.assets.models import Asset
from apps.assets.models import Asset, AssetFile
from apps.billing.models import CreditAccount, CreditLedger
from apps.products.models import Product
from apps.projects.models import (
@@ -88,6 +88,66 @@ class ProjectApiTests(TestCase):
)
self.assertTrue(VideoSegment.objects.filter(project=project).exists())
def test_delete_restore_and_purge_project_trash(self):
project = Project.objects.create(team=self.team, created_by=self.user, product=self.product, name="Trash Project")
segment = VideoSegment.objects.create(project=project, sort_order=0, target_duration_seconds=15)
asset = Asset.objects.create(
team=self.team,
created_by=self.user,
name="项目视频片段",
asset_type=Asset.Type.VIDEO,
source=Asset.Source.AI_GENERATED,
category=Asset.Category.VIDEO_CLIP,
)
asset_file = AssetFile.objects.create(
asset=asset,
object_key="projects/clip.mp4",
bucket="test",
content_type="video/mp4",
is_primary=True,
)
version = VideoSegmentVersion.objects.create(video_segment=segment, asset=asset, is_adopted=True)
segment.adopted_version = version
segment.save(update_fields=["adopted_version"])
delete = self.client.delete(f"/api/projects/{project.id}/")
self.assertEqual(delete.status_code, 204)
project.refresh_from_db()
self.assertTrue(project.is_deleted)
self.assertIsNone(project.purged_at)
list_ids = [p["id"] for p in self.client.get("/api/projects/").json()["results"]]
self.assertNotIn(str(project.id), list_ids)
trash_ids = [p["id"] for p in self.client.get("/api/projects/trash/").json()["results"]]
self.assertIn(str(project.id), trash_ids)
asset.refresh_from_db()
self.assertFalse(asset.is_deleted)
self.assertIsNone(asset.purged_at)
restore = self.client.post(f"/api/projects/{project.id}/restore/")
self.assertEqual(restore.status_code, 200)
project.refresh_from_db()
self.assertFalse(project.is_deleted)
self.assertIsNone(project.purged_at)
list_ids = [p["id"] for p in self.client.get("/api/projects/").json()["results"]]
self.assertIn(str(project.id), list_ids)
self.assertTrue(VideoSegmentVersion.objects.filter(id=version.id).exists())
self.client.delete(f"/api/projects/{project.id}/")
purge = self.client.delete(f"/api/projects/{project.id}/purge/")
self.assertEqual(purge.status_code, 204)
project.refresh_from_db()
self.assertTrue(project.is_deleted)
self.assertIsNotNone(project.purged_at)
self.assertTrue(Project.objects.filter(id=project.id).exists())
self.assertTrue(VideoSegment.objects.filter(project=project).exists())
self.assertTrue(VideoSegmentVersion.objects.filter(id=version.id).exists())
asset.refresh_from_db()
self.assertFalse(asset.is_deleted)
self.assertIsNone(asset.purged_at)
self.assertTrue(AssetFile.objects.filter(id=asset_file.id).exists())
trash_ids = [p["id"] for p in self.client.get("/api/projects/trash/").json()["results"]]
self.assertNotIn(str(project.id), trash_ids)
@patch("apps.ai.services.VolcanoArkProvider")
def test_rerun_script_segment_via_agent_rewrites_one_and_charges_once(self, provider_cls):
"""单镜重跑改走 agent:读结构化全脚本,只重写目标镜、保留其余镜,落新版本,计费一次。"""