# Custom Task Status GET Endpoint Implementation ## Overview Implemented the GET endpoint for retrieving all task statuses (system + custom) for a project as part of the custom task status management feature. ## Endpoint Details ### GET /projects/{project_id}/task-statuses **Description**: Retrieves all task statuses (both system and custom) for a specific project. **Authentication**: Required (JWT Bearer token) **Authorization**: - Artists: Can only access projects they are members of - Coordinators/Directors/Developers/Admins: Can access all projects **Path Parameters**: - `project_id` (int): The ID of the project **Response Schema**: `AllTaskStatusesResponse` ```json { "statuses": [ { "id": "custom_review", "name": "In Review", "color": "#8B5CF6", "order": 0, "is_default": false } ], "system_statuses": [ { "id": "not_started", "name": "Not Started", "color": "#6B7280", "is_system": true }, { "id": "in_progress", "name": "In Progress", "color": "#3B82F6", "is_system": true }, { "id": "submitted", "name": "Submitted", "color": "#F59E0B", "is_system": true }, { "id": "approved", "name": "Approved", "color": "#10B981", "is_system": true }, { "id": "retake", "name": "Retake", "color": "#EF4444", "is_system": true } ], "default_status_id": "not_started" } ``` **Status Codes**: - `200 OK`: Successfully retrieved task statuses - `403 Forbidden`: User does not have access to the project - `404 Not Found`: Project does not exist ## System Task Statuses The following system statuses are always available: | ID | Name | Color | Description | |----|------|-------|-------------| | not_started | Not Started | #6B7280 | Task has not been started | | in_progress | In Progress | #3B82F6 | Task is currently being worked on | | submitted | Submitted | #F59E0B | Work has been submitted for review | | approved | Approved | #10B981 | Work has been approved | | retake | Retake | #EF4444 | Work needs to be redone | ## Implementation Details ### Location - File: `backend/routers/projects.py` - Function: `get_all_task_statuses()` ### Key Features 1. **Project Validation**: Verifies the project exists before returning statuses 2. **Access Control**: Enforces role-based access control (artists can only access projects they're members of) 3. **System Statuses**: Always returns the 5 built-in system statuses 4. **Custom Statuses**: Returns project-specific custom statuses if defined 5. **Default Status**: Identifies which status is the default for new tasks 6. **JSON Handling**: Properly handles both JSON string and dict formats for custom_task_statuses field ### Database Schema Custom statuses are stored in the `projects` table: - Column: `custom_task_statuses` (JSON) - Format: Array of status objects with id, name, color, order, and is_default fields ### Access Control Logic ```python # Artists can only access projects they're members of if current_user.role == UserRole.ARTIST: member = db.query(ProjectMember).filter( ProjectMember.project_id == project_id, ProjectMember.user_id == current_user.id ).first() if not member: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Access denied to this project" ) ``` ## Testing ### Test Files Created 1. **test_task_statuses.py**: Basic functionality test - Tests retrieval of system statuses - Validates response structure - Verifies all system statuses are present 2. **test_task_statuses_with_custom.py**: Custom status test - Creates custom statuses in database - Tests retrieval of both system and custom statuses - Validates default status identification 3. **test_task_statuses_access.py**: Access control test - Tests artist access control (member vs non-member) - Tests coordinator access to all projects 4. **test_task_statuses_errors.py**: Error handling test - Tests 404 for non-existent projects - Tests 401/403 for unauthorized access ### Test Results All tests passed successfully: - ✅ System statuses correctly returned - ✅ Custom statuses correctly returned - ✅ Default status correctly identified - ✅ Access control working for artists - ✅ Coordinators can access all projects - ✅ 404 returned for non-existent projects - ✅ Unauthorized access properly blocked ## Requirements Validation This implementation satisfies the following requirements: - **Requirement 1.1**: ✅ Displays task status information for project settings - **Requirement 9.2**: ✅ Only shows statuses from the task's project (project-specific) ## Usage Example ```python import requests # Login response = requests.post( "http://localhost:8000/auth/login", json={"email": "user@example.com", "password": "password"} ) token = response.json()["access_token"] # Get task statuses for project response = requests.get( "http://localhost:8000/projects/1/task-statuses", headers={"Authorization": f"Bearer {token}"} ) statuses = response.json() print(f"System statuses: {len(statuses['system_statuses'])}") print(f"Custom statuses: {len(statuses['statuses'])}") print(f"Default status: {statuses['default_status_id']}") ``` ## Next Steps The following endpoints still need to be implemented: - POST /projects/{project_id}/task-statuses - Create custom status - PUT /projects/{project_id}/task-statuses/{status_id} - Update custom status - DELETE /projects/{project_id}/task-statuses/{status_id} - Delete custom status - PATCH /projects/{project_id}/task-statuses/reorder - Reorder statuses