style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 3s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2m11s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m29s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m35s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m21s
AI Code Review / AI Code Review (pull_request) Failing after 4m53s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m10s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m17s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m39s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m54s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m12s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m16s
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled

This commit is contained in:
CI Bot
2026-08-31 10:02:51 +00:00
parent a99c0515ea
commit b7401fcffa
2 changed files with 17 additions and 32 deletions
@@ -12,6 +12,7 @@ import json
import uuid
import sqlalchemy as sa
from alembic import op
revision = "060_migrate_segments"
@@ -29,24 +30,19 @@ def upgrade() -> None:
conn = op.get_bind()
# 找出有旧数据但没有新数据的 template_id
rows = conn.execute(
sa.text(
"""
rows = conn.execute(sa.text("""
SELECT ts.id, ts.template_id, ts.segment_order, ts.duration_min, ts.duration_max, ts.material_type
FROM template_segments ts
WHERE ts.template_id NOT IN (
SELECT DISTINCT tcc.template_id FROM template_clip_configs tcc
)
ORDER BY ts.template_id, ts.segment_order
"""
)
)
"""))
for row in rows:
config = {"material_type": row[5]} if row[5] else {}
conn.execute(
sa.text(
"""
sa.text("""
INSERT INTO template_clip_configs
(id, template_id, clip_type, "order", min_duration, max_duration,
text_template, material_requirements, transition_effect, config,
@@ -54,8 +50,7 @@ def upgrade() -> None:
VALUES (:id, :template_id, 'main', :seg_order, :dur_min, :dur_max,
'', '{}', 'cut', :config,
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
"""
),
"""),
{
"id": uuid.uuid4().hex,
"template_id": row[1],
+12 -22
View File
@@ -57,9 +57,7 @@ class TestCreateSegmentsWritesToClipConfigs:
repo.create_segments([seg])
# 验证 template_clip_configs 有记录
clips = db_session.query(TemplateClipConfigModel).filter(
TemplateClipConfigModel.template_id == tpl.id
).all()
clips = db_session.query(TemplateClipConfigModel).filter(TemplateClipConfigModel.template_id == tpl.id).all()
assert len(clips) == 1
assert clips[0].order == 0
assert clips[0].min_duration == 3.0
@@ -74,9 +72,7 @@ class TestCreateSegmentsWritesToClipConfigs:
seg = _make_segment(tpl.id, 0)
repo.create_segments([seg])
old_rows = db_session.query(TemplateSegmentModel).filter(
TemplateSegmentModel.template_id == tpl.id
).all()
old_rows = db_session.query(TemplateSegmentModel).filter(TemplateSegmentModel.template_id == tpl.id).all()
assert len(old_rows) == 0
@@ -183,9 +179,7 @@ class TestDeleteSegments:
count = repo.delete_segments_by_template(tpl.id)
assert count == 1
clips = db_session.query(TemplateClipConfigModel).filter(
TemplateClipConfigModel.template_id == tpl.id
).all()
clips = db_session.query(TemplateClipConfigModel).filter(TemplateClipConfigModel.template_id == tpl.id).all()
assert len(clips) == 0
def test_delete_template_clears_both_tables(self, repo: SQLAlchemyTemplateRepository, db_session: Session):
@@ -206,14 +200,10 @@ class TestDeleteSegments:
repo.delete(tpl.id, "user1")
clips = db_session.query(TemplateClipConfigModel).filter(
TemplateClipConfigModel.template_id == tpl.id
).all()
clips = db_session.query(TemplateClipConfigModel).filter(TemplateClipConfigModel.template_id == tpl.id).all()
assert len(clips) == 0
old_rows = db_session.query(TemplateSegmentModel).filter(
TemplateSegmentModel.template_id == tpl.id
).all()
old_rows = db_session.query(TemplateSegmentModel).filter(TemplateSegmentModel.template_id == tpl.id).all()
assert len(old_rows) == 0
@@ -223,10 +213,12 @@ class TestCopyTemplateSegments:
def test_copy_preserves_segments(self, repo: SQLAlchemyTemplateRepository, db_session: Session):
tpl = _make_template()
repo.create(tpl)
repo.create_segments([
_make_segment(tpl.id, 0, "video"),
_make_segment(tpl.id, 1, "voiceover"),
])
repo.create_segments(
[
_make_segment(tpl.id, 0, "video"),
_make_segment(tpl.id, 1, "voiceover"),
]
)
copied = repo.copy_template(tpl.id, "user1", "copy")
assert len(copied.segments) == 2
@@ -234,9 +226,7 @@ class TestCopyTemplateSegments:
assert copied.segments[1].material_type == "voiceover"
# 验证新模板的 clip_configs 有数据
clips = db_session.query(TemplateClipConfigModel).filter(
TemplateClipConfigModel.template_id == copied.id
).all()
clips = db_session.query(TemplateClipConfigModel).filter(TemplateClipConfigModel.template_id == copied.id).all()
assert len(clips) == 2