feat(clean-release): complete compliance redesign phases and polish tasks T047-T052
This commit is contained in:
@@ -16,7 +16,7 @@ from typing import Dict, Iterable
|
||||
from .manifest_builder import build_distribution_manifest
|
||||
from .policy_engine import CleanPolicyEngine
|
||||
from .repository import CleanReleaseRepository
|
||||
from ...models.clean_release import ReleaseCandidateStatus
|
||||
from .enums import CandidateStatus
|
||||
|
||||
|
||||
def prepare_candidate(
|
||||
@@ -34,7 +34,7 @@ def prepare_candidate(
|
||||
if policy is None:
|
||||
raise ValueError("Active clean policy not found")
|
||||
|
||||
registry = repository.get_registry(policy.internal_source_registry_ref)
|
||||
registry = repository.get_registry(policy.registry_snapshot_id)
|
||||
if registry is None:
|
||||
raise ValueError("Registry not found for active policy")
|
||||
|
||||
@@ -54,14 +54,39 @@ def prepare_candidate(
|
||||
)
|
||||
repository.save_manifest(manifest)
|
||||
|
||||
candidate.status = ReleaseCandidateStatus.BLOCKED if violations else ReleaseCandidateStatus.PREPARED
|
||||
# Note: In the new model, BLOCKED is a ComplianceDecision, not a CandidateStatus.
|
||||
# CandidateStatus.PREPARED is the correct next state after preparation.
|
||||
candidate.transition_to(CandidateStatus.PREPARED)
|
||||
repository.save_candidate(candidate)
|
||||
|
||||
status_value = candidate.status.value if hasattr(candidate.status, "value") else str(candidate.status)
|
||||
manifest_id_value = getattr(manifest, "manifest_id", None) or getattr(manifest, "id", "")
|
||||
return {
|
||||
"candidate_id": candidate_id,
|
||||
"status": candidate.status.value,
|
||||
"manifest_id": manifest.manifest_id,
|
||||
"status": status_value,
|
||||
"manifest_id": manifest_id_value,
|
||||
"violations": violations,
|
||||
"prepared_at": datetime.now(timezone.utc).isoformat(),
|
||||
}
|
||||
|
||||
|
||||
# [DEF:prepare_candidate_legacy:Function]
|
||||
# @PURPOSE: Legacy compatibility wrapper kept for migration period.
|
||||
# @PRE: Same as prepare_candidate.
|
||||
# @POST: Delegates to canonical prepare_candidate and preserves response shape.
|
||||
def prepare_candidate_legacy(
|
||||
repository: CleanReleaseRepository,
|
||||
candidate_id: str,
|
||||
artifacts: Iterable[Dict],
|
||||
sources: Iterable[str],
|
||||
operator_id: str,
|
||||
) -> Dict:
|
||||
return prepare_candidate(
|
||||
repository=repository,
|
||||
candidate_id=candidate_id,
|
||||
artifacts=artifacts,
|
||||
sources=sources,
|
||||
operator_id=operator_id,
|
||||
)
|
||||
# [/DEF:prepare_candidate_legacy:Function]
|
||||
# [/DEF:backend.src.services.clean_release.preparation_service:Module]
|
||||
Reference in New Issue
Block a user