ThrillWiki
Comprehensive theme park database platform with user-generated content, expert moderation, and rich media support
Django REST Framework
120+
Parks
Rides
Companies
Users
Django 5.0+
Django REST Framework
PostgreSQL with PostGIS
Redis
Celery
NO React/Vue/Angular allowed
Cloudflare Images
Direct Upload with variants and transformations
pghistory for all model changes
TrackedModel
parks/
OPERATOR
PROPERTY_OWNER
rides/
MANUFACTURER
DESIGNER
accounts/
media/
moderation/
core/
NEVER mix park/ride company roles - fundamental business rule
TrackedModel (all models inherit)
SluggedModel for slugs with history
Nested URLs (/parks/{slug}/rides/{slug}/)
Mandatory trailing slashes
RichChoiceField with metadata
color, icon, description, css_class
NEVER use Django tuple choices
CloudflareImagesField
photo types and attribution
PostGIS for geographic data
separate location models
uv run manage.py runserver_plus
python manage.py
uv run manage.py makemigrations
uv run manage.py migrate
uv add <package>
pip install
Always use `uv run manage.py <command>`
Token-based
USER
MODERATOR
ADMIN
SUPERUSER
25+ parameters
15+ parameters
Standard DRF pagination
Rich error responses with details
Multi-level (Redis, CDN, browser)
Signal-based invalidation
NEVER MOCK DATA - All responses must use real database queries
RichChoiceField(choice_group="group_name", domain="domain_name")
domain-specific choices.py using RichChoice dataclass
register_choices() function in domain __init__.py
color
icon
description
css_class
NO tuple-based choices allowed anywhere in codebase
Dynamic updates
Client state management
Styling framework
Progressive enhancement required
Latest 2 versions of major browsers
First Contentful Paint < 1.5s
Time to Interactive < 2s
Core Web Vitals compliance
All models must inherit from TrackedModel
Use SluggedModel for entities with slugs and history tracking
Always use RichChoiceField instead of Django choices
Must include trailing slashes and follow nested pattern
Use CloudflareImagesField for all image handling
Use PostGIS fields and separate location models
Parks domain: Only OPERATOR and PROPERTY_OWNER roles
Rides domain: Only MANUFACTURER and DESIGNER roles
CRITICAL: Never allow cross-domain company roles
All model changes must be tracked via pghistory
All API responses must use real database data
Geographic data must use PostGIS for accuracy
Use uv for all Python package operations
Use runserver_plus for enhanced development server
Always use uv run for Django management commands
All functionality must work with progressive enhancement