feat(mma): Implement state mutator methods for Ticket and Track
This commit is contained in:
37
models.py
37
models.py
@@ -1,5 +1,5 @@
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List
|
||||
from typing import List, Optional
|
||||
|
||||
@dataclass
|
||||
class Ticket:
|
||||
@@ -11,6 +11,16 @@ class Ticket:
|
||||
status: str
|
||||
assigned_to: str
|
||||
depends_on: List[str] = field(default_factory=list)
|
||||
blocked_reason: Optional[str] = None
|
||||
|
||||
def mark_blocked(self, reason: str):
|
||||
"""Sets the ticket status to 'blocked' and records the reason."""
|
||||
self.status = "blocked"
|
||||
self.blocked_reason = reason
|
||||
|
||||
def mark_complete(self):
|
||||
"""Sets the ticket status to 'completed'."""
|
||||
self.status = "completed"
|
||||
|
||||
@dataclass
|
||||
class Track:
|
||||
@@ -21,6 +31,31 @@ class Track:
|
||||
description: str
|
||||
tickets: List[Ticket] = field(default_factory=list)
|
||||
|
||||
def get_executable_tickets(self) -> List[Ticket]:
|
||||
"""
|
||||
Returns all 'todo' tickets whose dependencies are all 'completed'.
|
||||
"""
|
||||
# Map ticket IDs to their current status for efficient lookup
|
||||
status_map = {t.id: t.status for t in self.tickets}
|
||||
|
||||
executable = []
|
||||
for ticket in self.tickets:
|
||||
if ticket.status != "todo":
|
||||
continue
|
||||
|
||||
# Check if all dependencies are completed
|
||||
all_deps_completed = True
|
||||
for dep_id in ticket.depends_on:
|
||||
# If a dependency is missing from the track, we treat it as not completed (or we could raise an error)
|
||||
if status_map.get(dep_id) != "completed":
|
||||
all_deps_completed = False
|
||||
break
|
||||
|
||||
if all_deps_completed:
|
||||
executable.append(ticket)
|
||||
|
||||
return executable
|
||||
|
||||
@dataclass
|
||||
class WorkerContext:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user