feat(campaigns): add pending_approval state to campaign domain entity
This commit is contained in:
@@ -33,6 +33,8 @@ class CampaignStatus(str, enum.Enum):
|
||||
|
||||
# Assign draft = "draft"
|
||||
draft = "draft"
|
||||
# Assign pending_approval = "pending_approval"
|
||||
pending_approval = "pending_approval"
|
||||
# Assign active = "active"
|
||||
active = "active"
|
||||
# Assign completed = "completed"
|
||||
@@ -57,7 +59,8 @@ class CampaignType(str, enum.Enum):
|
||||
|
||||
# Assign VALID_TRANSITIONS = {
|
||||
VALID_TRANSITIONS: dict[CampaignStatus, list[CampaignStatus]] = {
|
||||
CampaignStatus.draft: [CampaignStatus.active],
|
||||
CampaignStatus.draft: [CampaignStatus.pending_approval, CampaignStatus.active],
|
||||
CampaignStatus.pending_approval: [CampaignStatus.active, CampaignStatus.draft],
|
||||
CampaignStatus.active: [CampaignStatus.completed],
|
||||
CampaignStatus.completed: [CampaignStatus.archived],
|
||||
CampaignStatus.archived: [],
|
||||
@@ -132,6 +135,49 @@ class CampaignEntity:
|
||||
# Assign self.status = CampaignStatus.active
|
||||
self.status = CampaignStatus.active
|
||||
|
||||
def submit_for_approval(self) -> None:
|
||||
"""Transition the campaign from ``draft`` to ``pending_approval``.
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
if not self.can_transition_to(CampaignStatus.pending_approval):
|
||||
raise InvalidStateTransition(
|
||||
self.status.value, CampaignStatus.pending_approval.value,
|
||||
[s.value for s in VALID_TRANSITIONS[self.status]],
|
||||
)
|
||||
if self.test_count == 0:
|
||||
raise BusinessRuleViolation(
|
||||
"Campaign must have at least one test to submit for approval"
|
||||
)
|
||||
self.status = CampaignStatus.pending_approval
|
||||
|
||||
def approve(self) -> None:
|
||||
"""Transition the campaign from ``pending_approval`` to ``active``.
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
if self.status != CampaignStatus.pending_approval:
|
||||
raise InvalidStateTransition(
|
||||
self.status.value, CampaignStatus.active.value,
|
||||
[s.value for s in VALID_TRANSITIONS[self.status]],
|
||||
)
|
||||
self.status = CampaignStatus.active
|
||||
|
||||
def reject(self) -> None:
|
||||
"""Transition the campaign from ``pending_approval`` back to ``draft``.
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
if not self.can_transition_to(CampaignStatus.draft):
|
||||
raise InvalidStateTransition(
|
||||
self.status.value, CampaignStatus.draft.value,
|
||||
[s.value for s in VALID_TRANSITIONS[self.status]],
|
||||
)
|
||||
self.status = CampaignStatus.draft
|
||||
|
||||
# Define function complete
|
||||
def complete(self) -> None:
|
||||
"""Transition the campaign from ``active`` to ``completed``.
|
||||
|
||||
Reference in New Issue
Block a user