mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-23 04:51:13 -05:00
Refactor code structure and remove redundant changes
This commit is contained in:
308
django-backend/PHASE_1_FRONTEND_PARITY_PARTIAL_COMPLETE.md
Normal file
308
django-backend/PHASE_1_FRONTEND_PARITY_PARTIAL_COMPLETE.md
Normal file
@@ -0,0 +1,308 @@
|
||||
# Phase 1 Critical Implementation - Frontend Feature Parity
|
||||
|
||||
**Status:** Partial Complete (Tasks 1-2 Done)
|
||||
**Date:** 2025-11-09
|
||||
**Estimated Time:** 6 hours completed of 20 hours total
|
||||
|
||||
## Overview
|
||||
|
||||
Implementing critical missing features to achieve Django backend feature parity with the Supabase schema and frontend code usage. Based on comprehensive audit in `COMPREHENSIVE_FRONTEND_BACKEND_AUDIT.md`.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Task 1: Fix Park Coordinate Update Bug (COMPLETED - 2 hours)
|
||||
|
||||
### Problem
|
||||
Park location coordinates couldn't be updated via API. The `latitude` and `longitude` parameters were being passed to `ParkSubmissionService.update_entity_submission()` but were never used.
|
||||
|
||||
### Root Cause
|
||||
The `ParkSubmissionService` inherited `update_entity_submission()` from base class but didn't handle the coordinate kwargs.
|
||||
|
||||
### Solution Implemented
|
||||
**File:** `django/apps/entities/services/park_submission.py`
|
||||
|
||||
Added override of `update_entity_submission()` method:
|
||||
|
||||
```python
|
||||
@classmethod
|
||||
def update_entity_submission(cls, entity, user, update_data, **kwargs):
|
||||
"""
|
||||
Update a Park with special coordinate handling.
|
||||
|
||||
Overrides base class to handle latitude/longitude updates using the
|
||||
Park model's set_location() method which handles both SQLite and PostGIS modes.
|
||||
"""
|
||||
# Extract coordinates for special handling
|
||||
latitude = kwargs.pop('latitude', None)
|
||||
longitude = kwargs.pop('longitude', None)
|
||||
|
||||
# If coordinates are provided, add them to update_data for tracking
|
||||
if latitude is not None:
|
||||
update_data['latitude'] = latitude
|
||||
if longitude is not None:
|
||||
update_data['longitude'] = longitude
|
||||
|
||||
# Create update submission through base class
|
||||
submission, updated_park = super().update_entity_submission(
|
||||
entity, user, update_data, **kwargs
|
||||
)
|
||||
|
||||
# If park was updated (moderator bypass), set location using helper method
|
||||
if updated_park and (latitude is not None and longitude is not None):
|
||||
try:
|
||||
updated_park.set_location(float(longitude), float(latitude))
|
||||
updated_park.save()
|
||||
logger.info(f"Park {updated_park.id} location updated: ({latitude}, {longitude})")
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to update location for Park {updated_park.id}: {str(e)}")
|
||||
|
||||
return submission, updated_park
|
||||
```
|
||||
|
||||
### Testing Required
|
||||
- Test coordinate updates via API endpoints
|
||||
- Verify both SQLite (lat/lng) and PostGIS (location_point) modes work correctly
|
||||
- Confirm moderator bypass updates coordinates immediately
|
||||
- Verify regular user submissions track coordinate changes
|
||||
|
||||
---
|
||||
|
||||
## ✅ Task 2: Implement Ride Name History Model (COMPLETED - 4 hours)
|
||||
|
||||
### Frontend Usage
|
||||
Heavily used in 34 places across 6+ files:
|
||||
- `RideDetail.tsx` - Shows "formerly known as" section
|
||||
- `FormerNamesSection.tsx` - Display component
|
||||
- `FormerNamesEditor.tsx` - Admin editing
|
||||
- `RideForm.tsx` - Form handling
|
||||
- `entitySubmissionHelpers.ts` - Submission logic
|
||||
|
||||
### Implementation
|
||||
|
||||
#### 1. Model Created
|
||||
**File:** `django/apps/entities/models.py`
|
||||
|
||||
```python
|
||||
@pghistory.track()
|
||||
class RideNameHistory(BaseModel):
|
||||
"""
|
||||
Tracks historical names for rides.
|
||||
|
||||
Rides can change names over their lifetime, and this model maintains
|
||||
a complete history of all former names with optional date ranges and reasons.
|
||||
"""
|
||||
|
||||
ride = models.ForeignKey(
|
||||
'Ride',
|
||||
on_delete=models.CASCADE,
|
||||
related_name='name_history',
|
||||
help_text="Ride this name history belongs to"
|
||||
)
|
||||
former_name = models.CharField(
|
||||
max_length=255,
|
||||
db_index=True,
|
||||
help_text="Previous name of the ride"
|
||||
)
|
||||
|
||||
# Date range when this name was used
|
||||
from_year = models.IntegerField(null=True, blank=True)
|
||||
to_year = models.IntegerField(null=True, blank=True)
|
||||
|
||||
# Precise date of name change (optional)
|
||||
date_changed = models.DateField(null=True, blank=True)
|
||||
date_changed_precision = models.CharField(max_length=20, null=True, blank=True)
|
||||
|
||||
# Context
|
||||
reason = models.TextField(null=True, blank=True)
|
||||
|
||||
# Display ordering
|
||||
order_index = models.IntegerField(null=True, blank=True, db_index=True)
|
||||
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Ride Name History'
|
||||
verbose_name_plural = 'Ride Name Histories'
|
||||
ordering = ['ride', '-to_year', '-from_year', 'order_index']
|
||||
indexes = [
|
||||
models.Index(fields=['ride', 'from_year']),
|
||||
models.Index(fields=['ride', 'to_year']),
|
||||
models.Index(fields=['former_name']),
|
||||
]
|
||||
```
|
||||
|
||||
#### 2. Migration Created
|
||||
**File:** `django/apps/entities/migrations/0007_add_ride_name_history.py`
|
||||
|
||||
Migration includes:
|
||||
- RideNameHistory model creation
|
||||
- RideNameHistoryEvent model for pghistory tracking
|
||||
- Proper indexes on ride, from_year, to_year, and former_name
|
||||
- pghistory triggers for automatic change tracking
|
||||
|
||||
#### 3. Admin Interface Added
|
||||
**File:** `django/apps/entities/admin.py`
|
||||
|
||||
- Added `RideNameHistory` to imports
|
||||
- Created `RideNameHistoryInline` for inline editing within Ride admin
|
||||
- Added inline to `RideAdmin.inlines`
|
||||
- Fields: former_name, from_year, to_year, date_changed, reason, order_index
|
||||
- Collapsible section in ride detail page
|
||||
|
||||
### Remaining Work for Task 2
|
||||
- [ ] Create API endpoint: `GET /api/v1/rides/{ride_id}/name-history/`
|
||||
- [ ] Add name_history to ride detail serialization
|
||||
- [ ] Consider if CRUD operations need Sacred Pipeline integration
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Task 3: Implement Entity Timeline Events (NOT STARTED - 6 hours)
|
||||
|
||||
### Frontend Usage
|
||||
5 files actively use this:
|
||||
- `EntityTimelineManager.tsx` - Full timeline UI
|
||||
- `entitySubmissionHelpers.ts` - Sacred Pipeline integration
|
||||
- `systemActivityService.ts` - Activity tracking
|
||||
|
||||
### Required Implementation
|
||||
1. Create new `django/apps/timeline/` app
|
||||
2. Create `EntityTimelineEvent` model with:
|
||||
- Entity tracking (entity_id, entity_type)
|
||||
- Event details (type, date, title, description)
|
||||
- Location changes (from_location, to_location)
|
||||
- Value changes (from_value, to_value)
|
||||
- Moderation support (is_public, created_by, approved_by)
|
||||
- Submission integration
|
||||
3. Integrate with Sacred Pipeline (submission flow)
|
||||
4. Create API endpoints (CRUD + list by entity)
|
||||
5. Add admin interface
|
||||
6. Update `config/settings/base.py` INSTALLED_APPS
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Task 4: Implement Reports System (NOT STARTED - 8 hours)
|
||||
|
||||
### Frontend Usage
|
||||
7 files actively use reporting:
|
||||
- `ReportButton.tsx` - User reporting UI
|
||||
- `ReportsQueue.tsx` - Moderator review queue
|
||||
- `RecentActivity.tsx` - Dashboard display
|
||||
- `useModerationStats.ts` - Statistics hooks
|
||||
- `systemActivityService.ts` - System tracking
|
||||
|
||||
### Required Implementation
|
||||
1. Create new `django/apps/reports/` app
|
||||
2. Create `Report` model with:
|
||||
- Report type and entity tracking
|
||||
- Reporter information
|
||||
- Status workflow (pending → reviewing → resolved/dismissed)
|
||||
- Reviewer tracking
|
||||
- Proper indexes for performance
|
||||
3. Create API endpoints:
|
||||
- POST `/api/v1/reports/` - Create report
|
||||
- GET `/api/v1/reports/` - List reports (moderators only)
|
||||
- PATCH `/api/v1/reports/{id}/` - Update status
|
||||
- GET `/api/v1/reports/stats/` - Statistics
|
||||
4. Implement permissions (users can create, moderators can review)
|
||||
5. Add admin interface
|
||||
6. Update settings
|
||||
|
||||
---
|
||||
|
||||
## Key Architecture Patterns Followed
|
||||
|
||||
### 1. pghistory Integration
|
||||
- All models use `@pghistory.track()` decorator
|
||||
- Automatic change tracking with pghistory events
|
||||
- Maintains audit trail for all changes
|
||||
|
||||
### 2. Admin Interface
|
||||
- Using Unfold theme for modern UI
|
||||
- Inline editing for related models
|
||||
- Proper fieldsets and collapsible sections
|
||||
- Search and filter capabilities
|
||||
|
||||
### 3. Model Design
|
||||
- Proper indexes for performance
|
||||
- Foreign key relationships with appropriate `on_delete`
|
||||
- `created_at` and `updated_at` timestamps
|
||||
- Help text for documentation
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria Progress
|
||||
|
||||
- [x] Park coordinates can be updated via API
|
||||
- [x] Ride name history model exists
|
||||
- [x] Ride name history admin interface functional
|
||||
- [ ] Ride name history displayed on ride detail pages
|
||||
- [ ] Timeline events can be created and displayed
|
||||
- [ ] Users can report content
|
||||
- [ ] Moderators can review reports
|
||||
- [ ] All models have admin interfaces
|
||||
- [ ] All functionality follows Sacred Pipeline where appropriate
|
||||
- [ ] Proper permissions enforced
|
||||
- [ ] No regressions to existing functionality
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Complete Task 2 (remaining items)**:
|
||||
- Add API endpoint for ride name history
|
||||
- Add to ride detail serialization
|
||||
|
||||
2. **Implement Task 3 (Timeline Events)**:
|
||||
- Create timeline app structure
|
||||
- Implement EntityTimelineEvent model
|
||||
- Sacred Pipeline integration
|
||||
- API endpoints and admin
|
||||
|
||||
3. **Implement Task 4 (Reports System)**:
|
||||
- Create reports app structure
|
||||
- Implement Report model
|
||||
- API endpoints with permissions
|
||||
- Admin interface and statistics
|
||||
|
||||
4. **Testing & Validation**:
|
||||
- Test all new endpoints
|
||||
- Verify frontend integration
|
||||
- Check permissions enforcement
|
||||
- Performance testing with indexes
|
||||
|
||||
---
|
||||
|
||||
## Files Modified
|
||||
|
||||
### Task 1 (Park Coordinates)
|
||||
- `django/apps/entities/services/park_submission.py`
|
||||
|
||||
### Task 2 (Ride Name History)
|
||||
- `django/apps/entities/models.py`
|
||||
- `django/apps/entities/migrations/0007_add_ride_name_history.py`
|
||||
- `django/apps/entities/admin.py`
|
||||
|
||||
### Files to Create (Tasks 3 & 4)
|
||||
- `django/apps/timeline/__init__.py`
|
||||
- `django/apps/timeline/models.py`
|
||||
- `django/apps/timeline/admin.py`
|
||||
- `django/apps/timeline/apps.py`
|
||||
- `django/apps/reports/__init__.py`
|
||||
- `django/apps/reports/models.py`
|
||||
- `django/apps/reports/admin.py`
|
||||
- `django/apps/reports/apps.py`
|
||||
- API endpoint files for both apps
|
||||
|
||||
---
|
||||
|
||||
## Time Tracking
|
||||
|
||||
- Task 1: 2 hours ✅ COMPLETE
|
||||
- Task 2: 4 hours ✅ MOSTLY COMPLETE (API endpoints remaining)
|
||||
- Task 3: 6 hours 🔄 NOT STARTED
|
||||
- Task 4: 8 hours 🔄 NOT STARTED
|
||||
|
||||
**Total Completed:** 6 hours
|
||||
**Remaining:** 14 hours
|
||||
**Progress:** 30% complete
|
||||
Reference in New Issue
Block a user