修复演示恢复项目帧数据

- 恢复演示出厂设置后直接解析演视LC视频序列并生成可打开帧序列

- 保持演视DICOM序列按文件名自然顺序恢复并生成帧

- 增加 MinIO 浏览器访问端点配置,修复 Docker 部署中封面和帧图预签名地址使用容器内主机名的问题

- 更新管理员恢复测试覆盖视频和 DICOM 帧数量

- 更新 README 和前后端契约/设计/测试文档中的演示恢复说明
This commit is contained in:
2026-05-07 16:17:07 +08:00
parent b1131c9126
commit 620e95ff91
14 changed files with 141 additions and 20 deletions

View File

@@ -132,6 +132,11 @@ def test_demo_factory_reset_leaves_admin_and_parsed_demo_dicom(client, db_sessio
frame_path = tmp_path / f"frame_{idx:06d}.jpg"
frame_path.write_bytes(b"frame")
parsed_frame_paths.append(str(frame_path))
parsed_video_frame_paths = []
for idx in range(2):
frame_path = tmp_path / f"video_frame_{idx:06d}.jpg"
frame_path.write_bytes(b"video-frame")
parsed_video_frame_paths.append(str(frame_path))
uploaded = []
monkeypatch.setattr("services.demo_media.upload_file", lambda object_name, data, content_type, length: uploaded.append({
@@ -140,6 +145,10 @@ def test_demo_factory_reset_leaves_admin_and_parsed_demo_dicom(client, db_sessio
"content_type": content_type,
"length": length,
}))
monkeypatch.setattr(
"services.demo_media.parse_video",
lambda video_path_arg, output_dir, fps, target_width: (parsed_video_frame_paths, 30.0),
)
monkeypatch.setattr("services.demo_media.parse_dicom", lambda dicom_dir_arg, output_dir: parsed_frame_paths)
monkeypatch.setattr(
"services.demo_media.upload_frames_to_minio",
@@ -195,9 +204,9 @@ def test_demo_factory_reset_leaves_admin_and_parsed_demo_dicom(client, db_sessio
assert data["project"]["frame_count"] == 3
assert data["project"]["video_path"] == f"uploads/{data['project']['id']}/dicom"
assert [project["name"] for project in data["projects"]] == ["演视LC视频序列", "演视DICOM序列"]
assert data["projects"][0]["status"] == "pending"
assert data["projects"][0]["status"] == PROJECT_STATUS_READY
assert data["projects"][0]["source_type"] == "video"
assert data["projects"][0]["frame_count"] == 0
assert data["projects"][0]["frame_count"] == 2
assert data["projects"][1]["status"] == PROJECT_STATUS_READY
assert data["projects"][1]["source_type"] == "dicom"
assert data["projects"][1]["frame_count"] == 3
@@ -211,8 +220,18 @@ def test_demo_factory_reset_leaves_admin_and_parsed_demo_dicom(client, db_sessio
assert [user.username for user in db_session.query(User).all()] == ["admin"]
assert db_session.query(Project).count() == 2
assert db_session.query(Frame).count() == 3
assert [frame.source_frame_number for frame in db_session.query(Frame).order_by(Frame.frame_index).all()] == [0, 1, 2]
assert db_session.query(Frame).count() == 5
frames_by_project = {}
for project in db_session.query(Project).order_by(Project.id).all():
frames_by_project[project.name] = [
frame.source_frame_number
for frame in db_session.query(Frame)
.filter(Frame.project_id == project.id)
.order_by(Frame.frame_index)
.all()
]
assert frames_by_project["演视LC视频序列"] == [0, 1]
assert frames_by_project["演视DICOM序列"] == [0, 1, 2]
assert db_session.query(Annotation).count() == 0
assert db_session.query(Mask).count() == 0
assert db_session.query(ProcessingTask).count() == 0