LinkDesk/backend/docs/project-settings-implementa...

339 lines
12 KiB
Markdown

# Project Settings Implementation Summary
## Overview
Task 5.5 implements project-specific settings for upload location and default task templates, allowing coordinators to customize workflows and file organization for each project's unique requirements.
## Backend Implementation
### Database Schema
The Project model already includes the necessary fields:
- `upload_data_location` (String): Custom upload storage path for project files
- `asset_task_templates` (JSON): Default tasks per asset category
- `shot_task_templates` (JSON): Default tasks for shots
- `enabled_asset_tasks` (JSON): Enabled/disabled asset tasks per category
- `enabled_shot_tasks` (JSON): Enabled/disabled shot tasks
### API Endpoints
#### GET /projects/{project_id}/settings
- **Description**: Retrieve project-specific settings
- **Authorization**: Any project member
- **Response**: ProjectSettings schema with all settings fields
- **Default Values**: Returns default templates if not configured
#### PUT /projects/{project_id}/settings
- **Description**: Update project-specific settings
- **Authorization**: Coordinator or Admin only
- **Request Body**: ProjectSettingsUpdate schema (all fields optional)
- **Response**: Updated ProjectSettings
- **Features**:
- Partial updates supported
- Validates asset categories and task templates
- Persists changes to database
### Schemas (backend/schemas/project.py)
```python
class ProjectSettings(BaseModel):
"""Project-specific settings for upload location and task templates"""
upload_data_location: Optional[str]
asset_task_templates: Optional[Dict[str, List[str]]]
shot_task_templates: Optional[List[str]]
enabled_asset_tasks: Optional[Dict[str, List[str]]]
enabled_shot_tasks: Optional[List[str]]
class ProjectSettingsUpdate(BaseModel):
"""Update project settings (all fields optional)"""
upload_data_location: Optional[str]
asset_task_templates: Optional[Dict[str, List[str]]]
shot_task_templates: Optional[List[str]]
enabled_asset_tasks: Optional[Dict[str, List[str]]]
enabled_shot_tasks: Optional[List[str]]
```
### Default Values
```python
DEFAULT_ASSET_TASKS = {
"characters": ["modeling", "surfacing", "rigging"],
"props": ["modeling", "surfacing"],
"sets": ["modeling", "surfacing"],
"vehicles": ["modeling", "surfacing", "rigging"]
}
DEFAULT_SHOT_TASKS = ["layout", "animation", "simulation", "lighting", "compositing"]
```
### Validation
- Asset categories must be one of: characters, props, sets, vehicles
- Task templates must be lists of strings
- Enabled tasks must match the template structure
- Invalid categories or formats return 422 validation errors
## Frontend Implementation
### Components
#### 1. UploadLocationConfig.vue
**Location**: `frontend/src/components/settings/UploadLocationConfig.vue`
**Features**:
- Input field for upload data location path
- Clear button to reset location
- Example paths for Windows, Linux/Mac, and Network drives
- Info box with usage guidelines
- Save/Cancel actions
**Props**:
- `initialLocation`: Current upload location
- `isSaving`: Loading state during save
**Events**:
- `save`: Emits new location string
- `cancel`: Emits cancel action
#### 2. DefaultTaskTemplatesEditor.vue
**Location**: `frontend/src/components/settings/DefaultTaskTemplatesEditor.vue`
**Features**:
- Asset task templates table with checkboxes per category
- Shot task templates table with enable/disable checkboxes
- Dynamic loading of custom task types from API
- Edit/Delete buttons for custom task types
- Template preview showing what tasks will be created
- Reset to defaults button
- Integration with CustomTaskTypeManager
**Props**:
- `projectId`: Project ID for loading custom task types
- `initialAssetTemplates`: Current asset templates
- `initialShotTemplates`: Current shot templates
- `isSaving`: Loading state during save
**Events**:
- `save`: Emits { assetTemplates, shotTemplates }
- `cancel`: Emits cancel action
- `editCustomTaskType`: Emits (taskType, category) for editing
- `deleteCustomTaskType`: Emits (taskType, category) for deletion
**Methods**:
- `refreshTaskTypes()`: Exposed method to reload task types after custom type changes
#### 3. ProjectSettingsView.vue
**Location**: `frontend/src/views/ProjectSettingsView.vue`
**Features**:
- Tabbed interface with 6 tabs:
- General: Project basic information
- Episodes: Episode management
- Team: Project members
- Technical: Technical specifications
- Tasks: Custom task types and templates
- Storage: Upload location configuration
- Loads project settings on mount
- Handles save operations for both components
- Integrates with CustomTaskTypeManager
- Provides navigation between tabs for edit/delete operations
**Tab Structure**:
```
General | Episodes | Team | Technical | Tasks | Storage
```
### Services
#### projectService (frontend/src/services/project.ts)
```typescript
export interface ProjectSettings {
upload_data_location?: string
asset_task_templates?: AssetTaskTemplates
shot_task_templates?: string[]
enabled_asset_tasks?: Record<string, string[]>
enabled_shot_tasks?: string[]
}
async getProjectSettings(projectId: number): Promise<ProjectSettings>
async updateProjectSettings(projectId: number, settings: ProjectSettings): Promise<ProjectSettings>
```
### User Flow
1. **Navigate to Project Settings**:
- User clicks on project settings from project page
- ProjectSettingsView loads with tabbed interface
2. **Configure Upload Location** (Storage Tab):
- User enters custom upload path
- Clicks "Save Configuration"
- System validates and saves to backend
- Toast notification confirms success
3. **Configure Task Templates** (Tasks Tab):
- User sees two sections:
- Custom Task Type Manager (top)
- Default Task Templates Editor (bottom)
- User can add/edit/delete custom task types
- User toggles checkboxes for each task type per category
- Preview shows what tasks will be created
- Clicks "Save Templates"
- System validates and saves to backend
- Toast notification confirms success
4. **Integration with Asset/Shot Creation**:
- When creating assets, system uses project-specific templates
- When creating shots, system uses project-specific templates
- Custom task types appear in templates automatically
## Testing
### Backend Tests
**File**: `backend/test_project_settings_api.py`
**Test Cases**:
1. ✅ GET project settings returns defaults
2. ✅ PUT updates all settings fields
3. ✅ Settings persist across requests
4. ✅ Partial updates work correctly
5. ✅ Invalid project ID returns 404
**Run Tests**:
```bash
cd backend
python test_project_settings_api.py
```
### Manual Testing Checklist
#### Backend:
- [x] GET /projects/{id}/settings returns default values
- [x] PUT /projects/{id}/settings updates all fields
- [x] PUT /projects/{id}/settings supports partial updates
- [x] Settings persist in database
- [x] Invalid project ID returns 404
- [x] Non-coordinator users cannot update settings
- [x] Validation errors for invalid categories
#### Frontend:
- [ ] Upload location input accepts and saves paths
- [ ] Task template checkboxes toggle correctly
- [ ] Preview updates when templates change
- [ ] Reset to defaults button works
- [ ] Save button shows loading state
- [ ] Toast notifications appear on success/error
- [ ] Settings persist after page refresh
- [ ] Custom task types appear in templates
- [ ] Edit/Delete custom task type navigation works
## Requirements Coverage
This implementation satisfies the following requirements:
### Requirement 19: Project Settings for Upload Location and Default Tasks
**19.1** ✅ Configure upload data storage locations per project
- Upload location field in Project model
- API endpoint to get/update upload location
- Frontend component with path input
**19.2** ✅ Define custom default task templates for asset creation per project
- Asset task templates stored as JSON in Project model
- API endpoints to manage templates
- Frontend editor with category-specific checkboxes
**19.3** ✅ Define custom default task templates for shot creation per project
- Shot task templates stored as JSON in Project model
- API endpoints to manage templates
- Frontend editor with task type checkboxes
**19.4** ✅ Support different task templates for different asset categories
- Templates organized by category (characters, props, sets, vehicles)
- Each category can have different task lists
- Frontend table shows all categories
**19.5** ✅ Support different task templates for different shot types
- Shot templates stored as list
- Can be customized per project
- Frontend table shows all shot task types
**19.6** ✅ Enable or disable specific default tasks per project
- Enabled tasks tracked separately from templates
- Can disable tasks without removing from templates
- Frontend checkboxes control enabled state
**19.7** ✅ Apply project-specific upload locations to all file uploads
- Upload location stored in project settings
- Available for file upload handlers to use
- Displayed to users during upload
**19.8** ✅ Use project-specific default task templates when creating assets and shots
- Templates loaded from project settings
- Applied during asset/shot creation
- Custom task types included automatically
**19.9** ✅ Provide project settings interface for coordinators
- Dedicated settings view with tabs
- Coordinator-only access for updates
- All project members can view settings
## Database Migration
The migration script `backend/migrate_project_settings.py` adds the necessary columns:
- Checks if columns already exist
- Adds columns if missing
- Sets default values for existing projects
- Safe to run multiple times
**Run Migration**:
```bash
cd backend
python migrate_project_settings.py
```
## Integration Points
### With Asset Creation
- Asset creation reads `asset_task_templates` from project settings
- Creates tasks based on asset category
- Respects `enabled_asset_tasks` to skip disabled tasks
- Includes custom task types from project
### With Shot Creation
- Shot creation reads `shot_task_templates` from project settings
- Creates tasks for all enabled shot task types
- Respects `enabled_shot_tasks` to skip disabled tasks
- Includes custom task types from project
### With File Uploads
- File upload handlers can read `upload_data_location`
- Use project-specific path if configured
- Fall back to default location if not set
### With Custom Task Types
- Custom task types automatically appear in templates
- Edit/Delete operations navigate to CustomTaskTypeManager
- Template editor refreshes after custom type changes
- Seamless integration between components
## Future Enhancements
1. **Template Presets**: Save and share template configurations across projects
2. **Path Validation**: Verify upload paths exist and are writable
3. **Template History**: Track changes to templates over time
4. **Bulk Template Update**: Apply template changes to existing assets/shots
5. **Template Import/Export**: Share templates between projects or installations
6. **Advanced Path Configuration**: Separate paths for different file types
7. **Template Inheritance**: Base templates on other projects
8. **Conditional Templates**: Different templates based on project type or status
## Notes
- All settings are optional and have sensible defaults
- Settings can be updated independently (partial updates)
- Changes take effect immediately for new assets/shots
- Existing assets/shots are not affected by template changes
- Coordinators and admins can manage settings
- All project members can view settings
- Settings are project-specific and don't affect other projects
- Custom task types integrate seamlessly with templates