fix: stabilize maintenance flow run/resume and procedural scrolling
This commit is contained in:
@@ -51,7 +51,9 @@ async def create_schedule(
|
||||
):
|
||||
"""Create a cron schedule for a maintenance flow. One per flow."""
|
||||
# Verify user's team owns the tree
|
||||
await _get_tree_or_403(data.tree_id, current_user, db)
|
||||
tree = await _get_tree_or_403(data.tree_id, current_user, db)
|
||||
if tree.tree_type != "maintenance":
|
||||
raise HTTPException(status_code=400, detail="Schedules are only supported for maintenance flows")
|
||||
|
||||
# Check no existing schedule for this tree
|
||||
existing = await db.execute(
|
||||
|
||||
@@ -37,10 +37,13 @@ async def list_sessions(
|
||||
ticket_number: Optional[str] = Query(None, description="Search by ticket number (partial match)"),
|
||||
client_name: Optional[str] = Query(None, description="Search by client name (partial match)"),
|
||||
tree_name: Optional[str] = Query(None, description="Filter by tree name from snapshot"),
|
||||
tree_id: Optional[UUID] = Query(None, description="Filter by tree ID"),
|
||||
started_after: Optional[datetime] = Query(None, description="Filter sessions started after this datetime"),
|
||||
started_before: Optional[datetime] = Query(None, description="Filter sessions started before this datetime"),
|
||||
completed_after: Optional[datetime] = Query(None, description="Filter sessions completed after this datetime"),
|
||||
completed_before: Optional[datetime] = Query(None, description="Filter sessions completed before this datetime"),
|
||||
page: Optional[int] = Query(None, ge=1, description="1-based page number (frontend compatibility)"),
|
||||
size: Optional[int] = Query(None, ge=1, le=100, description="Page size (frontend compatibility)"),
|
||||
skip: int = Query(0, ge=0),
|
||||
limit: int = Query(50, ge=1, le=100)
|
||||
):
|
||||
@@ -66,6 +69,10 @@ async def list_sessions(
|
||||
if tree_name:
|
||||
query = query.where(Session.tree_snapshot['name'].astext.ilike(f"%{tree_name}%"))
|
||||
|
||||
# Tree ID filter
|
||||
if tree_id:
|
||||
query = query.where(Session.tree_id == tree_id)
|
||||
|
||||
# Date range filters
|
||||
if started_after:
|
||||
query = query.where(Session.started_at >= started_after)
|
||||
@@ -76,8 +83,13 @@ async def list_sessions(
|
||||
if completed_before:
|
||||
query = query.where(Session.completed_at <= completed_before)
|
||||
|
||||
effective_limit = size if size is not None else limit
|
||||
effective_skip = skip
|
||||
if page is not None:
|
||||
effective_skip = (page - 1) * effective_limit
|
||||
|
||||
query = query.order_by(Session.started_at.desc())
|
||||
query = query.offset(skip).limit(limit)
|
||||
query = query.offset(effective_skip).limit(effective_limit)
|
||||
|
||||
result = await db.execute(query)
|
||||
sessions = result.scalars().all()
|
||||
|
||||
@@ -47,6 +47,16 @@ async def _fire_maintenance_schedule(schedule_id: str) -> None:
|
||||
logger.error(f"Tree {schedule.tree_id} not found for schedule {schedule_id}")
|
||||
return
|
||||
|
||||
if tree.tree_type != "maintenance":
|
||||
logger.warning(f"Skipping schedule {schedule_id}: tree {tree.id} is not a maintenance flow")
|
||||
return
|
||||
|
||||
if not tree.is_active or tree.status == "draft":
|
||||
logger.warning(
|
||||
f"Skipping schedule {schedule_id}: tree {tree.id} is inactive or draft"
|
||||
)
|
||||
return
|
||||
|
||||
# Resolve targets
|
||||
targets: list[dict] = []
|
||||
if schedule.target_list_id:
|
||||
@@ -61,7 +71,12 @@ async def _fire_maintenance_schedule(schedule_id: str) -> None:
|
||||
targets = [{"label": "Unassigned"}]
|
||||
|
||||
batch_id = uuid.uuid4()
|
||||
tree_snapshot = tree.tree_structure
|
||||
tree_snapshot = {
|
||||
**tree.tree_structure,
|
||||
"name": tree.name,
|
||||
"description": tree.description,
|
||||
"tree_type": tree.tree_type,
|
||||
}
|
||||
|
||||
sessions_to_add = []
|
||||
for target in targets:
|
||||
|
||||
Reference in New Issue
Block a user