4.6 KiB
4.6 KiB
Custom Task Status Creation Endpoint Implementation
Overview
Implemented the POST endpoint for creating custom task statuses in projects. This allows coordinators and admins to define project-specific task statuses beyond the built-in system statuses.
Implementation Details
Endpoint
- Route:
POST /projects/{project_id}/task-statuses - Status Code: 201 Created
- Authorization: Requires coordinator or admin role
Features Implemented
1. Status Name Uniqueness Validation
- Validates that the status name is unique within the project
- Case-insensitive comparison to prevent duplicates like "In Review" and "in review"
- Checks against both existing custom statuses and system statuses
- Returns 409 Conflict if duplicate found
2. Auto-Assign Color from Palette
- Defines a default color palette with 10 distinct colors:
- Purple (#8B5CF6)
- Pink (#EC4899)
- Teal (#14B8A6)
- Orange (#F97316)
- Cyan (#06B6D4)
- Lime (#84CC16)
- Violet (#A855F7)
- Rose (#F43F5E)
- Sky (#22D3EE)
- Yellow (#FACC15)
- Automatically assigns the first unused color from the palette
- If all colors are used, cycles back through the palette
- Users can override by providing a custom color in hex format
3. Unique Status ID Generation
- Generates unique IDs using UUID4 with format:
custom_{8-char-hex} - Example:
custom_0c7ba931 - Ensures no ID collisions
4. JSON Column Updates
- Uses SQLAlchemy's
flag_modified()to properly track changes to JSON columns - Ensures database updates are persisted correctly
5. Status Ordering
- Automatically assigns order based on existing statuses
- New statuses are appended to the end (max_order + 1)
- Maintains consistent ordering for UI display
Request Schema
{
"name": "Ready for Review",
"color": "#8B5CF6" // Optional - auto-assigned if not provided
}
Response Schema
{
"message": "Custom task status 'Ready for Review' created successfully",
"status": {
"id": "custom_0c7ba931",
"name": "Ready for Review",
"color": "#EC4899",
"order": 3,
"is_default": false
},
"all_statuses": {
"statuses": [...], // All custom statuses
"system_statuses": [...], // Built-in system statuses
"default_status_id": "not_started"
}
}
Validation Rules
Name Validation (via Pydantic schema)
- Minimum length: 1 character
- Maximum length: 50 characters
- Whitespace is trimmed
- Cannot be empty after trimming
Color Validation (via Pydantic schema)
- Must be valid hex color code format:
#RRGGBB - Example:
#FF5733 - Normalized to uppercase
- Optional field
Error Responses
404 Not Found
{
"detail": "Project not found"
}
409 Conflict - Duplicate Name
{
"detail": "Status with name 'Ready for Review' already exists in this project"
}
409 Conflict - System Status Name
{
"detail": "Status name 'In Progress' conflicts with a system status"
}
422 Unprocessable Entity - Validation Error
{
"detail": "1 validation error for CustomTaskStatusCreate\nname\n String should have at least 1 character..."
}
Testing
Test Results
All validation and functionality tests passed:
- ✅ Create status without color (auto-assigned from palette)
- ✅ Create status with custom color
- ✅ Reject duplicate status names (409 Conflict)
- ✅ Reject empty status names (422 Validation Error)
- ✅ Reject invalid color formats (422 Validation Error)
- ✅ Reject system status name conflicts (409 Conflict)
- ✅ Proper ordering of statuses
- ✅ Unique ID generation
- ✅ JSON column updates with flag_modified
Test Files
backend/test_create_custom_task_status.py- Comprehensive test suitebackend/test_custom_status_validation.py- Validation-focused tests
Database Schema
The custom task statuses are stored in the projects.custom_task_statuses JSON column:
[
{
"id": "custom_review",
"name": "In Review",
"color": "#8B5CF6",
"order": 0,
"is_default": false
},
{
"id": "custom_blocked",
"name": "Blocked",
"color": "#DC2626",
"order": 1,
"is_default": false
}
]
Requirements Satisfied
- ✅ Requirement 1.2: Create new custom task status
- ✅ Requirement 1.3: Validate status name uniqueness within project
- ✅ Requirement 1.4: Auto-assign color from palette if not provided
Next Steps
The following endpoints still need to be implemented:
- PUT endpoint for updating custom status (Task 5)
- DELETE endpoint for deleting custom status (Task 6)
- PATCH endpoint for reordering statuses (Task 7)