diff --git a/api/src/tasking/tasks/dtos.py b/api/src/tasking/tasks/dtos.py index 79a8bdb..d97674e 100644 --- a/api/src/tasking/tasks/dtos.py +++ b/api/src/tasking/tasks/dtos.py @@ -50,6 +50,14 @@ class LastMapper(WireModel): user_name: Optional[str] = None +class TaskFeedbackResponse(WireModel): + reason_category: Optional[FeedbackReason] = None + notes: str + created_at: datetime + created_by_user_id: UUID + created_by_user_name: Optional[str] = None + + class TaskResponse(WireModel): id: int task_number: int @@ -58,6 +66,7 @@ class TaskResponse(WireModel): area_sqkm: float lock: Optional[TaskLockSummary] = None last_mapper: Optional[LastMapper] = None + feedback: Optional[list[TaskFeedbackResponse]] = None created_at: datetime updated_at: datetime diff --git a/api/src/tasking/tasks/repository.py b/api/src/tasking/tasks/repository.py index 40e8232..4b89bd2 100644 --- a/api/src/tasking/tasks/repository.py +++ b/api/src/tasking/tasks/repository.py @@ -4,7 +4,7 @@ import json import math from datetime import datetime, timedelta -from typing import Any, Optional +from typing import Any, List, Optional from uuid import UUID from fastapi import HTTPException, status @@ -36,6 +36,7 @@ TaskBoundariesFeatureCollection, TaskBoundaryFeature, TaskBoundaryPolygon, + TaskFeedbackResponse, TaskListResponse, TaskLockSummary, TaskResponse, @@ -357,6 +358,33 @@ async def _to_task_response(self, task: TaskingTask) -> TaskResponse: user_id=UUID(task.last_mapper_id), user_name=display ) + feedback: Optional[List[TaskFeedbackResponse]] = None + if task.id is not None: + feedback_list = await self.session.execute( + select(TaskingFeedback).where( + TaskingFeedback.task_id + == task.id, # pyright: ignore[reportArgumentType] + TaskingFeedback.project_id + == task.project_id, # pyright: ignore[reportArgumentType] + ) + ) + feedback = [] + for item in feedback_list.scalars().all(): + feedback_obj = item + if feedback_obj: + display = await self._lookup_user_display( + feedback_obj.author_user_auth_uid + ) + feedback.append( + TaskFeedbackResponse( + reason_category=feedback_obj.reason_category, + notes=feedback_obj.notes, + created_at=feedback_obj.created_at, + created_by_user_id=UUID(feedback_obj.author_user_auth_uid), + created_by_user_name=display, + ) + ) + return TaskResponse( id=task.id, # type: ignore[arg-type] task_number=task.task_number, @@ -367,6 +395,7 @@ async def _to_task_response(self, task: TaskingTask) -> TaskResponse: last_mapper=last_mapper, created_at=task.created_at, updated_at=task.updated_at, + feedback=feedback, ) # ---- grid generation -------------------------------------------------