diff --git a/src/backend/app/tasks/task_logic.py b/src/backend/app/tasks/task_logic.py index ce15fa1b..e70b5fc6 100644 --- a/src/backend/app/tasks/task_logic.py +++ b/src/backend/app/tasks/task_logic.py @@ -33,12 +33,17 @@ async def get_task_stats(db: Connection, user_data: AuthUser): %(role)s = 'DRONE_PILOT' AND te.user_id = %(user_id)s ) - OR - (%(role)s = 'PROJECT_CREATOR' AND te.project_id IN ( + OR + ( + %(role)s = 'PROJECT_CREATOR' + AND ( + te.project_id IN ( SELECT p.id FROM projects p WHERE p.author_id = %(user_id)s - )) + ) + OR te.user_id = %(user_id)s -- Grant permissions equivalent to DRONE_PILOT + )) ORDER BY te.task_id, te.created_at DESC ) AS te; """ @@ -284,11 +289,12 @@ async def handle_event( case EventType.REQUESTS: # Determine the appropriate state and message is_author = project["author_id"] == user_id - if user_role != UserRole.DRONE_PILOT.name and not is_author: - raise HTTPException( - status_code=403, - detail="Only the project author or drone operators can request tasks for this project.", - ) + # NOTE: + # if user_role != UserRole.DRONE_PILOT.name and not is_author: + # raise HTTPException( + # status_code=403, + # detail="Only the project author or drone operators can request tasks for this project.", + # ) requires_approval = project["requires_approval_from_manager_for_locking"] diff --git a/src/backend/app/tasks/task_schemas.py b/src/backend/app/tasks/task_schemas.py index 16c43576..2b6ae66c 100644 --- a/src/backend/app/tasks/task_schemas.py +++ b/src/backend/app/tasks/task_schemas.py @@ -200,12 +200,15 @@ async def get_tasks_by_user( ) OR ( - %(role)s = 'PROJECT_CREATOR' AND task_events.project_id IN ( + %(role)s = 'PROJECT_CREATOR' AND ( + task_events.project_id IN ( SELECT p.id FROM projects p WHERE p.author_id = %(user_id)s ) + OR task_events.user_id = %(user_id)s ) + ) ORDER BY tasks.id, task_events.created_at DESC OFFSET %(skip)s @@ -228,13 +231,13 @@ class TaskDetailsOut(BaseModel): task_area: float outline: Outline created_at: datetime - updated_at: datetime + updated_at: Optional[datetime] = None state: State project_name: str project_task_index: int - front_overlap: float - side_overlap: float - gsd_cm_px: float + front_overlap: Optional[float] = None + side_overlap: Optional[float] = None + gsd_cm_px: Optional[float] = None gimble_angles_degrees: Optional[int] = None @field_validator("state", mode="after")