fix: delete governance versions before parent rows

This commit is contained in:
2026-05-16 13:18:39 +08:00
parent bab3886701
commit 8df03f857d
6 changed files with 35 additions and 0 deletions
@@ -48,3 +48,14 @@ class ContractTemplateVersionRepository:
.update({"is_current": False}, synchronize_session=False)
)
self.db.commit()
def delete_by_template_id(self, tenant_id: str, template_id: str) -> None:
(
self.db.query(ContractTemplateVersion)
.filter(
ContractTemplateVersion.tenant_id == tenant_id,
ContractTemplateVersion.template_id == template_id,
)
.delete(synchronize_session=False)
)
self.db.commit()
@@ -39,6 +39,17 @@ class ReviewRuleVersionRepository:
item.is_current = False
self.db.commit()
def delete_by_rule_id(self, tenant_id: str, rule_id: str) -> None:
(
self.db.query(ReviewRuleVersion)
.filter(
ReviewRuleVersion.tenant_id == tenant_id,
ReviewRuleVersion.rule_id == rule_id,
)
.delete(synchronize_session=False)
)
self.db.commit()
def get_by_version_label(self, tenant_id: str, rule_id: str, version_label: str) -> Optional[ReviewRuleVersion]:
return (
self.db.query(ReviewRuleVersion)
@@ -159,6 +159,7 @@ class ReviewRuleService:
self._require_admin(current_user)
rule = self._require_rule(current_user, rule_id)
deleted_item = self._to_item(rule)
self.version_repository.delete_by_rule_id(current_user["tenant_id"], rule_id)
self.repository.delete(rule_id)
return deleted_item
+2
View File
@@ -258,8 +258,10 @@ class TemplateService:
def delete_template(self, current_user: Dict[str, Any], template_id: str) -> dict:
self._require_admin(current_user)
repository = self._require_repository()
version_repository = self._require_version_repository()
contract_template = self._require_template(current_user, template_id)
template_data = self._to_item(contract_template)
version_repository.delete_by_template_id(current_user["tenant_id"], template_id)
repository.delete(contract_template)
return template_data
@@ -297,6 +297,7 @@ class ReviewRuleServiceTestCase(unittest.TestCase):
# Mock repository methods
self.service.repository.get_by_id = Mock(return_value=mock_existing_rule)
self.service.repository.delete = Mock()
self.service.version_repository.delete_by_rule_id = Mock()
# Call method
result = self.service.delete_rule(
@@ -308,6 +309,7 @@ class ReviewRuleServiceTestCase(unittest.TestCase):
self.assertEqual(result["id"], "rule-123")
self.assertEqual(result["name"], "自动续约预警")
# Verify delete was called
self.service.version_repository.delete_by_rule_id.assert_called_once_with("tenant-demo-001", "rule-123")
self.service.repository.delete.assert_called_once_with("rule-123")
def test_delete_rule_not_found(self):
+8
View File
@@ -74,6 +74,13 @@ class StubVersionRepository:
if item.tenant_id == tenant_id and item.template_id == template_id:
item.is_current = False
def delete_by_template_id(self, tenant_id, template_id):
self.items = [
item
for item in self.items
if not (item.tenant_id == tenant_id and item.template_id == template_id)
]
class StubGovernanceAsset:
def __init__(self, asset_id: str, production_status: str = "ready"):
@@ -179,6 +186,7 @@ class TemplateServiceTestCase(unittest.TestCase):
self.assertEqual(listed["total"], 0)
self.assertEqual(listed["items"], [])
self.assertEqual(self.service.version_repository.list_by_template_id(self.current_user["tenant_id"], created["id"]), [])
def test_member_cannot_manage_templates(self):
with self.assertRaises(HTTPException) as context: