# System Patterns ## High-Level Architecture ### Backend Architecture - Django-based MVT (Model-View-Template) architecture - Modular app structure for domain separation - HTMX for dynamic server-side rendering - AlpineJS for client-side interactivity ### Core Apps 1. Parks & Rides - parks/ - Park management - rides/ - Ride information - designers/ - Ride designer profiles - companies/ - Park operator profiles 2. User Content - reviews/ - User reviews - media/ - Media management - moderation/ - Content moderation 3. Supporting Systems - accounts/ - User management - analytics/ - Usage tracking - location/ - Geographic services - email_service/ - Communication - history_tracking/ - Change tracking ## Core Technical Patterns ### Data Flow 1. Request Handling - Django URL routing - View processing - HTMX partial updates - Template rendering 2. Content Management - Moderated submission flow - Media processing pipeline - Review validation system - History tracking 3. User Interactions - HTMX for dynamic updates - AlpineJS for UI state - Partial template loading - Progressive enhancement ### Database Patterns - Django ORM for data access - Related models for complex relationships - Signals for cross-model updates - History tracking for changes ## Key Technical Decisions ### Frontend Strategy 1. Server-Side Rendering - Django templates as base - HTMX for dynamic updates - Partial templates by model - AlpineJS for client state 2. Styling - Tailwind CSS - Component-based design - Responsive layouts ### Backend Organization 1. App Separation - Domain-driven design - Clear responsibility boundaries - Modular functionality - Reusable components 2. Code Structure - Models for data definition - Views for business logic - Templates for presentation - URLs for routing - Signals for cross-cutting concerns ### Integration Patterns 1. External Services - Email service integration - Media storage handling - Analytics tracking - Location services 2. Internal Communication - Django signals - Context processors - Middleware - Template tags ## Data Flow Patterns ### Content Creation 1. User Input - Form submission - Media upload - Review creation - Park/ride updates 2. Processing - Validation - Moderation queue - Media processing - History tracking 3. Publication - Approval workflow - Public visibility - Notification system - Cache updates ### Query Patterns 1. Efficient Loading - Select related - Prefetch related - Cached queries - Optimized indexes 2. Search Operations - Location-based queries - Full-text search - Filtered results - Sorted listings ## FSM State Machine Integration with HTMX ### Overview The codebase implements a reusable FSM (Finite State Machine) infrastructure using django-fsm, integrated with HTMX for seamless state transitions without full page reloads. ### Core Components 1. **FSMTransitionView** (`apps/core/views/views.py`) - Generic view for handling FSM state transitions via HTMX POST requests - Validates permissions using `can_proceed` from django-fsm - Executes transitions and returns updated HTML partials - Sends HX-Trigger headers for toast notifications 2. **FSM Template Tags** (`apps/core/templatetags/fsm_tags.py`) - `get_available_transitions`: Returns available transitions for an object/user - `get_state_value`: Gets current state value - `get_state_display`: Gets human-readable state display - `default_target_id`: Generates HTMX target IDs - `app_label`, `model_name`: Model metadata filters 3. **Reusable Partials** (`templates/htmx/`) - `status_with_actions.html`: Combined status badge with action buttons - `state_actions.html`: Standalone action buttons - `updated_row.html`: Generic fallback for row updates ### Integration Pattern ```django {% load fsm_tags %} {% include 'htmx/status_with_actions.html' with object=submission user=user show_badge=True %} ``` ### FSM Transition Flow with HTMX ```mermaid sequenceDiagram participant User participant Browser participant HTMX participant FSMTransitionView participant Model participant Template User->>Browser: Click "Approve" button Browser->>HTMX: hx-post to FSM transition URL HTMX->>FSMTransitionView: POST /moderation/submissions//transition/transition_to_approved/ FSMTransitionView->>FSMTransitionView: Validate permissions (can_proceed) FSMTransitionView->>Model: Execute transition Model->>Model: Update status field + save Model-->>FSMTransitionView: Return updated object FSMTransitionView->>Template: Render model-specific partial FSMTransitionView-->>HTMX: HTTP 200 + HX-Trigger: showToast HTMX->>Browser: Swap target element with new HTML HTMX->>Browser: Trigger showToast event Browser->>User: Display updated row + success toast ``` ### URL Pattern Configuration FSM transitions use a consistent URL pattern: ``` /api/moderation///transition// ``` Example URL patterns in `apps/moderation/urls.py`: ```python path( "submissions//transition//", FSMTransitionView.as_view(), {"app_label": "moderation", "model_name": "editsubmission"}, name="submission_transition", ) ``` ### Template Resolution FSMTransitionView automatically resolves model-specific templates: 1. `{app_label}/partials/{model_name}_row.html` 2. `{app_label}/partials/{model_name}_item.html` 3. `{app_label}/partials/{model_name}.html` 4. `htmx/updated_row.html` (fallback) ### Toast Notifications The FSMTransitionView includes HX-Trigger headers for toast notifications: ```python response["HX-Trigger"] = json.dumps({ "showToast": { "message": "Submission approved successfully", "type": "success" } }) ``` Dashboard templates listen for these events with Alpine.js: ```javascript @show-toast.window="showToast($event.detail)" ``` ### Status Badge Styling The `status_with_actions.html` partial includes automatic styling based on state: - `PENDING` - Yellow (warning) - `APPROVED` - Green (success) - `REJECTED` - Red (danger) - `ESCALATED` - Orange (caution) - `IN_PROGRESS` - Blue (info) ### Flash Animations Successful transitions include a flash animation class: ```css .animate-flash-success { animation: flash-success 1s ease-in-out; } ``` ### Error Handling Flow ```mermaid sequenceDiagram participant User participant Browser participant HTMX participant FSMTransitionView participant PermissionGuard User->>Browser: Click "Approve" button Browser->>HTMX: hx-post with HX-Request header HTMX->>FSMTransitionView: POST /transition/approve/ FSMTransitionView->>PermissionGuard: Check can_proceed(user) alt Permission Denied PermissionGuard-->>FSMTransitionView: False FSMTransitionView-->>HTMX: 403 + HX-Trigger: showToast (error) HTMX->>Browser: Trigger error toast event Browser->>User: Display red error toast else Permission Granted PermissionGuard-->>FSMTransitionView: True FSMTransitionView->>FSMTransitionView: Execute transition alt Transition Success FSMTransitionView-->>HTMX: 200 + HTML + HX-Trigger: showToast (success) HTMX->>Browser: Swap HTML + trigger success toast Browser->>User: Display updated row + green toast else Transition Failed FSMTransitionView-->>HTMX: 400 + HX-Trigger: showToast (error) HTMX->>Browser: Trigger error toast event Browser->>User: Display red error toast end end ``` ### Error Response Types | Status | Scenario | Toast Type | Message | |--------|----------|------------|---------| | 200 | Success | success | "{Model} has been {action}d successfully" | | 400 | Invalid transition | error | "Transition not allowed from current state" | | 403 | Permission denied | error | "You don't have permission for this action" | | 404 | Object not found | error | "Object not found" | | 500 | Server error | error | "An unexpected error occurred" | ### Testing FSM HTMX Transitions #### Unit Tests Backend unit tests in `apps/moderation/tests.py`, `apps/parks/tests.py`, and `apps/rides/tests.py` cover: - FSM transition logic and state changes - Permission guards and role-based access - Transition history logging with django-fsm-log - Callback execution and side effects #### Integration Tests Integration tests in `backend/tests/integration/test_fsm_transition_view.py` verify: - FSMTransitionView handles HTMX requests correctly - HX-Trigger headers contain proper toast data - Correct partial templates rendered for each model - Permission validation before transition execution - StateLog entries created for each transition #### E2E Tests End-to-end tests using Playwright in `backend/tests/e2e/` validate: - Complete user interaction flow from button click to UI update - Toast notifications appear and auto-dismiss - Loading indicators show during transitions - Error handling displays user-friendly messages - Permission guards prevent unauthorized transitions - Cross-browser compatibility (Chrome, Firefox, Safari) Test files: - `test_moderation_fsm.py` - EditSubmission, PhotoSubmission transitions - `test_park_ride_fsm.py` - Park and Ride status changes - `test_fsm_permissions.py` - Permission guard verification - `test_fsm_error_handling.py` - Error scenarios and loading states #### Running Tests ```bash # Run all FSM tests pytest -k fsm # Run e2e FSM tests pytest backend/tests/e2e/test_moderation_fsm.py pytest backend/tests/e2e/test_park_ride_fsm.py pytest backend/tests/e2e/test_fsm_permissions.py # Run with specific browser pytest --browser firefox backend/tests/e2e/test_moderation_fsm.py # Run with headed mode (see browser) pytest --headed backend/tests/e2e/test_moderation_fsm.py # Run integration tests (faster, no browser) pytest backend/tests/integration/test_fsm_transition_view.py ``` #### Browser Testing Checklist For comprehensive manual testing, see `backend/tests/e2e/BROWSER_TESTING_CHECKLIST.md`. ## Error Handling - Django middleware - Custom error pages - Logging system - User notifications ## Security Patterns - Django authentication - Permission mixins - CSRF protection - XSS prevention - Input validation