diff --git a/app/db/adapters/history/transfer.py b/app/db/adapters/history/transfer.py index 4fff82345..b8008d3d6 100644 --- a/app/db/adapters/history/transfer.py +++ b/app/db/adapters/history/transfer.py @@ -53,6 +53,7 @@ def project_transfer_history(record: object) -> TransferHistorySnapshot: ) except (TypeError, ValueError): parsed_persisted_retry_count = None + status = bool(getattr(record, "status", False)) retry_count = ( parsed_persisted_retry_count if parsed_persisted_retry_count is not None @@ -64,7 +65,7 @@ def project_transfer_history(record: object) -> TransferHistorySnapshot: file_modify_time=source_modify_time, fileid=source_fileid, ) - if not bool(getattr(record, "status", False)) + if not status else 0 ) ) @@ -82,12 +83,16 @@ def project_transfer_history(record: object) -> TransferHistorySnapshot: cleanup_feedback = classify_transfer_failure("下载器清理失败") failure_stage = failure_stage or cleanup_feedback.stage.value recovery_action = recovery_action or cleanup_feedback.action - elif not failure_stage or not recovery_action: + elif not status and (not failure_stage or not recovery_action): from app.application.transfer.feedback import classify_transfer_failure feedback = classify_transfer_failure(getattr(record, "errmsg", None)) failure_stage = failure_stage or feedback.stage.value recovery_action = recovery_action or feedback.action + elif status: + # 成功记录的失败字段不能被历史投影中的默认反馈重新带出,避免误导前端。 + failure_stage = None + recovery_action = None return TransferHistorySnapshot( id=history_id, transfer_task_id=getattr(record, "transfer_task_id", None), @@ -129,7 +134,7 @@ def project_transfer_history(record: object) -> TransferHistorySnapshot: image=getattr(record, "image", None), downloader=getattr(record, "downloader", None), download_hash=getattr(record, "download_hash", None), - status=bool(getattr(record, "status", False)), + status=status, errmsg=getattr(record, "errmsg", None), failure_stage=failure_stage, recovery_action=recovery_action, diff --git a/tests/test_transactional_transfer_history.py b/tests/test_transactional_transfer_history.py index 29eccac87..857ac49f9 100644 --- a/tests/test_transactional_transfer_history.py +++ b/tests/test_transactional_transfer_history.py @@ -118,6 +118,16 @@ def test_transactional_repository_projects_detached_snapshots(db) -> None: } +def test_transactional_repository_does_not_project_failure_feedback_for_success(db) -> None: + """成功整理历史不得被投影成带失败阶段和恢复动作的记录。""" + repository = _repository() + created = repository.replace(_history_write()) + + assert created.status is True + assert created.failure_stage is None + assert created.recovery_action is None + + def test_transactional_repository_rolls_back_replace_on_commit_failure( db, monkeypatch,