feat: add lead-only status change rule for boards and update related logic

This commit is contained in:
Abhimanyu Saharan
2026-02-13 16:21:54 +05:30
parent 366f5231ab
commit ebb9c659d2
9 changed files with 187 additions and 9 deletions

View File

@@ -1061,9 +1061,7 @@ async def update_task(
board_id=board_id,
previous_status=previous_status,
previous_assigned=previous_assigned,
status_requested=(
requested_status is not None and requested_status != previous_status
),
status_requested=(requested_status is not None and requested_status != previous_status),
updates=updates,
comment=comment,
depends_on_task_ids=depends_on_task_ids,
@@ -1678,6 +1676,18 @@ async def _apply_non_lead_agent_task_rules(
):
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
if "status" in update.updates:
only_lead_can_change_status = (
await session.exec(
select(col(Board.only_lead_can_change_status)).where(
col(Board.id) == update.board_id,
),
)
).first()
if only_lead_can_change_status:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Only board leads can change task status.",
)
status_value = _required_status_value(update.updates["status"])
if status_value != "inbox":
dep_ids = await _task_dep_ids(

View File

@@ -42,5 +42,6 @@ class Board(TenantScoped, table=True):
require_approval_for_done: bool = Field(default=True)
require_review_before_done: bool = Field(default=False)
block_status_changes_with_pending_approval: bool = Field(default=False)
only_lead_can_change_status: bool = Field(default=False)
created_at: datetime = Field(default_factory=utcnow)
updated_at: datetime = Field(default_factory=utcnow)

View File

@@ -32,6 +32,7 @@ class BoardBase(SQLModel):
require_approval_for_done: bool = True
require_review_before_done: bool = False
block_status_changes_with_pending_approval: bool = False
only_lead_can_change_status: bool = False
class BoardCreate(BoardBase):
@@ -74,6 +75,7 @@ class BoardUpdate(SQLModel):
require_approval_for_done: bool | None = None
require_review_before_done: bool | None = None
block_status_changes_with_pending_approval: bool | None = None
only_lead_can_change_status: bool | None = None
@model_validator(mode="after")
def validate_gateway_id(self) -> Self: