diff --git a/CI_README.md b/CI_README.md
deleted file mode 100644
index 8c7825b8..00000000
--- a/CI_README.md
+++ /dev/null
@@ -1,277 +0,0 @@
-# ThrillWiki CI/CD System
-
-This repository includes a **complete automated CI/CD system** that creates a Linux VM on Unraid and automatically deploys ThrillWiki when commits are pushed to GitHub.
-
-## 🚀 Complete Automation (Unraid)
-
-For **full automation** including VM creation on Unraid:
-
-```bash
-./scripts/unraid/setup-complete-automation.sh
-```
-
-This single command will:
-- ✅ Create and configure VM on Unraid
-- ✅ Install Ubuntu Server with all dependencies
-- ✅ Deploy ThrillWiki application
-- ✅ Set up automated CI/CD pipeline
-- ✅ Configure webhook listener
-- ✅ Test the entire system
-
-## Manual Setup (Any Linux VM)
-
-For manual setup on existing Linux VMs:
-
-```bash
-./scripts/setup-vm-ci.sh
-```
-
-## System Components
-
-### 📁 Files Created
-
-```
-scripts/
-├── ci-start.sh # Local development server startup
-├── webhook-listener.py # GitHub webhook listener
-├── vm-deploy.sh # VM deployment script
-├── setup-vm-ci.sh # Manual VM setup script
-├── unraid/
-│ ├── vm-manager.py # Unraid VM management
-│ └── setup-complete-automation.sh # Complete automation
-└── systemd/
- ├── thrillwiki.service # Django app service
- └── thrillwiki-webhook.service # Webhook listener service
-
-docs/
-├── VM_DEPLOYMENT_SETUP.md # Manual setup documentation
-└── UNRAID_COMPLETE_AUTOMATION.md # Complete automation guide
-```
-
-### 🔄 Deployment Flow
-
-**Complete Automation:**
-```
-GitHub Push → Webhook → Local Listener → SSH → Unraid VM → Deploy & Restart
-```
-
-**Manual Setup:**
-```
-GitHub Push → Webhook → Local Listener → SSH to VM → Deploy Script → Server Restart
-```
-
-## Features
-
-- **Complete VM Automation**: Automatically creates VMs on Unraid
-- **Automatic Deployment**: Deploys on push to main branch
-- **Health Checks**: Verifies deployment success
-- **Rollback Support**: Automatic rollback on deployment failure
-- **Service Management**: Systemd integration for reliable service management
-- **Database Setup**: Automated PostgreSQL configuration
-- **Logging**: Comprehensive logging for debugging
-- **Security**: SSH key authentication and webhook secrets
-- **One-Command Setup**: Full automation with single script
-
-## Usage
-
-### Complete Automation (Recommended)
-
-For Unraid users, run the complete automation:
-
-```bash
-./scripts/unraid/setup-complete-automation.sh
-```
-
-After setup, start the webhook listener:
-```bash
-./start-webhook.sh
-```
-
-### Local Development
-
-Start the local development server:
-
-```bash
-./scripts/ci-start.sh
-```
-
-### VM Management (Unraid)
-
-```bash
-# Check VM status
-python3 scripts/unraid/vm-manager.py status
-
-# Start/stop VM
-python3 scripts/unraid/vm-manager.py start
-python3 scripts/unraid/vm-manager.py stop
-
-# Get VM IP
-python3 scripts/unraid/vm-manager.py ip
-```
-
-### Service Management
-
-On the VM:
-
-```bash
-# Check status
-ssh thrillwiki-vm "./scripts/vm-deploy.sh status"
-
-# Restart service
-ssh thrillwiki-vm "./scripts/vm-deploy.sh restart"
-
-# View logs
-ssh thrillwiki-vm "journalctl -u thrillwiki -f"
-```
-
-### Manual VM Deployment
-
-Deploy to VM manually:
-
-```bash
-ssh thrillwiki-vm "cd thrillwiki && ./scripts/vm-deploy.sh"
-```
-
-## Configuration
-
-### Automated Configuration
-
-The complete automation script creates all necessary configuration files:
-
-- `***REMOVED***.unraid` - Unraid VM configuration
-- `***REMOVED***.webhook` - Webhook listener configuration
-- SSH keys and configuration
-- Service configurations
-
-### Manual Environment Variables
-
-For manual setup, create `***REMOVED***.webhook` file:
-
-```bash
-WEBHOOK_PORT=9000
-WEBHOOK_SECRET=your_secret_here
-VM_HOST=your_vm_ip
-VM_USER=ubuntu
-VM_KEY_PATH=/path/to/ssh/key
-VM_PROJECT_PATH=/home/ubuntu/thrillwiki
-REPO_URL=https://github.com/username/repo.git
-DEPLOY_BRANCH=main
-```
-
-### GitHub Webhook
-
-Configure in your GitHub repository:
-- **URL**: `http://YOUR_PUBLIC_IP:9000/webhook`
-- **Content Type**: `application/json`
-- **Secret**: Your webhook secret
-- **Events**: Push events
-
-## Requirements
-
-### For Complete Automation
-- **Local Machine**: Python 3.8+, SSH client
-- **Unraid Server**: 6.8+ with VM support
-- **Resources**: 4GB RAM, 50GB disk minimum
-- **Ubuntu ISO**: Ubuntu Server 22.04 in `/mnt/user/isos/`
-
-### For Manual Setup
-- **Local Machine**: Python 3.8+, SSH access to VM, Public IP
-- **Linux VM**: Ubuntu 20.04+, Python 3.8+, UV package manager, Git, SSH server
-
-## Troubleshooting
-
-### Complete Automation Issues
-
-1. **VM Creation Fails**
- ```bash
- # Check Unraid VM support
- ssh unraid "virsh list --all"
-
- # Verify Ubuntu ISO exists
- ssh unraid "ls -la /mnt/user/isos/ubuntu-*.iso"
- ```
-
-2. **VM Won't Start**
- ```bash
- # Check VM status
- python3 scripts/unraid/vm-manager.py status
-
- # Check Unraid logs
- ssh unraid "tail -f /var/log/libvirt/qemu/thrillwiki-vm.log"
- ```
-
-### General Issues
-
-1. **SSH Connection Failed**
- ```bash
- # Check SSH key permissions
- chmod 600 ~/.ssh/thrillwiki_vm
-
- # Test connection
- ssh thrillwiki-vm
- ```
-
-2. **Webhook Not Receiving Events**
- ```bash
- # Check if port is open
- sudo ufw allow 9000
-
- # Verify webhook URL in GitHub
- curl -X GET http://localhost:9000/health
- ```
-
-3. **Service Won't Start**
- ```bash
- # Check service logs
- ssh thrillwiki-vm "journalctl -u thrillwiki --no-pager"
-
- # Manual start
- ssh thrillwiki-vm "cd thrillwiki && ./scripts/ci-start.sh"
- ```
-
-### Logs
-
-- **Setup logs**: `logs/unraid-automation.log`
-- **Local webhook**: `logs/webhook.log`
-- **VM deployment**: `logs/deploy.log` (on VM)
-- **Django server**: `logs/django.log` (on VM)
-- **System logs**: `journalctl -u thrillwiki -f` (on VM)
-
-## Security Notes
-
-- Automated SSH key generation and management
-- Dedicated keys for each connection (VM access, Unraid access)
-- No password authentication
-- Systemd security features enabled
-- Firewall configuration support
-- Secret management in environment files
-
-## Documentation
-
-- **Complete Automation**: [`docs/UNRAID_COMPLETE_AUTOMATION.md`](docs/UNRAID_COMPLETE_AUTOMATION.md)
-- **Manual Setup**: [`docs/VM_DEPLOYMENT_SETUP.md`](docs/VM_DEPLOYMENT_SETUP.md)
-
----
-
-## Quick Start Summary
-
-### For Unraid Users (Complete Automation)
-```bash
-# One command to set up everything
-./scripts/unraid/setup-complete-automation.sh
-
-# Start webhook listener
-./start-webhook.sh
-
-# Push commits to auto-deploy!
-```
-
-### For Existing VM Users
-```bash
-# Manual setup
-./scripts/setup-vm-ci.sh
-
-# Configure webhook and push to deploy
-```
-
-**The system will automatically deploy your Django application whenever you push commits to the main branch!** 🚀
\ No newline at end of file
diff --git a/CRITICAL_ANALYSIS_HTMX_ALPINE.md b/CRITICAL_ANALYSIS_HTMX_ALPINE.md
deleted file mode 100644
index 41bfb89b..00000000
--- a/CRITICAL_ANALYSIS_HTMX_ALPINE.md
+++ /dev/null
@@ -1,232 +0,0 @@
-# Critical Analysis: Current HTMX + Alpine.js Implementation
-
-## Executive Summary
-
-After thorough analysis, the current HTMX + Alpine.js implementation has **significant gaps** compared to the React frontend functionality. While the foundation exists, there are critical missing pieces that prevent it from being a true replacement for the React frontend.
-
-## Major Issues Identified
-
-### 1. **Incomplete Component Parity** ❌
-
-**React Frontend Has:**
-- Sophisticated park/ride cards with hover effects, ratings, status badges
-- Advanced search with autocomplete and real-time suggestions
-- Complex filtering UI with multiple filter types
-- Rich user profile management
-- Modal-based authentication flows
-- Theme switching with system preference detection
-- Responsive image handling with Next.js Image optimization
-
-**Current Django Templates Have:**
-- Basic card layouts without advanced interactions
-- Simple search without autocomplete
-- Limited filtering capabilities
-- Basic user menus
-- No modal authentication system
-- Basic theme toggle
-
-### 2. **Missing Critical Pages** ❌
-
-**React Frontend Pages Not Implemented:**
-- `/profile` - User profile management
-- `/settings` - User settings and preferences
-- `/api-test` - API testing interface
-- `/test-ride` - Ride testing components
-- Advanced search results page
-- User dashboard/account management
-
-**Current Django Only Has:**
-- Basic park/ride listing pages
-- Simple detail pages
-- Admin/moderation interfaces
-
-### 3. **Inadequate State Management** ❌
-
-**React Frontend Uses:**
-- Complex state management with custom hooks
-- Global authentication state
-- Theme provider with system detection
-- Search state with debouncing
-- Filter state with URL synchronization
-
-**Current Alpine.js Has:**
-- Basic component-level state
-- Simple theme toggle
-- No global state management
-- No URL state synchronization
-- No proper error handling
-
-### 4. **Poor API Integration** ❌
-
-**React Frontend Features:**
-- TypeScript API clients with proper typing
-- Error handling and loading states
-- Optimistic updates
-- Proper authentication headers
-- Response caching
-
-**Current HTMX Implementation:**
-- Basic HTMX requests without error handling
-- No loading states
-- No proper authentication integration
-- No response validation
-- No caching strategy
-
-### 5. **Missing Advanced UI Components** ❌
-
-**React Frontend Components Missing:**
-- Advanced data tables with sorting/filtering
-- Image galleries with lightbox
-- Multi-step forms
-- Rich text editors
-- Date/time pickers
-- Advanced modals and dialogs
-- Toast notifications system
-- Skeleton loading states
-
-### 6. **Inadequate Mobile Experience** ❌
-
-**React Frontend Mobile Features:**
-- Responsive design with proper breakpoints
-- Touch-optimized interactions
-- Mobile-specific navigation patterns
-- Swipe gestures
-- Mobile-optimized forms
-
-**Current Implementation:**
-- Basic responsive layout
-- No touch optimizations
-- Simple mobile menu
-- No mobile-specific interactions
-
-## Specific Technical Gaps
-
-### Authentication System
-```html
-
-Login
-
-
-
-
-
-```
-
-### Search Functionality
-```javascript
-// Current: Basic search
-Alpine.data('searchComponent', () => ({
- query: '',
- async search() {
- // Basic fetch without proper error handling
- }
-}))
-
-// Needed: Advanced search like React
-Alpine.data('advancedSearch', () => ({
- query: '',
- filters: {},
- suggestions: [],
- loading: false,
- debounceTimer: null,
- // Complex search logic with debouncing, caching, etc.
-}))
-```
-
-### Component Architecture
-```html
-
-
-
{{ park.name }}
-
-
-
-
-
-
-```
-
-## Performance Issues
-
-### 1. **No Code Splitting**
-- React frontend uses dynamic imports and code splitting
-- Current implementation loads everything upfront
-- No lazy loading of components or routes
-
-### 2. **Inefficient HTMX Usage**
-- Multiple HTMX requests for simple interactions
-- No request batching or optimization
-- No proper caching headers
-
-### 3. **Poor Asset Management**
-- No asset optimization
-- No image optimization (missing Next.js Image equivalent)
-- No CSS/JS minification strategy
-
-## Missing Developer Experience
-
-### 1. **No Type Safety**
-- React frontend has full TypeScript support
-- Current implementation has no type checking
-- No API contract validation
-
-### 2. **Poor Error Handling**
-- No global error boundaries
-- No proper error reporting
-- No user-friendly error messages
-
-### 3. **No Testing Strategy**
-- React frontend has component testing
-- Current implementation has no frontend tests
-- No integration testing
-
-## Critical Missing Features
-
-### 1. **Real-time Features**
-- No WebSocket integration
-- No live updates
-- No real-time notifications
-
-### 2. **Advanced Interactions**
-- No drag and drop
-- No complex animations
-- No keyboard navigation
-- No accessibility features
-
-### 3. **Data Management**
-- No client-side caching
-- No optimistic updates
-- No offline support
-- No data synchronization
-
-## Recommended Action Plan
-
-### Phase 1: Critical Component Migration (High Priority)
-1. **Authentication System** - Implement modal-based auth with proper validation
-2. **Advanced Search** - Build autocomplete with debouncing and caching
-3. **User Profile/Settings** - Create comprehensive user management
-4. **Enhanced Cards** - Implement rich park/ride cards with interactions
-
-### Phase 2: Advanced Features (Medium Priority)
-1. **State Management** - Implement proper global state with Alpine stores
-2. **API Integration** - Build robust API client with error handling
-3. **Mobile Optimization** - Enhance mobile experience
-4. **Performance** - Implement caching and optimization
-
-### Phase 3: Polish and Testing (Low Priority)
-1. **Error Handling** - Implement comprehensive error boundaries
-2. **Testing** - Add frontend testing suite
-3. **Accessibility** - Ensure WCAG compliance
-4. **Documentation** - Create comprehensive component docs
-
-## Conclusion
-
-The current HTMX + Alpine.js implementation is **NOT ready** to replace the React frontend. It's missing approximately **60-70%** of the functionality and sophistication of the React application.
-
-A proper migration requires:
-- **3-4 weeks of intensive development**
-- **Complete rewrite of most components**
-- **New architecture for state management**
-- **Comprehensive testing and optimization**
-
-The existing Django templates are a good foundation, but they need **significant enhancement** to match the React frontend's capabilities.
diff --git a/FRONTEND_MIGRATION_PLAN.md b/FRONTEND_MIGRATION_PLAN.md
deleted file mode 100644
index b1bd8cfa..00000000
--- a/FRONTEND_MIGRATION_PLAN.md
+++ /dev/null
@@ -1,258 +0,0 @@
-# Frontend Migration Plan: React/Next.js to HTMX + Alpine.js
-
-## Executive Summary
-
-Based on my analysis, this project already has a **fully functional HTMX + Alpine.js Django backend** with comprehensive templates. The task is to migrate the separate Next.js React frontend (`frontend/` directory) to integrate seamlessly with the existing Django HTMX + Alpine.js architecture.
-
-## Current State Analysis
-
-### ✅ Django Backend (Already Complete)
-- **HTMX Integration**: Already implemented with proper headers and partial templates
-- **Alpine.js Components**: Extensive use of Alpine.js for interactivity
-- **Template Structure**: Comprehensive template hierarchy with partials
-- **Authentication**: Complete auth system with modals and forms
-- **Styling**: Tailwind CSS with dark mode support
-- **Components**: Reusable components for cards, pagination, forms, etc.
-
-### 🔄 React Frontend (To Be Migrated)
-- **Next.js App Router**: Modern React application structure
-- **Component Library**: Extensive UI components using shadcn/ui
-- **Authentication**: React-based auth hooks and providers
-- **Theme Management**: React theme provider system
-- **API Integration**: TypeScript API clients for Django backend
-
-## Migration Strategy
-
-### Phase 1: Template Enhancement (Extend Django Templates)
-
-Instead of replacing the existing Django templates, we'll enhance them to match the React frontend's design and functionality.
-
-#### 1.1 Header Component Migration
-**Current Django**: Basic header with navigation
-**React Frontend**: Advanced header with browse menu, search, theme toggle, user dropdown
-
-**Action**: Enhance `backend/templates/base/base.html` header section
-
-#### 1.2 Component Library Integration
-**Current Django**: Basic components
-**React Frontend**: Rich component library (buttons, cards, modals, etc.)
-
-**Action**: Create Django template components matching shadcn/ui design system
-
-#### 1.3 Advanced Interactivity
-**Current Django**: Basic Alpine.js usage
-**React Frontend**: Complex state management and interactions
-
-**Action**: Enhance Alpine.js components with advanced patterns
-
-### Phase 2: Django View Enhancements
-
-#### 2.1 API Response Optimization
-- Enhance existing Django views to support both full page and HTMX partial responses
-- Implement proper JSON responses for Alpine.js components
-- Add advanced filtering and search capabilities
-
-#### 2.2 Authentication Flow
-- Enhance existing Django auth to match React frontend UX
-- Implement modal-based login/signup (already partially done)
-- Add proper error handling and validation
-
-### Phase 3: Frontend Asset Migration
-
-#### 3.1 Static Assets
-- Migrate React component styles to Django static files
-- Enhance Tailwind configuration
-- Add missing JavaScript utilities
-
-#### 3.2 Alpine.js Store Management
-- Implement global state management using Alpine.store()
-- Create reusable Alpine.js components using Alpine.data()
-- Add proper event handling and communication
-
-## Implementation Plan
-
-### Step 1: Analyze Component Gaps
-Compare React components with Django templates to identify missing functionality:
-
-1. **Browse Menu**: React has sophisticated browse dropdown
-2. **Search Functionality**: React has advanced search with autocomplete
-3. **Theme Toggle**: React has system/light/dark theme support
-4. **User Management**: React has comprehensive user profile management
-5. **Modal System**: React has advanced modal components
-6. **Form Handling**: React has sophisticated form validation
-
-### Step 2: Enhance Django Templates
-
-#### Base Template Enhancements
-```html
-
-
-
-
-
-
-
-```
-
-#### Alpine.js Component Library
-```javascript
-// Global Alpine.js components
-Alpine.data('browseMenu', () => ({
- open: false,
- toggle() { this.open = !this.open }
-}))
-
-Alpine.data('searchComponent', () => ({
- query: '',
- results: [],
- async search() {
- // Implement search logic
- }
-}))
-```
-
-### Step 3: Django View Enhancements
-
-#### Enhanced Views for HTMX
-```python
-def enhanced_park_list(request):
- if request.headers.get('HX-Request'):
- # Return partial template for HTMX
- return render(request, 'parks/partials/park_list.html', context)
- # Return full page
- return render(request, 'parks/park_list.html', context)
-```
-
-### Step 4: Component Migration Priority
-
-1. **Header Component** (High Priority)
- - Browse menu with categories
- - Advanced search with autocomplete
- - User dropdown with profile management
- - Theme toggle with system preference
-
-2. **Navigation Components** (High Priority)
- - Mobile menu with slide-out
- - Breadcrumb navigation
- - Tab navigation
-
-3. **Form Components** (Medium Priority)
- - Advanced form validation
- - File upload components
- - Multi-step forms
-
-4. **Data Display Components** (Medium Priority)
- - Advanced card layouts
- - Data tables with sorting/filtering
- - Pagination components
-
-5. **Modal and Dialog Components** (Low Priority)
- - Confirmation dialogs
- - Image galleries
- - Settings panels
-
-## Technical Implementation Details
-
-### HTMX Patterns to Implement
-
-1. **Lazy Loading**
-```html
-
- Loading parks...
-
-```
-
-2. **Infinite Scroll**
-```html
-
- Load more...
-
-```
-
-3. **Live Search**
-```html
-
-```
-
-### Alpine.js Patterns to Implement
-
-1. **Global State Management**
-```javascript
-Alpine.store('app', {
- user: null,
- theme: 'system',
- searchQuery: ''
-})
-```
-
-2. **Reusable Components**
-```javascript
-Alpine.data('modal', () => ({
- open: false,
- show() { this.open = true },
- hide() { this.open = false }
-}))
-```
-
-## File Structure After Migration
-
-```
-backend/
-├── templates/
-│ ├── base/
-│ │ ├── base.html (enhanced)
-│ │ └── components/
-│ │ ├── header.html
-│ │ ├── footer.html
-│ │ ├── navigation.html
-│ │ └── search.html
-│ ├── components/
-│ │ ├── ui/
-│ │ │ ├── button.html
-│ │ │ ├── card.html
-│ │ │ ├── modal.html
-│ │ │ └── form.html
-│ │ └── layout/
-│ │ ├── browse_menu.html
-│ │ └── user_menu.html
-│ └── partials/
-│ ├── htmx/
-│ └── alpine/
-├── static/
-│ ├── js/
-│ │ ├── alpine-components.js
-│ │ ├── htmx-config.js
-│ │ └── app.js
-│ └── css/
-│ ├── components.css
-│ └── tailwind.css
-```
-
-## Success Metrics
-
-1. **Functionality Parity**: All React frontend features work in Django templates
-2. **Design Consistency**: Visual design matches React frontend exactly
-3. **Performance**: Page load times improved due to server-side rendering
-4. **User Experience**: Smooth interactions with HTMX and Alpine.js
-5. **Maintainability**: Clean, reusable template components
-
-## Timeline Estimate
-
-- **Phase 1**: Template Enhancement (3-4 days)
-- **Phase 2**: Django View Enhancements (2-3 days)
-- **Phase 3**: Frontend Asset Migration (2-3 days)
-- **Testing & Refinement**: 2-3 days
-
-**Total Estimated Time**: 9-13 days
-
-## Next Steps
-
-1. **Immediate**: Start with header component migration
-2. **Priority**: Focus on high-impact components first
-3. **Testing**: Implement comprehensive testing for each migrated component
-4. **Documentation**: Update all documentation to reflect new architecture
-
-This migration will result in a unified, server-rendered application with the rich interactivity of the React frontend but the performance and simplicity of HTMX + Alpine.js.
diff --git a/MIGRATION_IMPLEMENTATION_SUMMARY.md b/MIGRATION_IMPLEMENTATION_SUMMARY.md
deleted file mode 100644
index 401107e5..00000000
--- a/MIGRATION_IMPLEMENTATION_SUMMARY.md
+++ /dev/null
@@ -1,207 +0,0 @@
-# Frontend Migration Implementation Summary
-
-## What We've Accomplished ✅
-
-### 1. **Critical Analysis Completed**
-- Identified that current HTMX + Alpine.js implementation was missing **60-70%** of React frontend functionality
-- Documented specific gaps in authentication, search, state management, and UI components
-- Created detailed comparison between React and Django implementations
-
-### 2. **Enhanced Authentication System** 🎯
-**Problem**: Django only had basic page-based login forms
-**Solution**: Created sophisticated modal-based authentication system
-
-**Files Created/Modified:**
-- `backend/templates/components/auth/auth-modal.html` - Complete modal auth component
-- `backend/static/js/alpine-components.js` - Enhanced with `authModal()` Alpine component
-- `backend/templates/base/base.html` - Added global auth modal
-- `backend/templates/components/layout/enhanced_header.html` - Updated to use modal auth
-
-**Features Implemented:**
-- Modal-based login/register (matches React AuthDialog)
-- Social authentication integration (Google, Discord)
-- Form validation and error handling
-- Password visibility toggle
-- Smooth transitions and animations
-- Global accessibility via `window.authModal`
-
-### 3. **Advanced Toast Notification System** 🎯
-**Problem**: No toast notification system like React's Sonner
-**Solution**: Created comprehensive toast system with progress bars
-
-**Files Created:**
-- `backend/templates/components/ui/toast-container.html` - Toast UI component
-- Enhanced Alpine.js with global toast store and component
-
-**Features Implemented:**
-- Multiple toast types (success, error, warning, info)
-- Progress bar animations
-- Auto-dismiss with configurable duration
-- Smooth slide-in/out animations
-- Global store for app-wide access
-
-### 4. **Enhanced Alpine.js Architecture** 🎯
-**Problem**: Basic Alpine.js components without sophisticated state management
-**Solution**: Created comprehensive component library
-
-**Components Added:**
-- `authModal()` - Complete authentication flow
-- Enhanced `toast()` - Advanced notification system
-- Global stores for app state and toast management
-- Improved error handling and API integration
-
-### 5. **Improved Header Component** 🎯
-**Problem**: Header didn't match React frontend sophistication
-**Solution**: Enhanced header with modal integration
-
-**Features Added:**
-- Modal authentication buttons (instead of page redirects)
-- Proper Alpine.js integration
-- Maintained all existing functionality (browse menu, search, theme toggle)
-
-## Current State Assessment
-
-### ✅ **Completed Components**
-1. **Authentication System** - Modal-based auth matching React functionality
-2. **Toast Notifications** - Advanced toast system with animations
-3. **Theme Management** - Already working well
-4. **Header Navigation** - Enhanced with modal integration
-5. **Base Template Structure** - Solid foundation with global components
-
-### ⚠️ **Partially Complete**
-1. **Search Functionality** - Basic HTMX search exists, needs autocomplete enhancement
-2. **User Profile/Settings** - Basic pages exist, need React-level sophistication
-3. **Card Components** - Basic cards exist, need hover effects and advanced interactions
-
-### ❌ **Still Missing (High Priority)**
-1. **Advanced Search with Autocomplete** - React has sophisticated search with suggestions
-2. **Enhanced Park/Ride Cards** - Need hover effects, animations, better interactions
-3. **User Profile Management** - React has comprehensive profile editing
-4. **Settings Page** - React has advanced settings with multiple sections
-5. **Mobile Optimization** - Need touch-optimized interactions
-6. **Loading States** - Need skeleton loaders and proper loading indicators
-
-### ❌ **Still Missing (Medium Priority)**
-1. **Advanced Filtering UI** - React has complex filter interfaces
-2. **Image Galleries** - React has lightbox and advanced image handling
-3. **Data Tables** - React has sortable, filterable tables
-4. **Form Validation** - Need client-side validation matching React
-5. **Pagination Components** - Need enhanced pagination with proper state
-
-## Next Steps for Complete Migration
-
-### Phase 1: Critical Missing Components (1-2 weeks)
-
-#### 1. Enhanced Search with Autocomplete
-```javascript
-// Need to implement in Alpine.js
-Alpine.data('advancedSearch', () => ({
- query: '',
- suggestions: [],
- loading: false,
- showSuggestions: false,
- // Advanced search logic with debouncing, caching
-}))
-```
-
-#### 2. Enhanced Park/Ride Cards
-```html
-
-
-
-
-```
-
-#### 3. User Profile/Settings Pages
-- Create comprehensive profile editing interface
-- Add avatar upload with preview
-- Implement settings sections (privacy, notifications, etc.)
-
-### Phase 2: Advanced Features (2-3 weeks)
-
-#### 1. Advanced Filtering System
-- Multi-select filters
-- Range sliders
-- Date pickers
-- URL state synchronization
-
-#### 2. Enhanced Mobile Experience
-- Touch-optimized interactions
-- Swipe gestures
-- Mobile-specific navigation patterns
-
-#### 3. Loading States and Skeletons
-- Skeleton loading components
-- Proper loading indicators
-- Optimistic updates
-
-### Phase 3: Polish and Optimization (1 week)
-
-#### 1. Performance Optimization
-- Lazy loading
-- Image optimization
-- Request batching
-
-#### 2. Accessibility Improvements
-- ARIA labels
-- Keyboard navigation
-- Screen reader support
-
-#### 3. Testing and Documentation
-- Component testing
-- Integration testing
-- Comprehensive documentation
-
-## Technical Architecture
-
-### Current Stack
-- **Backend**: Django with HTMX middleware
-- **Frontend**: HTMX + Alpine.js + Tailwind CSS
-- **Components**: shadcn/ui-inspired design system
-- **State Management**: Alpine.js stores + component-level state
-- **Authentication**: Modal-based with social auth integration
-
-### Key Patterns Established
-1. **Global Component Access**: `window.authModal` pattern for cross-component communication
-2. **Store-based State**: Alpine.store() for global state management
-3. **HTMX + Alpine Integration**: Seamless server-client interaction
-4. **Component Templates**: Reusable Django template components
-5. **Progressive Enhancement**: Works without JavaScript, enhanced with it
-
-## Success Metrics
-
-### ✅ **Achieved**
-- Modal authentication system (100% React parity)
-- Toast notification system (100% React parity)
-- Theme management (100% React parity)
-- Base template architecture (solid foundation)
-
-### 🎯 **In Progress**
-- Search functionality (60% complete)
-- Card components (40% complete)
-- User management (30% complete)
-
-### ❌ **Not Started**
-- Advanced filtering (0% complete)
-- Mobile optimization (0% complete)
-- Loading states (0% complete)
-
-## Estimated Completion Time
-
-**Total Remaining Work**: 4-6 weeks
-- **Phase 1 (Critical)**: 1-2 weeks
-- **Phase 2 (Advanced)**: 2-3 weeks
-- **Phase 3 (Polish)**: 1 week
-
-## Conclusion
-
-We've successfully implemented the **most critical missing piece** - the authentication system - which was a major gap between the React and Django implementations. The foundation is now solid with:
-
-1. **Sophisticated modal authentication** matching React functionality
-2. **Advanced toast notification system** with animations and global state
-3. **Enhanced Alpine.js architecture** with proper component patterns
-4. **Solid template structure** for future component development
-
-The remaining work is primarily about **enhancing existing components** rather than building fundamental architecture. The hardest part (authentication and global state management) is complete.
-
-**Recommendation**: Continue with Phase 1 implementation focusing on search enhancement and card component improvements, as these will provide the most visible user experience improvements.
diff --git a/PERFORMANCE_OPTIMIZATION_DOCUMENTATION.md b/PERFORMANCE_OPTIMIZATION_DOCUMENTATION.md
deleted file mode 100644
index 9e3b8f4b..00000000
--- a/PERFORMANCE_OPTIMIZATION_DOCUMENTATION.md
+++ /dev/null
@@ -1,753 +0,0 @@
-# Park Listing Performance Optimization Documentation
-
-## Overview
-
-This document provides comprehensive documentation for the performance optimizations implemented for the ThrillWiki park listing page. The optimizations focus on query performance, database indexing, pagination efficiency, strategic caching, frontend performance, and load testing capabilities.
-
-## Table of Contents
-
-1. [Query Optimization Analysis](#query-optimization-analysis)
-2. [Database Indexing Strategy](#database-indexing-strategy)
-3. [Pagination Efficiency](#pagination-efficiency)
-4. [Caching Strategy](#caching-strategy)
-5. [Frontend Performance](#frontend-performance)
-6. [Load Testing & Benchmarking](#load-testing--benchmarking)
-7. [Deployment Recommendations](#deployment-recommendations)
-8. [Performance Monitoring](#performance-monitoring)
-9. [Maintenance Guidelines](#maintenance-guidelines)
-
-## Query Optimization Analysis
-
-### Issues Identified and Resolved
-
-#### 1. Critical Anti-Pattern Elimination
-**Problem**: The original `ParkListView.get_queryset()` used an expensive subquery pattern:
-```python
-# BEFORE - Expensive subquery anti-pattern
-final_queryset = queryset.filter(
- pk__in=filtered_queryset.values_list('pk', flat=True)
-)
-```
-
-**Solution**: Implemented direct filtering with optimized queryset building:
-```python
-# AFTER - Optimized direct filtering
-queryset = self.filter_service.get_optimized_filtered_queryset(filter_params)
-```
-
-#### 2. Optimized Select Related and Prefetch Related
-**Improvements**:
-- Consolidated duplicate select_related calls
-- Added strategic prefetch_related for related models
-- Implemented proper annotations for calculated fields
-
-```python
-queryset = (
- Park.objects
- .select_related("operator", "property_owner", "location", "banner_image", "card_image")
- .prefetch_related("photos", "rides__manufacturer", "areas")
- .annotate(
- current_ride_count=Count("rides", distinct=True),
- current_coaster_count=Count("rides", filter=Q(rides__category="RC"), distinct=True),
- )
-)
-```
-
-#### 3. Filter Service Aggregation Optimization
-**Problem**: Multiple separate COUNT queries causing N+1 issues
-```python
-# BEFORE - Multiple COUNT queries
-filter_counts = {
- "total_parks": base_queryset.count(),
- "operating_parks": base_queryset.filter(status="OPERATING").count(),
- "parks_with_coasters": base_queryset.filter(coaster_count__gt=0).count(),
- # ... more individual count queries
-}
-```
-
-**Solution**: Single aggregated query with conditional counting:
-```python
-# AFTER - Single optimized aggregate query
-aggregates = base_queryset.aggregate(
- total_parks=Count('id'),
- operating_parks=Count('id', filter=Q(status='OPERATING')),
- parks_with_coasters=Count('id', filter=Q(coaster_count__gt=0)),
- # ... all counts in one query
-)
-```
-
-#### 4. Autocomplete Query Optimization
-**Improvements**:
-- Eliminated separate queries for parks, operators, and locations
-- Implemented single optimized query using `search_text` field
-- Added proper caching with session storage
-
-### Performance Impact
-- **Query count reduction**: 70-85% reduction in database queries
-- **Response time improvement**: 60-80% faster page loads
-- **Memory usage optimization**: 40-50% reduction in memory consumption
-
-## Database Indexing Strategy
-
-### Implemented Indexes
-
-#### 1. Composite Indexes for Common Filter Combinations
-```sql
--- Status and operator filtering (most common combination)
-CREATE INDEX CONCURRENTLY idx_parks_status_operator ON parks_park(status, operator_id);
-
--- Park type and status filtering
-CREATE INDEX CONCURRENTLY idx_parks_park_type_status ON parks_park(park_type, status);
-
--- Opening year filtering with status
-CREATE INDEX CONCURRENTLY idx_parks_opening_year_status ON parks_park(opening_year, status)
-WHERE opening_year IS NOT NULL;
-```
-
-#### 2. Performance Indexes for Statistics
-```sql
--- Ride count and coaster count filtering
-CREATE INDEX CONCURRENTLY idx_parks_ride_count_coaster_count ON parks_park(ride_count, coaster_count)
-WHERE ride_count IS NOT NULL;
-
--- Rating-based filtering
-CREATE INDEX CONCURRENTLY idx_parks_average_rating_status ON parks_park(average_rating, status)
-WHERE average_rating IS NOT NULL;
-```
-
-#### 3. Text Search Optimization
-```sql
--- GIN index for full-text search using trigrams
-CREATE INDEX CONCURRENTLY idx_parks_search_text_gin ON parks_park
-USING gin(search_text gin_trgm_ops);
-
--- Company name search for operator filtering
-CREATE INDEX CONCURRENTLY idx_company_name_roles ON parks_company
-USING gin(name gin_trgm_ops, roles);
-```
-
-#### 4. Location-Based Indexes
-```sql
--- Country and city combination filtering
-CREATE INDEX CONCURRENTLY idx_parklocation_country_city ON parks_parklocation(country, city);
-
--- Spatial coordinates for map queries
-CREATE INDEX CONCURRENTLY idx_parklocation_coordinates ON parks_parklocation(latitude, longitude)
-WHERE latitude IS NOT NULL AND longitude IS NOT NULL;
-```
-
-### Migration Application
-```bash
-# Apply the performance indexes
-python manage.py migrate parks 0002_add_performance_indexes
-
-# Monitor index creation progress
-python manage.py dbshell -c "
-SELECT
- schemaname, tablename, attname, n_distinct, correlation
-FROM pg_stats
-WHERE tablename IN ('parks_park', 'parks_parklocation', 'parks_company')
-ORDER BY schemaname, tablename, attname;
-"
-```
-
-### Index Maintenance
-- **Monitoring**: Regular analysis of query performance
-- **Updates**: Quarterly review of index usage statistics
-- **Cleanup**: Annual removal of unused indexes
-
-## Pagination Efficiency
-
-### Optimized Paginator Implementation
-
-#### 1. COUNT Query Optimization
-```python
-class OptimizedPaginator(Paginator):
- def _get_optimized_count(self) -> int:
- """Use subquery approach for complex queries"""
- if self._is_complex_query(queryset):
- subquery = queryset.values('pk')
- return subquery.count()
- return queryset.count()
-```
-
-#### 2. Cursor-Based Pagination for Large Datasets
-```python
-class CursorPaginator:
- """More efficient than offset-based pagination for large page numbers"""
-
- def get_page(self, cursor: Optional[str] = None) -> Dict[str, Any]:
- if cursor:
- cursor_value = self._decode_cursor(cursor)
- queryset = queryset.filter(**{f"{self.field_name}__gt": cursor_value})
-
- items = list(queryset[:self.per_page + 1])
- has_next = len(items) > self.per_page
- # ... pagination logic
-```
-
-#### 3. Pagination Caching
-```python
-class PaginationCache:
- """Cache pagination metadata and results"""
-
- @classmethod
- def cache_page_results(cls, queryset_hash: str, page_num: int, page_data: Dict[str, Any]):
- cache_key = cls.get_page_cache_key(queryset_hash, page_num)
- cache.set(cache_key, page_data, cls.DEFAULT_TIMEOUT)
-```
-
-### Performance Benefits
-- **Large datasets**: 90%+ improvement for pages beyond page 100
-- **Complex filters**: 70% improvement with multiple filter combinations
-- **Memory usage**: 60% reduction in memory consumption
-
-## Caching Strategy
-
-### Comprehensive Caching Service
-
-#### 1. Strategic Cache Categories
-```python
-class CacheService:
- # Cache prefixes for different data types
- FILTER_COUNTS = "park_filter_counts" # 15 minutes
- AUTOCOMPLETE = "park_autocomplete" # 5 minutes
- SEARCH_RESULTS = "park_search" # 10 minutes
- CLOUDFLARE_IMAGES = "cf_images" # 1 hour
- PARK_STATS = "park_stats" # 30 minutes
- PAGINATED_RESULTS = "park_paginated" # 5 minutes
-```
-
-#### 2. Intelligent Cache Invalidation
-```python
-@classmethod
-def invalidate_related_caches(cls, model_name: str, instance_id: Optional[int] = None):
- invalidation_map = {
- 'park': [cls.FILTER_COUNTS, cls.SEARCH_RESULTS, cls.PARK_STATS, cls.AUTOCOMPLETE],
- 'company': [cls.FILTER_COUNTS, cls.AUTOCOMPLETE],
- 'parklocation': [cls.SEARCH_RESULTS, cls.FILTER_COUNTS],
- 'parkphoto': [cls.CLOUDFLARE_IMAGES],
- }
-```
-
-#### 3. CloudFlare Image Caching
-```python
-class CloudFlareImageCache:
- @classmethod
- def get_optimized_image_url(cls, image_id: str, variant: str = "public", width: Optional[int] = None):
- cached_url = CacheService.get_cached_cloudflare_image(image_id, f"{variant}_{width}")
- if cached_url:
- return cached_url
-
- # Generate and cache optimized URL
- url = f"{base_url}/{image_id}/w={width}" if width else f"{base_url}/{image_id}/{variant}"
- CacheService.cache_cloudflare_image(image_id, f"{variant}_{width}", url)
- return url
-```
-
-### Cache Performance Metrics
-- **Hit rate**: 85-95% for frequently accessed data
-- **Response time**: 80-90% improvement for cached requests
-- **Database load**: 70% reduction in database queries
-
-## Frontend Performance
-
-### JavaScript Optimizations
-
-#### 1. Lazy Loading with Intersection Observer
-```javascript
-setupLazyLoading() {
- this.imageObserver = new IntersectionObserver((entries) => {
- entries.forEach(entry => {
- if (entry.isIntersecting) {
- this.loadImage(entry.target);
- this.imageObserver.unobserve(entry.target);
- }
- });
- }, this.observerOptions);
-}
-```
-
-#### 2. Debounced Search with Caching
-```javascript
-setupDebouncedSearch() {
- searchInput.addEventListener('input', (e) => {
- clearTimeout(this.searchTimeout);
-
- this.searchTimeout = setTimeout(() => {
- this.performSearch(query);
- }, 300);
- });
-}
-
-async performSearch(query) {
- // Check session storage cache first
- const cached = sessionStorage.getItem(`search_${query.toLowerCase()}`);
- if (cached) {
- this.displaySuggestions(JSON.parse(cached));
- return;
- }
- // ... fetch and cache results
-}
-```
-
-#### 3. Progressive Image Loading
-```javascript
-setupProgressiveImageLoading() {
- document.querySelectorAll('img[data-cf-image]').forEach(img => {
- const imageId = img.dataset.cfImage;
- const width = img.dataset.width || 400;
-
- // Start with low quality
- img.src = this.getCloudFlareImageUrl(imageId, width, 'low');
-
- // Load high quality when in viewport
- if (this.imageObserver) {
- this.imageObserver.observe(img);
- }
- });
-}
-```
-
-### CSS Optimizations
-
-#### 1. GPU Acceleration
-```css
-.park-listing {
- transform: translateZ(0);
- backface-visibility: hidden;
-}
-
-.park-card {
- will-change: transform, box-shadow;
- transition: transform 0.2s ease, box-shadow 0.2s ease;
- transform: translateZ(0);
- contain: layout style paint;
-}
-```
-
-#### 2. Efficient Grid Layout
-```css
-.park-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
- gap: 1.5rem;
- contain: layout style;
-}
-```
-
-#### 3. Loading States
-```css
-img[data-src] {
- background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
- background-size: 200% 100%;
- animation: shimmer 1.5s infinite;
-}
-```
-
-### Performance Metrics
-- **First Contentful Paint**: 40-60% improvement
-- **Largest Contentful Paint**: 50-70% improvement
-- **Cumulative Layout Shift**: 80% reduction
-- **JavaScript bundle size**: 30% reduction
-
-## Load Testing & Benchmarking
-
-### Benchmarking Suite
-
-#### 1. Autocomplete Performance Testing
-```python
-def run_autocomplete_benchmark(self, queries: List[str] = None):
- queries = ['Di', 'Disney', 'Universal', 'Cedar Point', 'California', 'Roller', 'Xyz123']
-
- for query in queries:
- with self.monitor.measure_operation(f"autocomplete_{query}"):
- # Test autocomplete performance
- response = view.get(request)
-```
-
-#### 2. Listing Performance Testing
-```python
-def run_listing_benchmark(self, scenarios: List[Dict[str, Any]] = None):
- scenarios = [
- {'name': 'no_filters', 'params': {}},
- {'name': 'status_filter', 'params': {'status': 'OPERATING'}},
- {'name': 'complex_filter', 'params': {
- 'status': 'OPERATING', 'has_coasters': 'true', 'min_rating': '4.0'
- }},
- # ... more scenarios
- ]
-```
-
-#### 3. Pagination Performance Testing
-```python
-def run_pagination_benchmark(self, page_sizes=[10, 20, 50, 100], page_numbers=[1, 5, 10, 50]):
- for page_size in page_sizes:
- for page_number in page_numbers:
- with self.monitor.measure_operation(f"page_{page_number}_size_{page_size}"):
- page, metadata = get_optimized_page(queryset, page_number, page_size)
-```
-
-### Running Benchmarks
-```bash
-# Run complete benchmark suite
-python manage.py benchmark_performance
-
-# Run specific benchmarks
-python manage.py benchmark_performance --autocomplete-only
-python manage.py benchmark_performance --listing-only
-python manage.py benchmark_performance --pagination-only
-
-# Run multiple iterations for statistical analysis
-python manage.py benchmark_performance --iterations 10 --save
-```
-
-### Performance Baselines
-
-#### Before Optimization
-- **Average response time**: 2.5-4.0 seconds
-- **Database queries per request**: 15-25 queries
-- **Memory usage**: 150-200MB per request
-- **Cache hit rate**: 45-60%
-
-#### After Optimization
-- **Average response time**: 0.5-1.2 seconds
-- **Database queries per request**: 3-8 queries
-- **Memory usage**: 75-100MB per request
-- **Cache hit rate**: 85-95%
-
-## Deployment Recommendations
-
-### Production Environment Setup
-
-#### 1. Database Configuration
-```python
-# settings/production.py
-DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.postgresql',
- 'OPTIONS': {
- 'MAX_CONNS': 50,
- 'OPTIONS': {
- 'MAX_CONNS': 50,
- 'OPTIONS': {
- 'application_name': 'thrillwiki_production',
- 'default_transaction_isolation': 'read committed',
- }
- }
- }
- }
-}
-
-# Connection pooling
-DATABASES['default']['CONN_MAX_AGE'] = 600
-```
-
-#### 2. Cache Configuration
-```python
-# Redis configuration for production
-CACHES = {
- 'default': {
- 'BACKEND': 'django_redis.cache.RedisCache',
- 'LOCATION': 'redis://redis-cluster:6379/1',
- 'OPTIONS': {
- 'CLIENT_CLASS': 'django_redis.client.DefaultClient',
- 'CONNECTION_POOL_KWARGS': {
- 'max_connections': 50,
- 'retry_on_timeout': True,
- },
- 'COMPRESSOR': 'django_redis.compressors.zlib.ZlibCompressor',
- 'IGNORE_EXCEPTIONS': True,
- },
- 'TIMEOUT': 300,
- 'VERSION': 1,
- }
-}
-```
-
-#### 3. CDN and Static Files
-```python
-# CloudFlare Images configuration
-CLOUDFLARE_IMAGES_BASE_URL = 'https://imagedelivery.net/your-account-id'
-CLOUDFLARE_IMAGES_TOKEN = os.environ.get('CLOUDFLARE_IMAGES_TOKEN')
-
-# Static files optimization
-STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
-WHITENOISE_USE_FINDERS = True
-WHITENOISE_AUTOREFRESH = True
-```
-
-#### 4. Application Server Configuration
-```python
-# Gunicorn configuration (gunicorn.conf.py)
-bind = "0.0.0.0:8000"
-workers = 4
-worker_class = "gevent"
-worker_connections = 1000
-max_requests = 1000
-max_requests_jitter = 100
-preload_app = True
-keepalive = 5
-```
-
-### Monitoring and Alerting
-
-#### 1. Performance Monitoring
-```python
-# settings/monitoring.py
-LOGGING = {
- 'version': 1,
- 'handlers': {
- 'performance': {
- 'level': 'INFO',
- 'class': 'logging.handlers.RotatingFileHandler',
- 'filename': 'logs/performance.log',
- 'maxBytes': 10485760, # 10MB
- 'backupCount': 10,
- },
- },
- 'loggers': {
- 'query_optimization': {
- 'handlers': ['performance'],
- 'level': 'INFO',
- },
- 'pagination_service': {
- 'handlers': ['performance'],
- 'level': 'INFO',
- },
- },
-}
-```
-
-#### 2. Health Checks
-```python
-# Add to urls.py
-path('health/', include('health_check.urls')),
-
-# settings.py
-HEALTH_CHECK = {
- 'DISK_USAGE_MAX': 90, # percent
- 'MEMORY_MIN': 100, # in MB
-}
-```
-
-### Deployment Checklist
-
-#### Pre-Deployment
-- [ ] Run full benchmark suite and verify performance targets
-- [ ] Apply database migrations in maintenance window
-- [ ] Verify all indexes are created successfully
-- [ ] Test cache connectivity and performance
-- [ ] Run security audit on new code
-
-#### Post-Deployment
-- [ ] Monitor application performance metrics
-- [ ] Verify database query performance
-- [ ] Check cache hit rates and efficiency
-- [ ] Monitor error rates and response times
-- [ ] Validate user experience improvements
-
-## Performance Monitoring
-
-### Real-Time Monitoring
-
-#### 1. Application Performance
-```python
-# Custom middleware for performance tracking
-class PerformanceMonitoringMiddleware:
- def __init__(self, get_response):
- self.get_response = get_response
-
- def __call__(self, request):
- start_time = time.time()
- initial_queries = len(connection.queries)
-
- response = self.get_response(request)
-
- duration = time.time() - start_time
- query_count = len(connection.queries) - initial_queries
-
- # Log performance metrics
- logger.info(f"Request performance: {request.path} - {duration:.3f}s, {query_count} queries")
-
- return response
-```
-
-#### 2. Database Performance
-```sql
--- Monitor slow queries
-SELECT query, mean_time, calls, total_time
-FROM pg_stat_statements
-WHERE mean_time > 100
-ORDER BY mean_time DESC
-LIMIT 10;
-
--- Monitor index usage
-SELECT schemaname, tablename, attname, n_distinct, correlation
-FROM pg_stats
-WHERE tablename LIKE 'parks_%'
-ORDER BY correlation DESC;
-```
-
-#### 3. Cache Performance
-```python
-# Cache monitoring dashboard
-def get_cache_stats():
- if hasattr(cache, '_cache') and hasattr(cache._cache, 'info'):
- redis_info = cache._cache.info()
- return {
- 'used_memory': redis_info.get('used_memory_human'),
- 'hit_rate': redis_info.get('keyspace_hits') / (redis_info.get('keyspace_hits') + redis_info.get('keyspace_misses')) * 100,
- 'connected_clients': redis_info.get('connected_clients'),
- }
-```
-
-### Performance Alerts
-
-#### 1. Response Time Alerts
-```python
-# Alert thresholds
-PERFORMANCE_THRESHOLDS = {
- 'response_time_warning': 1.0, # 1 second
- 'response_time_critical': 3.0, # 3 seconds
- 'query_count_warning': 10, # 10 queries
- 'query_count_critical': 20, # 20 queries
- 'cache_hit_rate_warning': 80, # 80% hit rate
- 'cache_hit_rate_critical': 60, # 60% hit rate
-}
-```
-
-#### 2. Monitoring Integration
-```python
-# Integration with monitoring services
-def send_performance_alert(metric, value, threshold):
- if settings.SENTRY_DSN:
- sentry_sdk.capture_message(
- f"Performance alert: {metric} = {value} (threshold: {threshold})",
- level="warning"
- )
-
- if settings.SLACK_WEBHOOK_URL:
- slack_alert(f"🚨 Performance Alert: {metric} exceeded threshold")
-```
-
-## Maintenance Guidelines
-
-### Regular Maintenance Tasks
-
-#### Weekly Tasks
-- [ ] Review performance logs for anomalies
-- [ ] Check cache hit rates and adjust timeouts if needed
-- [ ] Monitor database query performance
-- [ ] Verify image loading performance
-
-#### Monthly Tasks
-- [ ] Run comprehensive benchmark suite
-- [ ] Analyze slow query logs and optimize
-- [ ] Review and update cache strategies
-- [ ] Check database index usage statistics
-- [ ] Update performance documentation
-
-#### Quarterly Tasks
-- [ ] Review and optimize database indexes
-- [ ] Audit and clean up unused cache keys
-- [ ] Update performance benchmarks and targets
-- [ ] Review and optimize CloudFlare Images usage
-- [ ] Conduct load testing with realistic traffic patterns
-
-### Performance Regression Prevention
-
-#### 1. Automated Testing
-```python
-# Performance regression tests
-class PerformanceRegressionTests(TestCase):
- def test_park_listing_performance(self):
- with track_queries("park_listing_test"):
- response = self.client.get('/parks/')
- self.assertEqual(response.status_code, 200)
-
- # Assert performance thresholds
- metrics = performance_monitor.metrics[-1]
- self.assertLess(metrics.duration, 1.0) # Max 1 second
- self.assertLess(metrics.query_count, 8) # Max 8 queries
-```
-
-#### 2. Code Review Guidelines
-- Review all new database queries for N+1 patterns
-- Ensure proper use of select_related and prefetch_related
-- Verify cache invalidation strategies for model changes
-- Check that new features use existing optimized services
-
-#### 3. Performance Budget
-```javascript
-// Performance budget enforcement
-const PERFORMANCE_BUDGET = {
- firstContentfulPaint: 1.5, // seconds
- largestContentfulPaint: 2.5, // seconds
- cumulativeLayoutShift: 0.1,
- totalJavaScriptSize: 500, // KB
- totalImageSize: 2000, // KB
-};
-```
-
-### Troubleshooting Common Issues
-
-#### 1. High Response Times
-```bash
-# Check database performance
-python manage.py dbshell -c "
-SELECT query, mean_time, calls
-FROM pg_stat_statements
-WHERE mean_time > 100
-ORDER BY mean_time DESC LIMIT 5;"
-
-# Check cache performance
-python manage.py shell -c "
-from apps.parks.services.cache_service import CacheService;
-print(CacheService.get_cache_stats())
-"
-```
-
-#### 2. Memory Usage Issues
-```bash
-# Monitor memory usage
-python manage.py benchmark_performance --iterations 1 | grep "Memory"
-
-# Check for memory leaks
-python -m memory_profiler manage.py runserver
-```
-
-#### 3. Cache Issues
-```bash
-# Clear specific cache prefixes
-python manage.py shell -c "
-from apps.parks.services.cache_service import CacheService;
-CacheService.invalidate_related_caches('park')
-"
-
-# Warm up caches after deployment
-python manage.py shell -c "
-from apps.parks.services.cache_service import CacheService;
-CacheService.warm_cache()
-"
-```
-
-## Conclusion
-
-The implemented performance optimizations provide significant improvements across all metrics:
-
-- **85% reduction** in database queries through optimized queryset building
-- **75% improvement** in response times through strategic caching
-- **90% better pagination** performance for large datasets
-- **Comprehensive monitoring** and benchmarking capabilities
-- **Production-ready** deployment recommendations
-
-These optimizations ensure the park listing page can scale effectively to handle larger datasets and increased user traffic while maintaining excellent user experience.
-
-For questions or issues related to these optimizations, refer to the troubleshooting section or contact the development team.
-
----
-
-**Last Updated**: September 23, 2025
-**Version**: 1.0.0
-**Author**: ThrillWiki Development Team
\ No newline at end of file
diff --git a/README_HYBRID_ENDPOINTS.md b/README_HYBRID_ENDPOINTS.md
deleted file mode 100644
index 758dfc9d..00000000
--- a/README_HYBRID_ENDPOINTS.md
+++ /dev/null
@@ -1,180 +0,0 @@
-# ThrillWiki Hybrid Filtering Endpoints Test Suite
-
-This repository contains a comprehensive test script for the newly synchronized Parks and Rides hybrid filtering endpoints.
-
-## Quick Start
-
-1. **Start the Django server:**
- ```bash
- cd backend && uv run manage.py runserver 8000
- ```
-
-2. **Run the test script:**
- ```bash
- ./test_hybrid_endpoints.sh
- ```
-
- Or with a custom base URL:
- ```bash
- ./test_hybrid_endpoints.sh http://localhost:8000
- ```
-
-## What Gets Tested
-
-### Parks Hybrid Filtering (`/api/v1/parks/hybrid/`)
-- ✅ Basic hybrid filtering (automatic strategy selection)
-- ✅ Search functionality (`?search=disney`)
-- ✅ Status filtering (`?status=OPERATING,CLOSED_TEMP`)
-- ✅ Geographic filtering (`?country=United%20States&state=Florida,California`)
-- ✅ Numeric range filtering (`?opening_year_min=1990&rating_min=4.0`)
-- ✅ Park statistics filtering (`?size_min=100&ride_count_min=10`)
-- ✅ Operator filtering (`?operator=disney,universal`)
-- ✅ Progressive loading (`?offset=50`)
-- ✅ Filter metadata (`/filter-metadata/`)
-- ✅ Scoped metadata (`/filter-metadata/?scoped=true&country=United%20States`)
-
-### Rides Hybrid Filtering (`/api/v1/rides/hybrid/`)
-- ✅ Basic hybrid filtering (automatic strategy selection)
-- ✅ Search functionality (`?search=coaster`)
-- ✅ Category filtering (`?category=RC,DR`)
-- ✅ Status and park filtering (`?status=OPERATING&park_slug=cedar-point`)
-- ✅ Manufacturer/designer filtering (`?manufacturer=bolliger-mabillard`)
-- ✅ Roller coaster specific filtering (`?roller_coaster_type=INVERTED&has_inversions=true`)
-- ✅ Performance filtering (`?height_ft_min=200&speed_mph_min=70`)
-- ✅ Quality metrics (`?rating_min=4.5&capacity_min=1000`)
-- ✅ Accessibility filtering (`?height_requirement_min=48&height_requirement_max=54`)
-- ✅ Progressive loading (`?offset=25&category=RC`)
-- ✅ Filter metadata (`/filter-metadata/`)
-- ✅ Scoped metadata (`/filter-metadata/?scoped=true&category=RC`)
-
-### Advanced Testing
-- ✅ Complex combination queries
-- ✅ Edge cases (empty results, invalid parameters)
-- ✅ Performance timing comparisons
-- ✅ Error handling validation
-
-## Key Features Demonstrated
-
-### 🔄 Automatic Strategy Selection
-- **≤200 records**: Client-side filtering (loads all data for frontend filtering)
-- **>200 records**: Server-side filtering (database filtering with pagination)
-
-### 📊 Progressive Loading
-- Initial load: 50 records
-- Progressive batches: 25 records
-- Seamless pagination for large datasets
-
-### 🔍 Comprehensive Filtering
-- **Parks**: 17+ filter parameters including geographic, temporal, and statistical filters
-- **Rides**: 17+ filter parameters including roller coaster specs, performance metrics, and accessibility
-
-### 📋 Dynamic Filter Metadata
-- Real-time filter options based on current data
-- Scoped metadata for contextual filtering
-- Ranges and categorical options automatically generated
-
-### ⚡ Performance Optimized
-- 5-minute intelligent caching
-- Strategic database indexing
-- Optimized queries with prefetch_related
-
-## Response Format
-
-Both endpoints return consistent response structures:
-
-```json
-{
- "parks": [...], // or "rides": [...]
- "total_count": 123,
- "strategy": "client_side", // or "server_side"
- "has_more": false,
- "next_offset": null,
- "filter_metadata": {
- "categorical": {
- "countries": ["United States", "Canada", ...],
- "categories": ["RC", "DR", "FR", ...],
- // ... more options
- },
- "ranges": {
- "opening_year": {"min": 1800, "max": 2025},
- "rating": {"min": 1.0, "max": 10.0},
- // ... more ranges
- }
- }
-}
-```
-
-## Dependencies
-
-- **curl**: Required for making HTTP requests
-- **jq**: Optional but recommended for pretty JSON formatting
-
-## Example Usage
-
-### Basic Parks Query
-```bash
-curl "http://localhost:8000/api/v1/parks/hybrid/"
-```
-
-### Search for Disney Parks
-```bash
-curl "http://localhost:8000/api/v1/parks/hybrid/?search=disney"
-```
-
-### Filter Roller Coasters with Inversions
-```bash
-curl "http://localhost:8000/api/v1/rides/hybrid/?category=RC&has_inversions=true&height_ft_min=100"
-```
-
-### Get Filter Metadata
-```bash
-curl "http://localhost:8000/api/v1/parks/hybrid/filter-metadata/"
-```
-
-## Integration Guide
-
-### Frontend Integration
-1. Use filter metadata to build dynamic filter interfaces
-2. Implement progressive loading for better UX
-3. Handle both client-side and server-side strategies
-4. Cache filter metadata to reduce API calls
-
-### Performance Considerations
-- Monitor response times and adjust thresholds as needed
-- Use progressive loading for datasets >200 records
-- Implement proper error handling for edge cases
-- Consider implementing request debouncing for search
-
-## Troubleshooting
-
-### Server Not Running
-```
-❌ Server not available at http://localhost:8000
-💡 Make sure to start the Django server first:
- cd backend && uv run manage.py runserver 8000
-```
-
-### Missing jq
-```
-⚠️ jq not found - JSON responses will not be pretty-printed
-```
-Install jq for better output formatting:
-```bash
-# macOS
-brew install jq
-
-# Ubuntu/Debian
-sudo apt-get install jq
-```
-
-## Next Steps
-
-1. **Integrate into Frontend**: Use these endpoints in your React/Next.js application
-2. **Build Filter UI**: Create dynamic filter interfaces using the metadata
-3. **Implement Progressive Loading**: Handle large datasets efficiently
-4. **Monitor Performance**: Track response times and optimize as needed
-5. **Add Caching**: Implement client-side caching for better UX
-
----
-
-🎢 **Happy filtering!** These endpoints provide a powerful, scalable foundation for building advanced search and filtering experiences in your theme park application.
diff --git a/TAILWIND_V4_MIGRATION.md b/TAILWIND_V4_MIGRATION.md
deleted file mode 100644
index fcfcfda1..00000000
--- a/TAILWIND_V4_MIGRATION.md
+++ /dev/null
@@ -1,326 +0,0 @@
-# Tailwind CSS v3 to v4 Migration Documentation
-
-## Overview
-
-This document details the complete migration process from Tailwind CSS v3 to v4 for the Django ThrillWiki project. The migration was performed on August 15, 2025, and includes all changes, configurations, and verification steps.
-
-## Migration Summary
-
-- **From**: Tailwind CSS v3.x
-- **To**: Tailwind CSS v4.1.12
-- **Project**: Django ThrillWiki (Django + Tailwind CSS integration)
-- **Status**: ✅ Complete and Verified
-- **Breaking Changes**: None (all styling preserved)
-
-## Key Changes in Tailwind CSS v4
-
-### 1. CSS Import Syntax
-- **v3**: Used `@tailwind` directives
-- **v4**: Uses single `@import "tailwindcss"` statement
-
-### 2. Theme Configuration
-- **v3**: Configuration in `tailwind.config.js`
-- **v4**: CSS-first approach with `@theme` blocks
-
-### 3. Deprecated Utilities
-Multiple utility classes were renamed or deprecated in v4.
-
-## Migration Steps Performed
-
-### Step 1: Update Main CSS File
-
-**File**: `static/css/src/input.css`
-
-**Before (v3)**:
-```css
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-/* Custom styles... */
-```
-
-**After (v4)**:
-```css
-@import "tailwindcss";
-
-@theme {
- --color-primary: #4f46e5;
- --color-secondary: #e11d48;
- --color-accent: #8b5cf6;
- --font-family-sans: Poppins, sans-serif;
-}
-
-/* Custom styles... */
-```
-
-### Step 2: Theme Variable Migration
-
-Migrated custom colors and fonts from `tailwind.config.js` to CSS variables in `@theme` block:
-
-| Variable | Value | Description |
-|----------|-------|-------------|
-| `--color-primary` | `#4f46e5` | Indigo-600 (primary brand color) |
-| `--color-secondary` | `#e11d48` | Rose-600 (secondary brand color) |
-| `--color-accent` | `#8b5cf6` | Violet-500 (accent color) |
-| `--font-family-sans` | `Poppins, sans-serif` | Primary font family |
-
-### Step 3: Deprecated Utility Updates
-
-#### Outline Utilities
-- **Changed**: `outline-none` → `outline-hidden`
-- **Files affected**: All template files, component CSS
-
-#### Ring Utilities
-- **Changed**: `ring` → `ring-3`
-- **Reason**: Default ring width now requires explicit specification
-
-#### Shadow Utilities
-- **Changed**:
- - `shadow-sm` → `shadow-xs`
- - `shadow` → `shadow-sm`
-- **Files affected**: Button components, card components
-
-#### Opacity Utilities
-- **Changed**: `bg-opacity-*` format → `color/opacity` format
-- **Example**: `bg-blue-500 bg-opacity-50` → `bg-blue-500/50`
-
-#### Flex Utilities
-- **Changed**: `flex-shrink-0` → `shrink-0`
-
-#### Important Modifier
-- **Changed**: `!important` → `!` (shorter syntax)
-- **Example**: `!outline-none` → `!outline-hidden`
-
-### Step 4: Template File Updates
-
-Updated the following template files with new utility classes:
-
-#### Core Templates
-- `templates/base.html`
-- `templates/components/navbar.html`
-- `templates/components/footer.html`
-
-#### Page Templates
-- `templates/parks/park_list.html`
-- `templates/parks/park_detail.html`
-- `templates/rides/ride_list.html`
-- `templates/rides/ride_detail.html`
-- `templates/companies/company_list.html`
-- `templates/companies/company_detail.html`
-
-#### Form Templates
-- `templates/parks/park_form.html`
-- `templates/rides/ride_form.html`
-- `templates/companies/company_form.html`
-
-#### Component Templates
-- `templates/components/search_results.html`
-- `templates/components/pagination.html`
-
-### Step 5: Component CSS Updates
-
-Updated custom component classes in `static/css/src/input.css`:
-
-**Button Components**:
-```css
-.btn-primary {
- @apply inline-flex items-center px-6 py-2.5 border border-transparent rounded-full shadow-md text-sm font-medium text-white bg-gradient-to-r from-primary to-secondary hover:from-primary/90 hover:to-secondary/90 focus:outline-hidden focus:ring-3 focus:ring-offset-2 focus:ring-primary/50 transform hover:scale-105 transition-all;
-}
-
-.btn-secondary {
- @apply inline-flex items-center px-6 py-2.5 border border-gray-200 dark:border-gray-700 rounded-full shadow-md text-sm font-medium text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-hidden focus:ring-3 focus:ring-offset-2 focus:ring-primary/50 transform hover:scale-105 transition-all;
-}
-```
-
-## Configuration Files
-
-### Tailwind Config (Preserved for Reference)
-
-**File**: `tailwind.config.js`
-
-The original v3 configuration was preserved for reference but is no longer the primary configuration method:
-
-```javascript
-module.exports = {
- content: [
- './templates/**/*.html',
- './static/js/**/*.js',
- './*/templates/**/*.html',
- ],
- darkMode: 'class',
- theme: {
- extend: {
- colors: {
- primary: '#4f46e5',
- secondary: '#e11d48',
- accent: '#8b5cf6',
- },
- fontFamily: {
- sans: ['Poppins', 'sans-serif'],
- },
- },
- },
- plugins: [
- require('@tailwindcss/forms'),
- require('@tailwindcss/typography'),
- ],
-}
-```
-
-### Package.json Updates
-
-No changes required to `package.json` as the Django-Tailwind package handles version management.
-
-## Verification Steps
-
-### 1. Build Process Verification
-```bash
-# Clean and rebuild CSS
-lsof -ti :8000 | xargs kill -9
-find . -type d -name "__pycache__" -exec rm -r {} +
-uv run manage.py tailwind runserver
-```
-
-**Result**: ✅ Build successful, no errors
-
-### 2. CSS Compilation Check
-```bash
-# Check compiled CSS size and content
-ls -la static/css/tailwind.css
-head -50 static/css/tailwind.css | grep -E "(primary|secondary|accent)"
-```
-
-**Result**: ✅ CSS properly compiled with theme variables
-
-### 3. Server Response Check
-```bash
-curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/
-```
-
-**Result**: ✅ HTTP 200 - Server responding correctly
-
-### 4. Visual Verification
-- ✅ Primary colors (indigo) displaying correctly
-- ✅ Secondary colors (rose) displaying correctly
-- ✅ Accent colors (violet) displaying correctly
-- ✅ Poppins font family loading correctly
-- ✅ Button styling and interactions working
-- ✅ Dark mode functionality preserved
-- ✅ Responsive design intact
-- ✅ All animations and transitions working
-
-## Files Modified
-
-### CSS Files
-- `static/css/src/input.css` - ✅ Major updates (import syntax, theme variables, component classes)
-
-### Template Files (Updated utility classes)
-- `templates/base.html`
-- `templates/components/navbar.html`
-- `templates/components/footer.html`
-- `templates/parks/park_list.html`
-- `templates/parks/park_detail.html`
-- `templates/parks/park_form.html`
-- `templates/rides/ride_list.html`
-- `templates/rides/ride_detail.html`
-- `templates/rides/ride_form.html`
-- `templates/companies/company_list.html`
-- `templates/companies/company_detail.html`
-- `templates/companies/company_form.html`
-- `templates/components/search_results.html`
-- `templates/components/pagination.html`
-
-### Configuration Files (Preserved)
-- `tailwind.config.js` - ✅ Preserved for reference
-
-## Benefits of v4 Migration
-
-### Performance Improvements
-- Smaller CSS bundle size
-- Faster compilation times
-- Improved CSS-in-JS performance
-
-### Developer Experience
-- CSS-first configuration approach
-- Better IDE support for theme variables
-- Simplified import syntax
-
-### Future Compatibility
-- Modern CSS features support
-- Better container queries support
-- Enhanced dark mode capabilities
-
-## Troubleshooting Guide
-
-### Common Issues and Solutions
-
-#### Issue: "Cannot apply unknown utility class"
-**Solution**: Check if utility was renamed in v4 migration table above
-
-#### Issue: Custom colors not working
-**Solution**: Ensure `@theme` block is properly defined with CSS variables
-
-#### Issue: Build errors
-**Solution**: Run clean build process:
-```bash
-lsof -ti :8000 | xargs kill -9
-find . -type d -name "__pycache__" -exec rm -r {} +
-uv run manage.py tailwind runserver
-```
-
-## Rollback Plan
-
-If rollback is needed:
-
-1. **Restore CSS Import Syntax**:
-```css
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-```
-
-2. **Remove @theme Block**: Delete the `@theme` section from input.css
-
-3. **Revert Utility Classes**: Use search/replace to revert utility class changes
-
-4. **Downgrade Tailwind**: Update package to v3.x version
-
-## Post-Migration Checklist
-
-- [x] CSS compilation working
-- [x] Development server running
-- [x] All pages loading correctly
-- [x] Colors displaying properly
-- [x] Fonts loading correctly
-- [x] Interactive elements working
-- [x] Dark mode functioning
-- [x] Responsive design intact
-- [x] No console errors
-- [x] Performance acceptable
-
-## Future Considerations
-
-### New v4 Features to Explore
-- Enhanced container queries
-- Improved dark mode utilities
-- New color-mix() support
-- Advanced CSS nesting
-
-### Maintenance Notes
-- Monitor for v4 updates and new features
-- Consider migrating more configuration to CSS variables
-- Evaluate new utility classes as they're released
-
-## Contact and Support
-
-For questions about this migration:
-- Review this documentation
-- Check Tailwind CSS v4 official documentation
-- Consult the preserved `tailwind.config.js` for original settings
-
----
-
-**Migration Completed**: August 15, 2025
-**Tailwind Version**: v4.1.12
-**Status**: Production Ready ✅
\ No newline at end of file
diff --git a/TAILWIND_V4_QUICK_REFERENCE.md b/TAILWIND_V4_QUICK_REFERENCE.md
deleted file mode 100644
index 8715a764..00000000
--- a/TAILWIND_V4_QUICK_REFERENCE.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Tailwind CSS v4 Quick Reference Guide
-
-## Common v3 → v4 Utility Migrations
-
-| v3 Utility | v4 Utility | Notes |
-|------------|------------|-------|
-| `outline-none` | `outline-hidden` | Accessibility improvement |
-| `ring` | `ring-3` | Must specify ring width |
-| `shadow-sm` | `shadow-xs` | Renamed for consistency |
-| `shadow` | `shadow-sm` | Renamed for consistency |
-| `flex-shrink-0` | `shrink-0` | Shortened syntax |
-| `bg-blue-500 bg-opacity-50` | `bg-blue-500/50` | New opacity syntax |
-| `text-gray-700 text-opacity-75` | `text-gray-700/75` | New opacity syntax |
-| `!outline-none` | `!outline-hidden` | Updated important syntax |
-
-## Theme Variables (Available in CSS)
-
-```css
-/* Colors */
-var(--color-primary) /* #4f46e5 - Indigo-600 */
-var(--color-secondary) /* #e11d48 - Rose-600 */
-var(--color-accent) /* #8b5cf6 - Violet-500 */
-
-/* Fonts */
-var(--font-family-sans) /* Poppins, sans-serif */
-```
-
-## Usage in Templates
-
-### Before (v3)
-```html
-
-```
-
-### After (v4)
-```html
-
-```
-
-## Development Commands
-
-### Start Development Server
-```bash
-lsof -ti :8000 | xargs kill -9; find . -type d -name "__pycache__" -exec rm -r {} +; uv run manage.py tailwind runserver
-```
-
-### Force CSS Rebuild
-```bash
-uv run manage.py tailwind build
-```
-
-## New v4 Features
-
-- **CSS-first configuration** via `@theme` blocks
-- **Improved opacity syntax** with `/` operator
-- **Better color-mix() support**
-- **Enhanced dark mode utilities**
-- **Faster compilation**
-
-## Troubleshooting
-
-### Unknown utility class error
-1. Check if utility was renamed (see table above)
-2. Verify custom theme variables are defined
-3. Run clean build process
-
-### Colors not working
-1. Ensure `@theme` block exists in `static/css/src/input.css`
-2. Check CSS variable names match usage
-3. Verify CSS compilation completed
-
-## Resources
-
-- [Full Migration Documentation](./TAILWIND_V4_MIGRATION.md)
-- [Tailwind CSS v4 Official Docs](https://tailwindcss.com/docs)
-- [Django-Tailwind Package](https://django-tailwind.readthedocs.io/)
\ No newline at end of file
diff --git a/THRILLWIKI_API_DOCUMENTATION.md b/THRILLWIKI_API_DOCUMENTATION.md
deleted file mode 100644
index 9b6d5dbf..00000000
--- a/THRILLWIKI_API_DOCUMENTATION.md
+++ /dev/null
@@ -1,470 +0,0 @@
-# ThrillWiki API Documentation v1
-## Complete Frontend Developer Reference
-
-**Base URL**: `/api/v1/`
-**Authentication**: JWT Bearer tokens
-**Content-Type**: `application/json`
-
----
-
-## 🔐 Authentication Endpoints (`/api/v1/auth/`)
-
-### Core Authentication
-- **POST** `/auth/login/` - User login with username/email and password
-- **POST** `/auth/signup/` - User registration (email verification required)
-- **POST** `/auth/logout/` - Logout current user (blacklist refresh token)
-- **GET** `/auth/user/` - Get current authenticated user information
-- **POST** `/auth/status/` - Check authentication status
-
-### Password Management
-- **POST** `/auth/password/reset/` - Request password reset email
-- **POST** `/auth/password/change/` - Change current user's password
-
-### Email Verification
-- **GET** `/auth/verify-email//` - Verify email with token
-- **POST** `/auth/resend-verification/` - Resend email verification
-
-### Social Authentication
-- **GET** `/auth/social/providers/` - Get available social auth providers
-- **GET** `/auth/social/providers/available/` - Get available social providers list
-- **GET** `/auth/social/connected/` - Get user's connected social providers
-- **POST** `/auth/social/connect//` - Connect social provider (Google, Discord)
-- **POST** `/auth/social/disconnect//` - Disconnect social provider
-- **GET** `/auth/social/status/` - Get comprehensive social auth status
-- **POST** `/auth/social/` - Social auth endpoints (dj-rest-auth)
-
-### JWT Token Management
-- **POST** `/auth/token/refresh/` - Refresh JWT access token
-
----
-
-## 🏞️ Parks API Endpoints (`/api/v1/parks/`)
-
-### Core CRUD Operations
-- **GET** `/parks/` - List parks with comprehensive filtering and pagination
-- **POST** `/parks/` - Create new park (authenticated users)
-- **GET** `/parks//` - Get park details (supports ID or slug)
-- **PATCH** `/parks//` - Update park (partial update)
-- **PUT** `/parks//` - Update park (full update)
-- **DELETE** `/parks//` - Delete park
-
-### Filtering & Search
-- **GET** `/parks/filter-options/` - Get available filter options
-- **GET** `/parks/search/companies/?q=` - Search companies/operators
-- **GET** `/parks/search-suggestions/?q=` - Get park search suggestions
-- **GET** `/parks/hybrid/` - Hybrid park filtering with advanced options
-- **GET** `/parks/hybrid/filter-metadata/` - Get filter metadata for hybrid filtering
-
-### Park Photos Management
-- **GET** `/parks//photos/` - List park photos
-- **POST** `/parks//photos/` - Upload park photo
-- **GET** `/parks//photos//` - Get park photo details
-- **PATCH** `/parks//photos//` - Update park photo
-- **DELETE** `/parks//photos//` - Delete park photo
-- **POST** `/parks//photos//set_primary/` - Set photo as primary
-- **POST** `/parks//photos/bulk_approve/` - Bulk approve/reject photos (admin)
-- **GET** `/parks//photos/stats/` - Get park photo statistics
-
-### Park Settings
-- **GET** `/parks//image-settings/` - Get park image settings
-- **POST** `/parks//image-settings/` - Update park image settings
-
-#### Park Filtering Parameters (24 total):
-- **Pagination**: `page`, `page_size`
-- **Search**: `search`
-- **Location**: `continent`, `country`, `state`, `city`
-- **Attributes**: `park_type`, `status`
-- **Companies**: `operator_id`, `operator_slug`, `property_owner_id`, `property_owner_slug`
-- **Ratings**: `min_rating`, `max_rating`
-- **Ride Counts**: `min_ride_count`, `max_ride_count`
-- **Opening Year**: `opening_year`, `min_opening_year`, `max_opening_year`
-- **Roller Coasters**: `has_roller_coasters`, `min_roller_coaster_count`, `max_roller_coaster_count`
-- **Ordering**: `ordering`
-
----
-
-## 🎢 Rides API Endpoints (`/api/v1/rides/`)
-
-### Core CRUD Operations
-- **GET** `/rides/` - List rides with comprehensive filtering
-- **POST** `/rides/` - Create new ride
-- **GET** `/rides//` - Get ride details
-- **PATCH** `/rides//` - Update ride (partial)
-- **PUT** `/rides//` - Update ride (full)
-- **DELETE** `/rides//` - Delete ride
-
-### Filtering & Search
-- **GET** `/rides/filter-options/` - Get available filter options
-- **GET** `/rides/search/companies/?q=` - Search ride companies
-- **GET** `/rides/search/ride-models/?q=` - Search ride models
-- **GET** `/rides/search-suggestions/?q=` - Get ride search suggestions
-- **GET** `/rides/hybrid/` - Hybrid ride filtering
-- **GET** `/rides/hybrid/filter-metadata/` - Get ride filter metadata
-
-### Ride Photos Management
-- **GET** `/rides//photos/` - List ride photos
-- **POST** `/rides//photos/` - Upload ride photo
-- **GET** `/rides//photos//` - Get ride photo details
-- **PATCH** `/rides//photos//` - Update ride photo
-- **DELETE** `/rides//photos//` - Delete ride photo
-- **POST** `/rides//photos//set_primary/` - Set photo as primary
-
-### Ride Manufacturers
-- **GET** `/rides/manufacturers//` - Manufacturer-specific endpoints
-
-### Ride Settings
-- **GET** `/rides//image-settings/` - Get ride image settings
-- **POST** `/rides//image-settings/` - Update ride image settings
-
----
-
-## 👤 User Accounts API (`/api/v1/accounts/`)
-
-### User Management (Admin)
-- **DELETE** `/accounts/users//delete/` - Delete user while preserving submissions
-- **GET** `/accounts/users//deletion-check/` - Check user deletion eligibility
-
-### Self-Service Account Management
-- **POST** `/accounts/delete-account/request/` - Request account deletion
-- **POST** `/accounts/delete-account/verify/` - Verify account deletion
-- **POST** `/accounts/delete-account/cancel/` - Cancel account deletion
-
-### User Profile Management
-- **GET** `/accounts/profile/` - Get user profile
-- **PATCH** `/accounts/profile/account/` - Update user account info
-- **PATCH** `/accounts/profile/update/` - Update user profile
-
-### User Preferences
-- **GET** `/accounts/preferences/` - Get user preferences
-- **PATCH** `/accounts/preferences/update/` - Update user preferences
-- **PATCH** `/accounts/preferences/theme/` - Update theme preference
-
-### Settings Management
-- **GET** `/accounts/settings/notifications/` - Get notification settings
-- **PATCH** `/accounts/settings/notifications/update/` - Update notification settings
-- **GET** `/accounts/settings/privacy/` - Get privacy settings
-- **PATCH** `/accounts/settings/privacy/update/` - Update privacy settings
-- **GET** `/accounts/settings/security/` - Get security settings
-- **PATCH** `/accounts/settings/security/update/` - Update security settings
-
-### User Statistics & Lists
-- **GET** `/accounts/statistics/` - Get user statistics
-- **GET** `/accounts/top-lists/` - Get user's top lists
-- **POST** `/accounts/top-lists/create/` - Create new top list
-- **PATCH** `/accounts/top-lists//` - Update top list
-- **DELETE** `/accounts/top-lists//delete/` - Delete top list
-
-### Notifications
-- **GET** `/accounts/notifications/` - Get user notifications
-- **POST** `/accounts/notifications/mark-read/` - Mark notifications as read
-- **GET** `/accounts/notification-preferences/` - Get notification preferences
-- **PATCH** `/accounts/notification-preferences/update/` - Update notification preferences
-
-### Avatar Management
-- **POST** `/accounts/profile/avatar/upload/` - Upload avatar
-- **POST** `/accounts/profile/avatar/save/` - Save avatar image
-- **DELETE** `/accounts/profile/avatar/delete/` - Delete avatar
-
----
-
-## 🗺️ Maps API (`/api/v1/maps/`)
-
-### Location Data
-- **GET** `/maps/locations/` - Get map locations data
-- **GET** `/maps/locations///` - Get location details
-- **GET** `/maps/search/` - Search locations on map
-- **GET** `/maps/bounds/` - Query locations within bounds
-
-### Map Services
-- **GET** `/maps/stats/` - Get map service statistics
-- **GET** `/maps/cache/` - Get map cache information
-- **POST** `/maps/cache/invalidate/` - Invalidate map cache
-
----
-
-## 🔍 Core Search API (`/api/v1/core/`)
-
-### Entity Search
-- **GET** `/core/entities/search/` - Fuzzy search for entities
-- **GET** `/core/entities/not-found/` - Handle entity not found
-- **GET** `/core/entities/suggestions/` - Quick entity suggestions
-
----
-
-## 📧 Email API (`/api/v1/email/`)
-
-### Email Services
-- **POST** `/email/send/` - Send email
-
----
-
-## 📜 History API (`/api/v1/history/`)
-
-### Park History
-- **GET** `/history/parks//` - Get park history
-- **GET** `/history/parks//detail/` - Get detailed park history
-
-### Ride History
-- **GET** `/history/parks//rides//` - Get ride history
-- **GET** `/history/parks//rides//detail/` - Get detailed ride history
-
-### Unified Timeline
-- **GET** `/history/timeline/` - Get unified history timeline
-
----
-
-## 📈 System & Analytics APIs
-
-### Health Checks
-- **GET** `/api/v1/health/` - Comprehensive health check
-- **GET** `/api/v1/health/simple/` - Simple health check
-- **GET** `/api/v1/health/performance/` - Performance metrics
-
-### Trending & Discovery
-- **GET** `/api/v1/trending/` - Get trending content
-- **GET** `/api/v1/new-content/` - Get new content
-- **POST** `/api/v1/trending/calculate/` - Trigger trending calculation
-
-### Statistics
-- **GET** `/api/v1/stats/` - Get system statistics
-- **POST** `/api/v1/stats/recalculate/` - Recalculate statistics
-
-### Reviews
-- **GET** `/api/v1/reviews/latest/` - Get latest reviews
-
-### Rankings
-- **GET** `/api/v1/rankings/` - Get ride rankings with filtering
-- **GET** `/api/v1/rankings//` - Get detailed ranking for specific ride
-- **GET** `/api/v1/rankings//history/` - Get ranking history for ride
-- **GET** `/api/v1/rankings//comparisons/` - Get head-to-head comparisons
-- **GET** `/api/v1/rankings/statistics/` - Get ranking system statistics
-- **POST** `/api/v1/rankings/calculate/` - Trigger ranking calculation (admin)
-
-#### Rankings Filtering Parameters:
-- **category**: Filter by ride category (RC, DR, FR, WR, TR, OT)
-- **min_riders**: Minimum number of mutual riders required
-- **park**: Filter by park slug
-- **ordering**: Order results (rank, -rank, winning_percentage, -winning_percentage)
-
----
-
-## 🛡️ Moderation API (`/api/v1/moderation/`)
-
-### Moderation Reports
-- **GET** `/moderation/reports/` - List all moderation reports
-- **POST** `/moderation/reports/` - Create new moderation report
-- **GET** `/moderation/reports//` - Get specific report details
-- **PUT** `/moderation/reports//` - Update moderation report
-- **PATCH** `/moderation/reports//` - Partial update report
-- **DELETE** `/moderation/reports//` - Delete moderation report
-- **POST** `/moderation/reports//assign/` - Assign report to moderator
-- **POST** `/moderation/reports//resolve/` - Resolve moderation report
-- **GET** `/moderation/reports/stats/` - Get report statistics
-
-### Moderation Queue
-- **GET** `/moderation/queue/` - List moderation queue items
-- **POST** `/moderation/queue/` - Create queue item
-- **GET** `/moderation/queue//` - Get specific queue item
-- **PUT** `/moderation/queue//` - Update queue item
-- **PATCH** `/moderation/queue//` - Partial update queue item
-- **DELETE** `/moderation/queue//` - Delete queue item
-- **POST** `/moderation/queue//assign/` - Assign queue item to moderator
-- **POST** `/moderation/queue//unassign/` - Unassign queue item
-- **POST** `/moderation/queue//complete/` - Complete queue item
-- **GET** `/moderation/queue/my_queue/` - Get current user's queue items
-
-### Moderation Actions
-- **GET** `/moderation/actions/` - List all moderation actions
-- **POST** `/moderation/actions/` - Create new moderation action
-- **GET** `/moderation/actions//` - Get specific action details
-- **PUT** `/moderation/actions//` - Update moderation action
-- **PATCH** `/moderation/actions//` - Partial update action
-- **DELETE** `/moderation/actions//` - Delete moderation action
-- **POST** `/moderation/actions//deactivate/` - Deactivate action
-- **GET** `/moderation/actions/active/` - Get active moderation actions
-- **GET** `/moderation/actions/expired/` - Get expired moderation actions
-
-### Bulk Operations
-- **GET** `/moderation/bulk-operations/` - List bulk moderation operations
-- **POST** `/moderation/bulk-operations/` - Create bulk operation
-- **GET** `/moderation/bulk-operations//` - Get bulk operation details
-- **PUT** `/moderation/bulk-operations//` - Update bulk operation
-- **PATCH** `/moderation/bulk-operations//` - Partial update operation
-- **DELETE** `/moderation/bulk-operations//` - Delete bulk operation
-- **POST** `/moderation/bulk-operations//cancel/` - Cancel bulk operation
-- **POST** `/moderation/bulk-operations//retry/` - Retry failed operation
-- **GET** `/moderation/bulk-operations//logs/` - Get operation logs
-- **GET** `/moderation/bulk-operations/running/` - Get running operations
-
-### User Moderation
-- **GET** `/moderation/users//` - Get user moderation profile
-- **POST** `/moderation/users//moderate/` - Take moderation action against user
-- **GET** `/moderation/users/search/` - Search users for moderation
-- **GET** `/moderation/users/stats/` - Get user moderation statistics
-
----
-
-## 🏗️ Ride Manufacturers & Models (`/api/v1/rides/manufacturers//`)
-
-### Ride Models
-- **GET** `/rides/manufacturers//` - List ride models by manufacturer
-- **POST** `/rides/manufacturers//` - Create new ride model
-- **GET** `/rides/manufacturers///` - Get ride model details
-- **PATCH** `/rides/manufacturers///` - Update ride model
-- **DELETE** `/rides/manufacturers///` - Delete ride model
-
-### Model Search & Filtering
-- **GET** `/rides/manufacturers//search/` - Search ride models
-- **GET** `/rides/manufacturers//filter-options/` - Get filter options
-- **GET** `/rides/manufacturers//stats/` - Get manufacturer statistics
-
-### Model Variants
-- **GET** `/rides/manufacturers///variants/` - List model variants
-- **POST** `/rides/manufacturers///variants/` - Create variant
-- **GET** `/rides/manufacturers///variants//` - Get variant details
-- **PATCH** `/rides/manufacturers///variants//` - Update variant
-- **DELETE** `/rides/manufacturers///variants//` - Delete variant
-
-### Technical Specifications
-- **GET** `/rides/manufacturers///technical-specs/` - List technical specs
-- **POST** `/rides/manufacturers///technical-specs/` - Create technical spec
-- **GET** `/rides/manufacturers///technical-specs//` - Get spec details
-- **PATCH** `/rides/manufacturers///technical-specs//` - Update spec
-- **DELETE** `/rides/manufacturers///technical-specs//` - Delete spec
-
-### Model Photos
-- **GET** `/rides/manufacturers///photos/` - List model photos
-- **POST** `/rides/manufacturers///photos/` - Upload model photo
-- **GET** `/rides/manufacturers///photos//` - Get photo details
-- **PATCH** `/rides/manufacturers///photos//` - Update photo
-- **DELETE** `/rides/manufacturers///photos//` - Delete photo
-
----
-
-## 🖼️ Media Management
-
-### Cloudflare Images
-- **ALL** `/api/v1/cloudflare-images/` - Cloudflare Images toolkit endpoints
-
----
-
-## 📚 API Documentation
-
-### Interactive Documentation
-- **GET** `/api/schema/` - OpenAPI schema
-- **GET** `/api/docs/` - Swagger UI documentation
-- **GET** `/api/redoc/` - ReDoc documentation
-
----
-
-## 🔧 Common Request/Response Patterns
-
-### Authentication Headers
-```javascript
-headers: {
- 'Authorization': 'Bearer ',
- 'Content-Type': 'application/json'
-}
-```
-
-### Pagination Response
-```json
-{
- "count": 100,
- "next": "http://api.example.com/api/v1/endpoint/?page=2",
- "previous": null,
- "results": [...]
-}
-```
-
-### Error Response Format
-```json
-{
- "error": "Error message",
- "error_code": "SPECIFIC_ERROR_CODE",
- "details": {...},
- "suggestions": ["suggestion1", "suggestion2"]
-}
-```
-
-### Success Response Format
-```json
-{
- "success": true,
- "message": "Operation completed successfully",
- "data": {...}
-}
-```
-
----
-
-## 📝 Key Data Models
-
-### User
-- `id`, `username`, `email`, `display_name`, `date_joined`, `is_active`, `avatar_url`
-
-### Park
-- `id`, `name`, `slug`, `description`, `location`, `operator`, `park_type`, `status`, `opening_year`
-
-### Ride
-- `id`, `name`, `slug`, `park`, `category`, `manufacturer`, `model`, `opening_year`, `status`
-
-### Photo (Park/Ride)
-- `id`, `image`, `caption`, `photo_type`, `uploaded_by`, `is_primary`, `is_approved`, `created_at`
-
-### Review
-- `id`, `user`, `content_object`, `rating`, `title`, `content`, `created_at`, `updated_at`
-
----
-
-## 🚨 Important Notes
-
-1. **Authentication Required**: Most endpoints require JWT authentication
-2. **Permissions**: Admin endpoints require staff/superuser privileges
-3. **Rate Limiting**: May be implemented on certain endpoints
-4. **File Uploads**: Use `multipart/form-data` for photo uploads
-5. **Pagination**: Most list endpoints support pagination with `page` and `page_size` parameters
-6. **Filtering**: Parks and rides support extensive filtering options
-7. **Cloudflare Images**: Media files are handled through Cloudflare Images service
-8. **Email Verification**: New users must verify email before full access
-
----
-
-## 📖 Usage Examples
-
-### Authentication Flow
-```javascript
-// Login
-const login = await fetch('/api/v1/auth/login/', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ username: 'user@example.com', password: 'password' })
-});
-
-// Use tokens from response
-const { access, refresh } = await login.json();
-```
-
-### Fetch Parks with Filtering
-```javascript
-const parks = await fetch('/api/v1/parks/?continent=NA&min_rating=4.0&page=1', {
- headers: { 'Authorization': `Bearer ${access_token}` }
-});
-```
-
-### Upload Park Photo
-```javascript
-const formData = new FormData();
-formData.append('image', file);
-formData.append('caption', 'Beautiful park entrance');
-
-const photo = await fetch('/api/v1/parks/123/photos/', {
- method: 'POST',
- headers: { 'Authorization': `Bearer ${access_token}` },
- body: formData
-});
-```
-
----
-
-This documentation covers all available API endpoints in the ThrillWiki v1 API. For detailed request/response schemas, parameter validation, and interactive testing, visit `/api/docs/` when the development server is running.
\ No newline at end of file
diff --git a/VERIFICATION_COMMANDS.md b/VERIFICATION_COMMANDS.md
deleted file mode 100644
index 441973b1..00000000
--- a/VERIFICATION_COMMANDS.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Independent Verification Commands
-
-Run these commands yourself to verify ALL tuple fallbacks have been eliminated:
-
-## 1. Search for the most common tuple fallback patterns:
-
-```bash
-# Search for choices.get(value, fallback) patterns
-grep -r "choices\.get(" apps/ --include="*.py" | grep -v migration
-
-# Search for status_*.get(value, fallback) patterns
-grep -r "status_.*\.get(" apps/ --include="*.py" | grep -v migration
-
-# Search for category_*.get(value, fallback) patterns
-grep -r "category_.*\.get(" apps/ --include="*.py" | grep -v migration
-
-# Search for sla_hours.get(value, fallback) patterns
-grep -r "sla_hours\.get(" apps/ --include="*.py"
-
-# Search for the removed functions
-grep -r "get_tuple_choices\|from_tuple\|convert_tuple_choices" apps/ --include="*.py" | grep -v migration
-```
-
-**Expected result: ALL commands should return NOTHING (empty results)**
-
-## 2. Verify the removed function is actually gone:
-
-```bash
-# This should fail with ImportError
-python -c "from apps.core.choices.registry import get_tuple_choices; print('ERROR: Function still exists!')"
-
-# This should work
-python -c "from apps.core.choices.registry import get_choices; print('SUCCESS: Rich Choice objects work')"
-```
-
-## 3. Verify Django system integrity:
-
-```bash
-python manage.py check
-```
-
-**Expected result: Should pass with no errors**
-
-## 4. Manual spot check of previously problematic files:
-
-```bash
-# Check rides events (previously had 3 fallbacks)
-grep -n "\.get(" apps/rides/events.py | grep -E "(choice|status|category)"
-
-# Check template tags (previously had 2 fallbacks)
-grep -n "\.get(" apps/rides/templatetags/ride_tags.py | grep -E "(choice|category|image)"
-
-# Check admin (previously had 2 fallbacks)
-grep -n "\.get(" apps/rides/admin.py | grep -E "(choice|category)"
-
-# Check moderation (previously had 3 SLA fallbacks)
-grep -n "sla_hours\.get(" apps/moderation/
-```
-
-**Expected result: ALL should return NOTHING**
-
-## 5. Run the verification script:
-
-```bash
-python verify_no_tuple_fallbacks.py
-```
-
-**Expected result: Should print "SUCCESS: ALL TUPLE FALLBACKS HAVE BEEN ELIMINATED!"**
-
----
-
-If ANY of these commands find tuple fallbacks, then I was wrong.
-If ALL commands return empty/success, then ALL tuple fallbacks have been eliminated.
\ No newline at end of file
diff --git a/VISUAL_REGRESSION_TEST_REPORT.md b/VISUAL_REGRESSION_TEST_REPORT.md
deleted file mode 100644
index 50f68feb..00000000
--- a/VISUAL_REGRESSION_TEST_REPORT.md
+++ /dev/null
@@ -1,231 +0,0 @@
-# Visual Regression Testing Report
-## Cotton Components vs Original Include Components
-
-**Date:** September 21, 2025
-**Test Domain:** https://d6d61dac-164d-45dd-929f-7dcdfd771b64-00-1bpe9dzxxnshv.worf.replit.dev
-**Test Status:** ✅ PASSED - Zero Visual Differences Confirmed
-
----
-
-## Executive Summary
-
-Comprehensive visual regression testing has been performed comparing original Django include-based components with new Cotton component implementations. **All tests passed with zero visual differences detected.** The Cotton components preserve exact HTML output, CSS classes, styling, and interactive functionality.
-
-## Test Pages Verified
-
-1. **Button Component Test Page:** `/test-button/`
-2. **Auth Modal Component Test Page:** `/test-auth-modal/`
-
-## Components Tested
-
-### 1. Button Component (``)
-
-**Original:** `{% include 'components/ui/button.html' %}`
-**Cotton:** ``
-
-#### ✅ Visual Parity Confirmed
-
-**Variants Tested:**
-- ✅ Default variant - Identical blue primary styling
-- ✅ Destructive variant - Identical red warning styling
-- ✅ Outline variant - Identical border-only styling
-- ✅ Secondary variant - Identical gray secondary styling
-- ✅ Ghost variant - Identical transparent background styling
-- ✅ Link variant - Identical underlined link styling
-
-**Sizes Tested:**
-- ✅ Default size (h-10 px-4 py-2)
-- ✅ Small size (h-9 rounded-md px-3)
-- ✅ Large size (h-11 rounded-md px-8)
-- ✅ Icon size (h-10 w-10)
-
-**Additional Features:**
-- ✅ Icons (left and right) - Identical positioning and styling
-- ✅ HTMX attributes (hx-get, hx-post, hx-target, hx-swap) - Preserved exactly
-- ✅ Alpine.js directives (x-data, x-on) - Functional and identical
-- ✅ Custom classes - Applied correctly
-- ✅ Type attributes (submit, button) - Preserved
-- ✅ Disabled state - Identical styling and behavior
-- ✅ Legacy underscore props (hx_get) vs modern hyphenated (hx-get) - Both supported
-
-#### Technical Analysis
-```html
-
-
-```
-
-### 2. Input Component (``)
-
-**Original:** `{% include 'components/ui/input.html' %}`
-**Cotton:** ``
-
-#### ✅ Visual Parity Confirmed
-
-**Features Tested:**
-- ✅ Text input styling - Identical border, padding, focus states
-- ✅ Placeholder text - Identical muted foreground styling
-- ✅ Disabled state - Identical opacity and cursor styling
-- ✅ Required field validation - Functional
-- ✅ HTMX attributes - Preserved exactly
-- ✅ Alpine.js x-model binding - Functional
-
-### 3. Card Component (``)
-
-**Original:** `{% include 'components/ui/card.html' %}`
-**Cotton:** ``
-
-#### ✅ Visual Parity Confirmed
-
-**Features Tested:**
-- ✅ Card container styling - Identical border, shadow, and background
-- ✅ Header content - Identical padding and typography
-- ✅ Body content - Identical spacing and layout
-- ✅ Footer content - Identical positioning
-- ✅ Slot content mechanism - Functional replacement for include parameters
-
-### 4. Auth Modal Component (``)
-
-**Original:** `{% include 'components/auth/auth-modal.html' %}`
-**Cotton:** ``
-
-#### ✅ Visual Parity Confirmed
-
-**Modal Behavior:**
-- ✅ Modal opening animation - Identical fade-in and scale transitions
-- ✅ Modal closing behavior - ESC key, overlay click, X button all work identically
-- ✅ Background overlay - Identical blur and opacity effects
-- ✅ Modal positioning - Identical center alignment and responsive behavior
-
-**Form Functionality:**
-- ✅ Login/Register form switching - Identical behavior and animations
-- ✅ Form field styling - Identical input styling and validation states
-- ✅ Password visibility toggle - Eye icon functionality preserved
-- ✅ Social provider buttons - Identical styling and layout
-- ✅ Error message display - Identical styling and positioning
-- ✅ Loading states - Spinner animations and disabled states work identically
-
-**Alpine.js Integration:**
-- ✅ x-data="authModal" - Component initialization preserved
-- ✅ x-show directives - Conditional display logic identical
-- ✅ x-transition animations - Fade and scale effects identical
-- ✅ Event handlers (@click, @keydown.escape) - All functional
-- ✅ Template loops (x-for) - Social provider rendering identical
-- ✅ State management - Form switching and error handling identical
-
-## Interactive Functionality Testing
-
-### Button Interactions
-- ✅ Hover states - Color transitions identical
-- ✅ Click events - JavaScript handlers functional
-- ✅ HTMX requests - Network requests triggered correctly
-- ✅ Alpine.js integration - State changes handled identically
-
-### Modal Interactions
-- ✅ Keyboard navigation - TAB, ESC, ENTER all work
-- ✅ Focus management - Focus trapping identical
-- ✅ Form validation - Client-side validation preserved
-- ✅ Social authentication - Button click handlers functional
-
-## CSS Classes Analysis
-
-### Identical Class Application
-All components generate identical CSS class strings:
-
-**Button Base Classes:**
-```css
-inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50
-```
-
-**Input Base Classes:**
-```css
-flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50
-```
-
-## HTMX Attribute Preservation
-
-### Verified HTMX Attributes
-- ✅ `hx-get` - Preserved in both underscore and hyphenated formats
-- ✅ `hx-post` - Preserved in both underscore and hyphenated formats
-- ✅ `hx-target` - Element targeting preserved
-- ✅ `hx-swap` - Swap strategies preserved
-- ✅ `hx-trigger` - Event triggers preserved
-- ✅ `hx-include` - Form inclusion preserved
-
-## Alpine.js Directive Preservation
-
-### Verified Alpine.js Directives
-- ✅ `x-data` - Component initialization preserved
-- ✅ `x-show` - Conditional display preserved
-- ✅ `x-transition` - Animation configurations preserved
-- ✅ `x-model` - Two-way data binding preserved
-- ✅ `x-on/@` - Event handlers preserved
-- ✅ `x-for` - Template loops preserved
-- ✅ `x-init` - Initialization logic preserved
-
-## Legacy Compatibility
-
-### Underscore vs Hyphenated Attributes
-Cotton components support both legacy underscore props and modern hyphenated attributes:
-
-- ✅ `hx_get` and `hx-get` both work
-- ✅ `hx_post` and `hx-post` both work
-- ✅ `x_data` and `x-data` both work
-- ✅ Backward compatibility preserved
-
-## Performance Analysis
-
-### Rendering Performance
-- ✅ No measurable performance difference in rendering time
-- ✅ HTML output size identical
-- ✅ No additional HTTP requests
-- ✅ Client-side JavaScript behavior unchanged
-
-## Browser Compatibility
-
-### Tested Behaviors
-- ✅ Chrome - All features functional
-- ✅ Firefox - All features functional
-- ✅ Safari - All features functional
-- ✅ Mobile responsive behavior identical
-
-## Test Results Summary
-
-| Component | Visual Parity | Functionality | HTMX | Alpine.js | CSS Classes | Status |
-|-----------|---------------|---------------|------|-----------|-------------|---------|
-| Button | ✅ Identical | ✅ Preserved | ✅ Working | ✅ Working | ✅ Identical | ✅ PASS |
-| Input | ✅ Identical | ✅ Preserved | ✅ Working | ✅ Working | ✅ Identical | ✅ PASS |
-| Card | ✅ Identical | ✅ Preserved | ✅ Working | ✅ Working | ✅ Identical | ✅ PASS |
-| Auth Modal | ✅ Identical | ✅ Preserved | ✅ Working | ✅ Working | ✅ Identical | ✅ PASS |
-
-## Differences Found
-
-**Total Visual Differences: 0**
-**Total Functional Differences: 0**
-**Total Breaking Changes: 0**
-
-## Recommendations
-
-1. ✅ **Proceed with Cotton component implementation** - Zero breaking changes detected
-2. ✅ **Migration is safe** - All functionality preserved exactly
-3. ✅ **Template updates can proceed** - Components are production-ready
-4. ✅ **Developer experience improved** - Cotton syntax is cleaner and more maintainable
-
-## Conclusion
-
-The Cotton component implementation has achieved **100% visual and functional parity** with the original include-based components. All tests pass with zero differences detected. The migration to Cotton components can proceed with confidence as:
-
-- HTML output is identical
-- CSS styling is preserved exactly
-- Interactive functionality works identically
-- HTMX and Alpine.js integration is preserved
-- Legacy compatibility is maintained
-- Performance characteristics are unchanged
-
-**Status: ✅ APPROVED FOR PRODUCTION USE**
-
----
-
-*Test conducted on September 21, 2025*
-*All components verified on test domain: d6d61dac-164d-45dd-929f-7dcdfd771b64-00-1bpe9dzxxnshv.worf.replit.dev*
\ No newline at end of file
diff --git a/api_endpoints_curl_commands.sh b/api_endpoints_curl_commands.sh
deleted file mode 100755
index 9a0461c2..00000000
--- a/api_endpoints_curl_commands.sh
+++ /dev/null
@@ -1,649 +0,0 @@
-#!/bin/bash
-
-# ThrillWiki API Endpoints - Complete Curl Commands
-# Generated from comprehensive URL analysis
-# Base URL - adjust as needed for your environment
-BASE_URL="http://localhost:8000"
-
-# Command line options
-SKIP_AUTH=false
-ONLY_AUTH=false
-SKIP_DOCS=false
-HELP=false
-
-# Parse command line arguments
-while [[ $# -gt 0 ]]; do
- case $1 in
- --skip-auth)
- SKIP_AUTH=true
- shift
- ;;
- --only-auth)
- ONLY_AUTH=true
- shift
- ;;
- --skip-docs)
- SKIP_DOCS=true
- shift
- ;;
- --base-url)
- BASE_URL="$2"
- shift 2
- ;;
- --help|-h)
- HELP=true
- shift
- ;;
- *)
- echo "Unknown option: $1"
- echo "Use --help for usage information"
- exit 1
- ;;
- esac
-done
-
-# Show help
-if [ "$HELP" = true ]; then
- echo "ThrillWiki API Endpoints Test Suite"
- echo ""
- echo "Usage: $0 [OPTIONS]"
- echo ""
- echo "Options:"
- echo " --skip-auth Skip endpoints that require authentication"
- echo " --only-auth Only test endpoints that require authentication"
- echo " --skip-docs Skip API documentation endpoints (schema, swagger, redoc)"
- echo " --base-url URL Set custom base URL (default: http://localhost:8000)"
- echo " --help, -h Show this help message"
- echo ""
- echo "Examples:"
- echo " $0 # Test all endpoints"
- echo " $0 --skip-auth # Test only public endpoints"
- echo " $0 --only-auth # Test only authenticated endpoints"
- echo " $0 --skip-docs --skip-auth # Test only public non-documentation endpoints"
- echo " $0 --base-url https://api.example.com # Use custom base URL"
- exit 0
-fi
-
-# Validate conflicting options
-if [ "$SKIP_AUTH" = true ] && [ "$ONLY_AUTH" = true ]; then
- echo "Error: --skip-auth and --only-auth cannot be used together"
- exit 1
-fi
-
-echo "=== ThrillWiki API Endpoints Test Suite ==="
-echo "Base URL: $BASE_URL"
-if [ "$SKIP_AUTH" = true ]; then
- echo "Mode: Public endpoints only (skipping authentication required)"
-elif [ "$ONLY_AUTH" = true ]; then
- echo "Mode: Authenticated endpoints only"
-else
- echo "Mode: All endpoints"
-fi
-if [ "$SKIP_DOCS" = true ]; then
- echo "Skipping: API documentation endpoints"
-fi
-echo ""
-
-# Helper function to check if we should run an endpoint
-should_run_endpoint() {
- local requires_auth=$1
- local is_docs=$2
-
- # Skip docs if requested
- if [ "$SKIP_DOCS" = true ] && [ "$is_docs" = true ]; then
- return 1
- fi
-
- # Skip auth endpoints if requested
- if [ "$SKIP_AUTH" = true ] && [ "$requires_auth" = true ]; then
- return 1
- fi
-
- # Only run auth endpoints if requested
- if [ "$ONLY_AUTH" = true ] && [ "$requires_auth" = false ]; then
- return 1
- fi
-
- return 0
-}
-
-# Counter for endpoint numbering
-ENDPOINT_NUM=1
-
-# ============================================================================
-# AUTHENTICATION ENDPOINTS (/api/v1/auth/)
-# ============================================================================
-if should_run_endpoint false false || should_run_endpoint true false; then
- echo "=== AUTHENTICATION ENDPOINTS ==="
-fi
-
-if should_run_endpoint false false; then
- echo "$ENDPOINT_NUM. Login"
- curl -X POST "$BASE_URL/api/v1/auth/login/" \
- -H "Content-Type: application/json" \
- -d '{"username": "testuser", "password": "testpass"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Signup"
- curl -X POST "$BASE_URL/api/v1/auth/signup/" \
- -H "Content-Type: application/json" \
- -d '{"username": "newuser", "email": "test@example.com", "password": "newpass123"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Logout"
- curl -X POST "$BASE_URL/api/v1/auth/logout/" \
- -H "Content-Type: application/json"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Password Reset"
- curl -X POST "$BASE_URL/api/v1/auth/password/reset/" \
- -H "Content-Type: application/json" \
- -d '{"email": "user@example.com"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Social Providers"
- curl -X GET "$BASE_URL/api/v1/auth/providers/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Auth Status"
- curl -X GET "$BASE_URL/api/v1/auth/status/"
- ((ENDPOINT_NUM++))
-fi
-
-if should_run_endpoint true false; then
- echo -e "\n$ENDPOINT_NUM. Current User"
- curl -X GET "$BASE_URL/api/v1/auth/user/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Password Change"
- curl -X POST "$BASE_URL/api/v1/auth/password/change/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"old_password": "oldpass", "new_password": "newpass123"}'
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# HEALTH CHECK ENDPOINTS (/api/v1/health/)
-# ============================================================================
-if should_run_endpoint false false; then
- echo -e "\n\n=== HEALTH CHECK ENDPOINTS ==="
-
- echo "$ENDPOINT_NUM. Health Check"
- curl -X GET "$BASE_URL/api/v1/health/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Simple Health"
- curl -X GET "$BASE_URL/api/v1/health/simple/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Performance Metrics"
- curl -X GET "$BASE_URL/api/v1/health/performance/"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# TRENDING SYSTEM ENDPOINTS (/api/v1/trending/)
-# ============================================================================
-if should_run_endpoint false false; then
- echo -e "\n\n=== TRENDING SYSTEM ENDPOINTS ==="
-
- echo "$ENDPOINT_NUM. Trending Content"
- curl -X GET "$BASE_URL/api/v1/trending/content/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. New Content"
- curl -X GET "$BASE_URL/api/v1/trending/new/"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# STATISTICS ENDPOINTS (/api/v1/stats/)
-# ============================================================================
-if should_run_endpoint false false || should_run_endpoint true false; then
- echo -e "\n\n=== STATISTICS ENDPOINTS ==="
-fi
-
-if should_run_endpoint false false; then
- echo "$ENDPOINT_NUM. Statistics"
- curl -X GET "$BASE_URL/api/v1/stats/"
- ((ENDPOINT_NUM++))
-fi
-
-if should_run_endpoint true false; then
- echo -e "\n$ENDPOINT_NUM. Recalculate Statistics"
- curl -X POST "$BASE_URL/api/v1/stats/recalculate/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# RANKING SYSTEM ENDPOINTS (/api/v1/rankings/)
-# ============================================================================
-if should_run_endpoint false false || should_run_endpoint true false; then
- echo -e "\n\n=== RANKING SYSTEM ENDPOINTS ==="
-fi
-
-if should_run_endpoint false false; then
- echo "$ENDPOINT_NUM. List Rankings"
- curl -X GET "$BASE_URL/api/v1/rankings/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. List Rankings with Filters"
- curl -X GET "$BASE_URL/api/v1/rankings/?category=RC&min_riders=10&ordering=rank"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ranking Detail"
- curl -X GET "$BASE_URL/api/v1/rankings/ride-slug-here/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ranking History"
- curl -X GET "$BASE_URL/api/v1/rankings/ride-slug-here/history/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ranking Statistics"
- curl -X GET "$BASE_URL/api/v1/rankings/statistics/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ranking Comparisons"
- curl -X GET "$BASE_URL/api/v1/rankings/ride-slug-here/comparisons/"
- ((ENDPOINT_NUM++))
-fi
-
-if should_run_endpoint true false; then
- echo -e "\n$ENDPOINT_NUM. Trigger Ranking Calculation"
- curl -X POST "$BASE_URL/api/v1/rankings/calculate/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"category": "RC"}'
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# PARKS API ENDPOINTS (/api/v1/parks/)
-# ============================================================================
-if should_run_endpoint false false || should_run_endpoint true false; then
- echo -e "\n\n=== PARKS API ENDPOINTS ==="
-fi
-
-if should_run_endpoint false false; then
- echo "$ENDPOINT_NUM. List Parks"
- curl -X GET "$BASE_URL/api/v1/parks/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Park Filter Options"
- curl -X GET "$BASE_URL/api/v1/parks/filter-options/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Park Company Search"
- curl -X GET "$BASE_URL/api/v1/parks/search/companies/?q=disney"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Park Search Suggestions"
- curl -X GET "$BASE_URL/api/v1/parks/search-suggestions/?q=magic"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Park Detail"
- curl -X GET "$BASE_URL/api/v1/parks/1/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. List Park Photos"
- curl -X GET "$BASE_URL/api/v1/parks/1/photos/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Park Photo Detail"
- curl -X GET "$BASE_URL/api/v1/parks/1/photos/1/"
- ((ENDPOINT_NUM++))
-fi
-
-if should_run_endpoint true false; then
- echo -e "\n$ENDPOINT_NUM. Create Park"
- curl -X POST "$BASE_URL/api/v1/parks/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"name": "Test Park", "location": "Test City"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Update Park"
- curl -X PUT "$BASE_URL/api/v1/parks/1/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"name": "Updated Park Name"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Delete Park"
- curl -X DELETE "$BASE_URL/api/v1/parks/1/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Create Park Photo"
- curl -X POST "$BASE_URL/api/v1/parks/1/photos/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -F "image=@/path/to/photo.jpg" \
- -F "caption=Test photo"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Update Park Photo"
- curl -X PUT "$BASE_URL/api/v1/parks/1/photos/1/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"caption": "Updated caption"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Delete Park Photo"
- curl -X DELETE "$BASE_URL/api/v1/parks/1/photos/1/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# RIDES API ENDPOINTS (/api/v1/rides/)
-# ============================================================================
-if should_run_endpoint false false || should_run_endpoint true false; then
- echo -e "\n\n=== RIDES API ENDPOINTS ==="
-fi
-
-if should_run_endpoint false false; then
- echo "$ENDPOINT_NUM. List Rides"
- curl -X GET "$BASE_URL/api/v1/rides/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride Filter Options"
- curl -X GET "$BASE_URL/api/v1/rides/filter-options/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride Company Search"
- curl -X GET "$BASE_URL/api/v1/rides/search/companies/?q=intamin"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride Model Search"
- curl -X GET "$BASE_URL/api/v1/rides/search/ride-models/?q=giga"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride Search Suggestions"
- curl -X GET "$BASE_URL/api/v1/rides/search-suggestions/?q=millennium"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride Detail"
- curl -X GET "$BASE_URL/api/v1/rides/1/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. List Ride Photos"
- curl -X GET "$BASE_URL/api/v1/rides/1/photos/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride Photo Detail"
- curl -X GET "$BASE_URL/api/v1/rides/1/photos/1/"
- ((ENDPOINT_NUM++))
-fi
-
-if should_run_endpoint true false; then
- echo -e "\n$ENDPOINT_NUM. Create Ride"
- curl -X POST "$BASE_URL/api/v1/rides/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"name": "Test Coaster", "category": "RC", "park": 1}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Update Ride"
- curl -X PUT "$BASE_URL/api/v1/rides/1/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"name": "Updated Ride Name"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Delete Ride"
- curl -X DELETE "$BASE_URL/api/v1/rides/1/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Create Ride Photo"
- curl -X POST "$BASE_URL/api/v1/rides/1/photos/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -F "image=@/path/to/photo.jpg" \
- -F "caption=Test ride photo"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Update Ride Photo"
- curl -X PUT "$BASE_URL/api/v1/rides/1/photos/1/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"caption": "Updated ride photo caption"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Delete Ride Photo"
- curl -X DELETE "$BASE_URL/api/v1/rides/1/photos/1/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# ACCOUNTS API ENDPOINTS (/api/v1/accounts/)
-# ============================================================================
-if should_run_endpoint false false || should_run_endpoint true false; then
- echo -e "\n\n=== ACCOUNTS API ENDPOINTS ==="
-fi
-
-if should_run_endpoint false false; then
- echo "$ENDPOINT_NUM. List User Profiles"
- curl -X GET "$BASE_URL/api/v1/accounts/profiles/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. User Profile Detail"
- curl -X GET "$BASE_URL/api/v1/accounts/profiles/1/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. List Top Lists"
- curl -X GET "$BASE_URL/api/v1/accounts/toplists/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Top List Detail"
- curl -X GET "$BASE_URL/api/v1/accounts/toplists/1/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. List Top List Items"
- curl -X GET "$BASE_URL/api/v1/accounts/toplist-items/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Top List Item Detail"
- curl -X GET "$BASE_URL/api/v1/accounts/toplist-items/1/"
- ((ENDPOINT_NUM++))
-fi
-
-if should_run_endpoint true false; then
- echo -e "\n$ENDPOINT_NUM. Update User Profile"
- curl -X PUT "$BASE_URL/api/v1/accounts/profiles/1/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"bio": "Updated bio"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Create Top List"
- curl -X POST "$BASE_URL/api/v1/accounts/toplists/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"name": "My Top Coasters", "description": "My favorite roller coasters"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Update Top List"
- curl -X PUT "$BASE_URL/api/v1/accounts/toplists/1/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"name": "Updated Top List Name"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Delete Top List"
- curl -X DELETE "$BASE_URL/api/v1/accounts/toplists/1/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Create Top List Item"
- curl -X POST "$BASE_URL/api/v1/accounts/toplist-items/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"toplist": 1, "ride": 1, "position": 1}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Update Top List Item"
- curl -X PUT "$BASE_URL/api/v1/accounts/toplist-items/1/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"position": 2}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Delete Top List Item"
- curl -X DELETE "$BASE_URL/api/v1/accounts/toplist-items/1/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# HISTORY API ENDPOINTS (/api/v1/history/)
-# ============================================================================
-if should_run_endpoint false false; then
- echo -e "\n\n=== HISTORY API ENDPOINTS ==="
-
- echo "$ENDPOINT_NUM. Park History List"
- curl -X GET "$BASE_URL/api/v1/history/parks/park-slug/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Park History Detail"
- curl -X GET "$BASE_URL/api/v1/history/parks/park-slug/detail/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride History List"
- curl -X GET "$BASE_URL/api/v1/history/parks/park-slug/rides/ride-slug/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Ride History Detail"
- curl -X GET "$BASE_URL/api/v1/history/parks/park-slug/rides/ride-slug/detail/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Unified Timeline"
- curl -X GET "$BASE_URL/api/v1/history/timeline/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Unified Timeline Detail"
- curl -X GET "$BASE_URL/api/v1/history/timeline/1/"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# EMAIL API ENDPOINTS (/api/v1/email/)
-# ============================================================================
-if should_run_endpoint true false; then
- echo -e "\n\n=== EMAIL API ENDPOINTS ==="
-
- echo "$ENDPOINT_NUM. Send Email"
- curl -X POST "$BASE_URL/api/v1/email/send/" \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE" \
- -d '{"to": "recipient@example.com", "subject": "Test", "message": "Test message"}'
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# CORE API ENDPOINTS (/api/v1/core/)
-# ============================================================================
-if should_run_endpoint false false; then
- echo -e "\n\n=== CORE API ENDPOINTS ==="
-
- echo "$ENDPOINT_NUM. Entity Fuzzy Search"
- curl -X GET "$BASE_URL/api/v1/core/entities/search/?q=disney"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Entity Not Found"
- curl -X POST "$BASE_URL/api/v1/core/entities/not-found/" \
- -H "Content-Type: application/json" \
- -d '{"query": "nonexistent park", "type": "park"}'
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Entity Suggestions"
- curl -X GET "$BASE_URL/api/v1/core/entities/suggestions/?q=magic"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# MAPS API ENDPOINTS (/api/v1/maps/)
-# ============================================================================
-if should_run_endpoint false false || should_run_endpoint true false; then
- echo -e "\n\n=== MAPS API ENDPOINTS ==="
-fi
-
-if should_run_endpoint false false; then
- echo "$ENDPOINT_NUM. Map Locations"
- curl -X GET "$BASE_URL/api/v1/maps/locations/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Map Location Detail"
- curl -X GET "$BASE_URL/api/v1/maps/locations/park/1/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Map Search"
- curl -X GET "$BASE_URL/api/v1/maps/search/?q=disney"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Map Bounds Query"
- curl -X GET "$BASE_URL/api/v1/maps/bounds/?north=40.7&south=40.6&east=-73.9&west=-74.0"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Map Statistics"
- curl -X GET "$BASE_URL/api/v1/maps/stats/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Map Cache Status"
- curl -X GET "$BASE_URL/api/v1/maps/cache/"
- ((ENDPOINT_NUM++))
-fi
-
-if should_run_endpoint true false; then
- echo -e "\n$ENDPOINT_NUM. Invalidate Map Cache"
- curl -X POST "$BASE_URL/api/v1/maps/cache/invalidate/" \
- -H "Authorization: Bearer YOUR_TOKEN_HERE"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# API DOCUMENTATION ENDPOINTS
-# ============================================================================
-if should_run_endpoint false true; then
- echo -e "\n\n=== API DOCUMENTATION ENDPOINTS ==="
-
- echo "$ENDPOINT_NUM. OpenAPI Schema"
- curl -X GET "$BASE_URL/api/schema/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. Swagger UI"
- curl -X GET "$BASE_URL/api/docs/"
- ((ENDPOINT_NUM++))
-
- echo -e "\n$ENDPOINT_NUM. ReDoc"
- curl -X GET "$BASE_URL/api/redoc/"
- ((ENDPOINT_NUM++))
-fi
-
-# ============================================================================
-# HEALTH CHECK (Django Health Check)
-# ============================================================================
-if should_run_endpoint false false; then
- echo -e "\n\n=== DJANGO HEALTH CHECK ==="
-
- echo "$ENDPOINT_NUM. Django Health Check"
- curl -X GET "$BASE_URL/health/"
- ((ENDPOINT_NUM++))
-fi
-
-echo -e "\n\n=== END OF API ENDPOINTS TEST SUITE ==="
-echo "Total endpoints tested: $((ENDPOINT_NUM - 1))"
-echo ""
-echo "Notes:"
-echo "- Replace YOUR_TOKEN_HERE with actual authentication tokens"
-echo "- Replace /path/to/photo.jpg with actual file paths for photo uploads"
-echo "- Replace numeric IDs (1, 2, etc.) with actual resource IDs"
-echo "- Replace slug placeholders (park-slug, ride-slug) with actual slugs"
-echo "- Adjust BASE_URL for your environment (localhost:8000, staging, production)"
-echo ""
-echo "Authentication required endpoints are marked with Authorization header"
-echo "File upload endpoints use multipart/form-data (-F flag)"
-echo "JSON endpoints use application/json content type"
diff --git a/complete-project-review-2025-01-05.md b/complete-project-review-2025-01-05.md
deleted file mode 100644
index dd3d554c..00000000
--- a/complete-project-review-2025-01-05.md
+++ /dev/null
@@ -1,435 +0,0 @@
-# ThrillWiki Django Project - Complete Technical Review
-**Date:** January 5, 2025
-**Reviewer:** Roo (Architect Mode)
-**Review Type:** Exhaustive Code Analysis
-**Status:** COMPLETED - Comprehensive analysis of entire codebase
-
-> **CRITICAL MEMORY BANK DOCUMENT** - This exhaustive review represents the most comprehensive analysis of the ThrillWiki project to date. All future architectural decisions should reference this document.
-
-## Executive Summary
-
-ThrillWiki is a comprehensive Django-based theme park and ride database application with advanced features including user authentication, content moderation, media management, location services, analytics, and history tracking. The project follows modern Django patterns with HTMX for dynamic interactions and uses PostgreSQL with PostGIS for geographic data.
-
-## Technical Stack Analysis
-
-### Core Framework & Dependencies
-- **Django 5.0+** - Modern Django framework
-- **Python 3.11+** - Latest Python version
-- **PostgreSQL with PostGIS** - Geographic database support
-- **UV Package Manager** - Modern Python package management
-- **Tailwind CSS** - Utility-first CSS framework
-- **HTMX** - Dynamic HTML interactions without JavaScript frameworks
-
-### Key Third-Party Packages
-- **django-allauth** - Authentication and social login
-- **django-pghistory** - Comprehensive history tracking
-- **django-htmx** - HTMX integration
-- **django-cleanup** - Automatic file cleanup
-- **django-filter** - Advanced filtering
-- **Pillow** - Image processing
-- **WhiteNoise** - Static file serving
-- **Playwright** - End-to-end testing
-
-## Django App Inventory & Functionality Analysis
-
-### 1. Core Apps
-
-#### **accounts** - User Management System
-- **Models:**
- - `User` (AbstractUser) - Custom user with roles, theme preferences, unique user_id
- - `UserProfile` - Extended profile with avatar, bio, social links, ride statistics
- - `EmailVerification` - Email verification tokens
- - `PasswordReset` - Password reset functionality
- - `TopList` - User-created ranked lists
- - `TopListItem` - Individual items in top lists
-
-- **Key Features:**
- - Role-based access (USER, MODERATOR, ADMIN, SUPERUSER)
- - Social authentication (Google, Discord)
- - HTMX-powered login/signup modals
- - Turnstile CAPTCHA integration
- - Profile management with avatar upload
- - Password reset with email verification
-
-#### **parks** - Theme Park Management
-- **Models:**
- - `Park` - Main park entity with status, location, statistics
- - `ParkArea` - Themed areas within parks
-
-- **Key Features:**
- - Park status tracking (Operating, Closed, Under Construction, etc.)
- - Geographic location integration
- - Operator and property owner relationships
- - Historical slug tracking for SEO
- - Photo and review associations
-
-#### **rides** - Ride Database System
-- **Models:**
- - `Ride` - Individual ride installations
- - `RideModel` - Manufacturer ride models/types
- - `RollerCoasterStats` - Detailed coaster specifications
- - `RideEvent`/`RideModelEvent` - History tracking models
-
-- **Key Features:**
- - Comprehensive ride categorization (RC, DR, FR, WR, TR, OT)
- - Detailed coaster statistics (height, speed, inversions, etc.)
- - Manufacturer and designer relationships
- - Status lifecycle management
- - Historical change tracking
-
-### 2. Company Entity Apps
-
-#### **operators** - Park Operating Companies
-- **Models:** `Operator` - Companies that operate theme parks
-- **Features:** Replaces legacy Company.owner relationships
-
-#### **property_owners** - Property Ownership
-- **Models:** `PropertyOwner` - Companies that own park property
-- **Features:** Optional relationship, usually same as operator but can differ
-
-#### **manufacturers** - Ride Manufacturers
-- **Models:** `Manufacturer` - Companies that manufacture rides
-- **Features:** Enhanced from existing system, separate from general companies
-
-#### **designers** - Ride Designers
-- **Models:** `Designer` - Companies/individuals that design rides
-- **Features:** Existing concept maintained for ride attribution
-
-### 3. Content & Media Apps
-
-#### **media** - Photo Management System
-- **Models:** `Photo` - Generic photo model with approval workflow
-- **Features:**
- - Generic foreign key for any model association
- - EXIF data extraction
- - Approval workflow for moderation
- - Custom storage backend
- - Automatic file organization
-
-#### **reviews** - User Review System
-- **Models:**
- - `Review` - Generic reviews for parks/rides
- - `ReviewImage` - Review photo attachments
- - `ReviewLike` - Review engagement
- - `ReviewReport` - Content moderation
-
-- **Features:**
- - 1-10 rating scale
- - Generic content type support
- - Moderation workflow
- - User engagement tracking
-
-### 4. Supporting Systems
-
-#### **moderation** - Content Moderation System
-- **Models:**
- - `EditSubmission` - User-submitted edits/additions
- - `PhotoSubmission` - User-submitted photos
-
-- **Features:**
- - Comprehensive edit approval workflow
- - Moderator edit capabilities
- - Duplicate detection
- - Status tracking (PENDING, APPROVED, REJECTED, ESCALATED)
- - Auto-approval for moderators
-
-#### **location** - Geographic Services
-- **Models:** `Location` - Generic location model with PostGIS support
-- **Features:**
- - Full address components
- - Geographic coordinates (legacy decimal + PostGIS Point)
- - Distance calculations
- - Nearby location queries
-
-#### **analytics** - Usage Analytics
-- **Models:** `PageView` - Generic page view tracking
-- **Features:**
- - Trending content calculation
- - IP and user agent tracking
- - Time-based analytics
-
-#### **search** - Search Functionality
-- **Models:** None (view-based search)
-- **Features:** Global search across parks, rides, operators, manufacturers
-
-### 5. Infrastructure Apps
-
-#### **history_tracking** - Change Management
-- **Models:**
- - `TrackedModel` - Abstract base for history tracking
- - `HistoricalSlug` - Manual slug history tracking
- - `DiffMixin` - Change comparison utilities
-
-- **Features:**
- - Comprehensive change tracking via pghistory
- - Slug history for SEO preservation
- - Diff generation for changes
-
-#### **email_service** - Email Management
-- **Models:** `EmailConfiguration` - Site-specific email settings
-- **Features:** Forward Email API integration
-
-#### **core** - Shared Utilities
-- **Models:**
- - `SlugHistory` - Generic slug tracking
- - `SluggedModel` - Abstract slugged model base
-
-## Entity Relationship Analysis
-
-### Primary Entity Relationships
-
-```
-Park (1) ←→ (1) Operator [REQUIRED]
-Park (1) ←→ (0..1) PropertyOwner [OPTIONAL]
-Park (1) ←→ (*) ParkArea
-Park (1) ←→ (*) Ride
-Park (1) ←→ (*) Location [Generic]
-Park (1) ←→ (*) Photo [Generic]
-Park (1) ←→ (*) Review [Generic]
-
-Ride (1) ←→ (1) Park [REQUIRED]
-Ride (1) ←→ (0..1) ParkArea [OPTIONAL]
-Ride (1) ←→ (0..1) Manufacturer [OPTIONAL]
-Ride (1) ←→ (0..1) Designer [OPTIONAL]
-Ride (1) ←→ (0..1) RideModel [OPTIONAL]
-Ride (1) ←→ (0..1) RollerCoasterStats [OPTIONAL]
-Ride (1) ←→ (*) Photo [Generic]
-Ride (1) ←→ (*) Review [Generic]
-
-RideModel (1) ←→ (0..1) Manufacturer
-RideModel (1) ←→ (*) Ride
-
-User (1) ←→ (1) UserProfile
-User (1) ←→ (*) Review
-User (1) ←→ (*) TopList
-User (1) ←→ (*) EditSubmission
-User (1) ←→ (*) PhotoSubmission
-```
-
-### Key Architectural Patterns
-
-1. **Generic Foreign Keys** - Extensive use for flexible relationships (Photos, Reviews, Locations)
-2. **History Tracking** - Comprehensive change tracking via django-pghistory
-3. **Slug Management** - SEO-friendly URLs with historical slug preservation
-4. **Moderation Workflow** - User-generated content approval system
-5. **Role-Based Access** - Hierarchical user permissions
-
-## Database Schema Analysis
-
-### Core Tables Structure
-
-#### User Management
-- `accounts_user` - Extended Django user model
-- `accounts_userprofile` - User profile extensions
-- `accounts_toplist` / `accounts_toplistitem` - User rankings
-
-#### Content Tables
-- `parks_park` / `parks_parkarea` - Park hierarchy
-- `rides_ride` / `rides_ridemodel` / `rides_rollercoasterstats` - Ride data
-- `operators_operator` / `property_owners_propertyowner` - Ownership
-- `manufacturers_manufacturer` / `designers_designer` - Attribution
-
-#### Supporting Tables
-- `media_photo` - Generic photo storage
-- `reviews_review` + related - Review system
-- `location_location` - Geographic data
-- `moderation_editsubmission` / `moderation_photosubmission` - Moderation
-- `analytics_pageview` - Usage tracking
-
-#### History Tables (pghistory)
-- `*_*event` tables for comprehensive change tracking
-- Automatic creation via pghistory decorators
-
-## URL Routing Analysis
-
-### Main URL Structure
-```
-/ - Home page with trending content
-/admin/ - Django admin interface
-/ac/ - Autocomplete endpoints
-/parks/ - Park browsing and details
-/rides/ - Ride browsing and details
-/operators/ - Operator profiles
-/property-owners/ - Property owner profiles
-/manufacturers/ - Manufacturer profiles
-/designers/ - Designer profiles
-/photos/ - Media management
-/search/ - Global search
-/accounts/ - Authentication (custom + allauth)
-/moderation/ - Content moderation
-/history/ - Change history
-```
-
-### URL Patterns
-- SEO-friendly slugs for all content
-- Historical slug support for redirects
-- HTMX-compatible endpoints
-- RESTful resource organization
-
-## Form Analysis
-
-### Key Forms Identified
-- User authentication (login/signup with Turnstile)
-- Profile management
-- Content submission (parks, rides)
-- Photo uploads
-- Review submission
-- Moderation workflows
-
-### Form Features
-- HTMX integration for dynamic interactions
-- Comprehensive validation
-- File upload handling
-- CAPTCHA protection
-
-## Admin Interface Analysis
-
-### Django Admin Customization
-- Custom admin interfaces for all models
-- Bulk operations support
-- Advanced filtering and search
-- Moderation workflow integration
-- History tracking display
-
-## Template Structure Analysis
-
-### Template Organization
-```
-templates/
-├── base/ - Base templates and layouts
-├── account/ - Authentication templates
-├── accounts/ - User profile templates
-├── parks/ - Park-related templates
-├── rides/ - Ride-related templates
-├── operators/ - Operator templates
-├── manufacturers/ - Manufacturer templates
-├── designers/ - Designer templates
-├── property_owners/ - Property owner templates
-├── media/ - Photo management templates
-├── moderation/ - Moderation interface templates
-├── location/ - Location templates
-└── pages/ - Static pages
-```
-
-### Template Features
-- HTMX partial templates for dynamic updates
-- Responsive design with Tailwind CSS
-- Component-based architecture
-- SEO optimization
-- Accessibility considerations
-
-## Static Asset Analysis
-
-### CSS Architecture
-- Tailwind CSS utility-first approach
-- Custom CSS in `static/css/src/`
-- Compiled output in `static/css/`
-- Component-specific styles
-
-### JavaScript
-- Minimal custom JavaScript
-- HTMX for dynamic interactions
-- Alpine.js integration
-- Progressive enhancement approach
-
-### Images
-- Placeholder images in `static/images/placeholders/`
-- User-uploaded content in `media/`
-- Organized by content type
-
-## Database Migration Analysis
-
-### Migration Strategy
-- Comprehensive migration files for all apps
-- Geographic data migrations (PostGIS)
-- History tracking setup
-- Data integrity constraints
-
-### Key Migration Patterns
-- Foreign key relationship establishment
-- Index creation for performance
-- Data type migrations
-- Constraint additions
-
-## Test Coverage Analysis
-
-### Testing Structure
-```
-tests/
-├── e2e/ - End-to-end tests with Playwright
-├── fixtures/ - Test data fixtures
-└── [app]/tests/ - Unit tests per app
-```
-
-### Testing Approach
-- Playwright for browser testing
-- Django TestCase for unit tests
-- Fixture-based test data
-- Coverage reporting
-
-## Management Command Analysis
-
-### Custom Commands
-- Data import/export utilities
-- Maintenance scripts
-- Analytics processing
-- Content moderation helpers
-
-## Technical Debt & Architecture Assessment
-
-### Strengths
-1. **Modern Django Patterns** - Uses latest Django features and best practices
-2. **Comprehensive History Tracking** - Full audit trail via pghistory
-3. **Flexible Content System** - Generic foreign keys for extensibility
-4. **Geographic Support** - PostGIS integration for location features
-5. **Moderation Workflow** - Robust user-generated content management
-6. **Performance Considerations** - Proper indexing and query optimization
-
-### Areas for Improvement
-1. **API Layer** - No REST API for mobile/external access
-2. **Caching Strategy** - Limited caching implementation
-3. **Search Optimization** - Basic search, could benefit from Elasticsearch
-4. **Image Optimization** - No automatic image resizing/optimization
-5. **Internationalization** - No i18n support currently
-
-### Security Analysis
-1. **Authentication** - Robust with social login and 2FA options
-2. **Authorization** - Role-based access control
-3. **Input Validation** - Comprehensive form validation
-4. **CSRF Protection** - Django built-in protection
-5. **SQL Injection** - ORM usage prevents issues
-6. **File Upload Security** - Proper validation and storage
-
-## Performance Considerations
-
-### Database Optimization
-- Proper indexing on frequently queried fields
-- Select/prefetch related for query optimization
-- Generic foreign key indexing
-
-### Caching Strategy
-- Basic cache implementation
-- Trending content caching
-- Static file optimization with WhiteNoise
-
-### Media Handling
-- Custom storage backend
-- Organized file structure
-- EXIF data extraction
-
-## Deployment Architecture
-
-### Production Considerations
-- PostgreSQL with PostGIS extensions
-- Static file serving via WhiteNoise
-- Media file storage (local/cloud)
-- Email service integration
-- Geographic library dependencies (GDAL, GEOS)
-
-## Conclusion
-
-ThrillWiki represents a well-architected Django application with modern patterns and comprehensive functionality. The codebase demonstrates strong engineering practices with proper separation of concerns, extensive history tracking, and robust content moderation. The entity relationship model effectively captures the complex relationships in the theme park industry while maintaining flexibility for future expansion.
-
-The project successfully implements a sophisticated content management system with user-generated content, geographic features, and comprehensive analytics. The modular app structure allows for easy maintenance and feature additions while the extensive use of Django's built-in features ensures reliability and security.
-
-**Overall Assessment: Excellent** - This is a production-ready application with strong architectural foundations and comprehensive feature set suitable for a theme park enthusiast community.
\ No newline at end of file
diff --git a/debug-setup-automation.sh b/debug-setup-automation.sh
deleted file mode 100755
index cfa4d0e2..00000000
--- a/debug-setup-automation.sh
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/bin/bash
-#
-# Debug version of setup-automation.sh to identify non-interactive mode failures
-#
-
-set -e
-
-# Enable verbose debugging
-set -x
-
-echo "DEBUG: Script started at $(date)"
-echo "DEBUG: Arguments received: $*"
-echo "DEBUG: Total argument count: $#"
-
-# Test the exact command that's failing
-echo "DEBUG: Testing setup-automation.sh with --non-interactive flag"
-echo "DEBUG: NON_INTERACTIVE environment variable before: ${NON_INTERACTIVE:-unset}"
-
-# Simulate the command line parsing logic from setup-automation.sh
-echo "DEBUG: Parsing command line arguments..."
-
-command="${1:-setup}"
-echo "DEBUG: Initial command: $command"
-
-# Parse options (mimicking the main script logic)
-while [[ $# -gt 0 ]]; do
- echo "DEBUG: Processing argument: $1"
- case "$1" in
- --non-interactive)
- export NON_INTERACTIVE="true"
- echo "DEBUG: NON_INTERACTIVE flag set to: $NON_INTERACTIVE"
- shift
- ;;
- --force-rebuild)
- export FORCE_REBUILD="true"
- echo "DEBUG: FORCE_REBUILD flag set to: $FORCE_REBUILD"
- shift
- ;;
- --debug)
- export CONFIG_DEBUG="true"
- echo "DEBUG: CONFIG_DEBUG flag set to: $CONFIG_DEBUG"
- shift
- ;;
- -h|--help)
- echo "DEBUG: Help requested"
- exit 0
- ;;
- -*)
- echo "DEBUG: Unknown option: $1"
- exit 1
- ;;
- *)
- echo "DEBUG: Breaking on non-option argument: $1"
- break
- ;;
- esac
-done
-
-# Update command after option parsing (this might be the bug)
-command="${1:-setup}"
-echo "DEBUG: Final command after parsing: $command"
-echo "DEBUG: Remaining arguments: $*"
-
-echo "DEBUG: NON_INTERACTIVE environment variable after parsing: ${NON_INTERACTIVE:-unset}"
-
-# Test the specific condition that shows the interactive banner
-echo "DEBUG: Testing banner condition..."
-if [[ "$NON_INTERACTIVE" != "true" ]]; then
- echo "DEBUG: BANNER WOULD BE SHOWN - this is the problem!"
- echo "DEBUG: NON_INTERACTIVE value: '$NON_INTERACTIVE'"
- echo "DEBUG: Comparison result: '$NON_INTERACTIVE' != 'true'"
-else
- echo "DEBUG: Banner would be suppressed (correct behavior)"
-fi
-
-# Test what happens when we call the actual script
-echo "DEBUG: Now calling actual setup-automation.sh with timeout..."
-echo "DEBUG: Command will be: timeout 10s bash scripts/vm/setup-automation.sh setup --non-interactive"
-
-# Add timeout to prevent hanging
-if timeout 10s bash scripts/vm/setup-automation.sh setup --non-interactive 2>&1; then
- echo "DEBUG: Script completed successfully"
-else
- exit_code=$?
- echo "DEBUG: Script failed with exit code: $exit_code"
- if [[ $exit_code -eq 124 ]]; then
- echo "DEBUG: Script timed out (likely hanging on interactive prompt)"
- fi
-fi
-
-echo "DEBUG: Debug script completed at $(date)"
\ No newline at end of file
diff --git a/demo_roadtrip_usage.py b/demo_roadtrip_usage.py
deleted file mode 100644
index f40745c9..00000000
--- a/demo_roadtrip_usage.py
+++ /dev/null
@@ -1,363 +0,0 @@
-"""
-Demonstration script showing practical usage of the RoadTripService.
-
-This script demonstrates real-world scenarios for using the OSM Road Trip Service
-in the ThrillWiki application.
-"""
-
-from parks.models import Park
-from parks.services import RoadTripService
-import os
-import django
-
-# Setup Django
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thrillwiki.settings")
-django.setup()
-
-
-def demo_florida_theme_park_trip():
- """
- Demonstrate planning a Florida theme park road trip.
- """
- print("🏖️ Florida Theme Park Road Trip Planner")
- print("=" * 50)
-
- service = RoadTripService()
-
- # Define Florida theme parks with addresses
- florida_parks = [
- ("Magic Kingdom", "Magic Kingdom Dr, Orlando, FL 32830"),
- (
- "Universal Studios Florida",
- "6000 Universal Blvd, Orlando, FL 32819",
- ),
- ("SeaWorld Orlando", "7007 Sea World Dr, Orlando, FL 32821"),
- ("Busch Gardens Tampa", "10165 McKinley Dr, Tampa, FL 33612"),
- ]
-
- print("Planning trip for these Florida parks:")
- park_coords = {}
-
- for name, address in florida_parks:
- print(f"\n📍 Geocoding {name}...")
- coords = service.geocode_address(address)
- if coords:
- park_coords[name] = coords
- print(
- f" ✅ Located at {
- coords.latitude:.4f}, {
- coords.longitude:.4f}"
- )
- else:
- print(f" ❌ Could not geocode {address}")
-
- if len(park_coords) < 2:
- print("❌ Need at least 2 parks to plan a trip")
- return
-
- # Calculate distances between all parks
- print("\n🗺️ Distance Matrix:")
- park_names = list(park_coords.keys())
-
- for i, park1 in enumerate(park_names):
- for j, park2 in enumerate(park_names):
- if i < j: # Only calculate each pair once
- route = service.calculate_route(park_coords[park1], park_coords[park2])
- if route:
- print(f" {park1} ↔ {park2}")
- print(
- f" {
- route.formatted_distance}, {
- route.formatted_duration}"
- )
-
- # Find central park for radiating searches
- print("\n🎢 Parks within 100km of Magic Kingdom:")
- magic_kingdom_coords = park_coords.get("Magic Kingdom")
- if magic_kingdom_coords:
- for name, coords in park_coords.items():
- if name != "Magic Kingdom":
- route = service.calculate_route(magic_kingdom_coords, coords)
- if route:
- print(
- f" {name}: {
- route.formatted_distance} ({
- route.formatted_duration})"
- )
-
-
-def demo_cross_country_road_trip():
- """
- Demonstrate planning a cross-country theme park road trip.
- """
- print("\n\n🇺🇸 Cross-Country Theme Park Road Trip")
- print("=" * 50)
-
- service = RoadTripService()
-
- # Major theme parks across the US
- major_parks = [
- ("Disneyland", "1313 Disneyland Dr, Anaheim, CA 92802"),
- ("Cedar Point", "1 Cedar Point Dr, Sandusky, OH 44870"),
- (
- "Six Flags Magic Mountain",
- "26101 Magic Mountain Pkwy, Valencia, CA 91355",
- ),
- ("Walt Disney World", "Walt Disney World Resort, Orlando, FL 32830"),
- ]
-
- print("Geocoding major US theme parks:")
- park_coords = {}
-
- for name, address in major_parks:
- print(f"\n📍 {name}...")
- coords = service.geocode_address(address)
- if coords:
- park_coords[name] = coords
- print(f" ✅ {coords.latitude:.4f}, {coords.longitude:.4f}")
-
- if len(park_coords) >= 3:
- # Calculate an optimized route if we have DB parks
- print("\n🛣️ Optimized Route Planning:")
- print("Note: This would work with actual Park objects from the database")
-
- # Show distances for a potential route
- route_order = [
- "Disneyland",
- "Six Flags Magic Mountain",
- "Cedar Point",
- "Walt Disney World",
- ]
- total_distance = 0
- total_time = 0
-
- for i in range(len(route_order) - 1):
- from_park = route_order[i]
- to_park = route_order[i + 1]
-
- if from_park in park_coords and to_park in park_coords:
- route = service.calculate_route(
- park_coords[from_park], park_coords[to_park]
- )
- if route:
- total_distance += route.distance_km
- total_time += route.duration_minutes
- print(f" {i + 1}. {from_park} → {to_park}")
- print(
- f" {
- route.formatted_distance}, {
- route.formatted_duration}"
- )
-
- print("\n📊 Trip Summary:")
- print(f" Total Distance: {total_distance:.1f}km")
- print(
- f" Total Driving Time: {
- total_time //
- 60}h {
- total_time %
- 60}min"
- )
- print(f" Average Distance per Leg: {total_distance / 3:.1f}km")
-
-
-def demo_database_integration():
- """
- Demonstrate working with actual parks from the database.
- """
- print("\n\n🗄️ Database Integration Demo")
- print("=" * 50)
-
- service = RoadTripService()
-
- # Get parks that have location data
- parks_with_location = Park.objects.filter(
- location__point__isnull=False
- ).select_related("location")[:5]
-
- if not parks_with_location:
- print("❌ No parks with location data found in database")
- return
-
- print(f"Found {len(parks_with_location)} parks with location data:")
-
- for park in parks_with_location:
- coords = park.coordinates
- if coords:
- print(f" 🎢 {park.name}: {coords[0]:.4f}, {coords[1]:.4f}")
-
- # Demonstrate nearby park search
- if len(parks_with_location) >= 1:
- center_park = parks_with_location[0]
- print(f"\n🔍 Finding parks within 500km of {center_park.name}:")
-
- nearby_parks = service.get_park_distances(center_park, radius_km=500)
-
- if nearby_parks:
- print(f" Found {len(nearby_parks)} nearby parks:")
- for result in nearby_parks[:3]: # Show top 3
- park = result["park"]
- print(
- f" 📍 {
- park.name}: {
- result['formatted_distance']} ({
- result['formatted_duration']})"
- )
- else:
- print(" No nearby parks found (may need larger radius)")
-
- # Demonstrate multi-park trip planning
- if len(parks_with_location) >= 3:
- selected_parks = list(parks_with_location)[:3]
- print("\n🗺️ Planning optimized trip for 3 parks:")
-
- for park in selected_parks:
- print(f" - {park.name}")
-
- trip = service.create_multi_park_trip(selected_parks)
-
- if trip:
- print("\n✅ Optimized Route:")
- print(f" Total Distance: {trip.formatted_total_distance}")
- print(f" Total Duration: {trip.formatted_total_duration}")
- print(" Route:")
-
- for i, leg in enumerate(trip.legs, 1):
- print(f" {i}. {leg.from_park.name} → {leg.to_park.name}")
- print(
- f" {
- leg.route.formatted_distance}, {
- leg.route.formatted_duration}"
- )
- else:
- print(" ❌ Could not optimize trip route")
-
-
-def demo_geocoding_fallback():
- """
- Demonstrate geocoding parks that don't have coordinates.
- """
- print("\n\n🌍 Geocoding Demo")
- print("=" * 50)
-
- service = RoadTripService()
-
- # Get parks without location data
- parks_without_coords = Park.objects.filter(
- location__point__isnull=True
- ).select_related("location")[:3]
-
- if not parks_without_coords:
- print("✅ All parks already have coordinates")
- return
-
- print(f"Found {len(parks_without_coords)} parks without coordinates:")
-
- for park in parks_without_coords:
- print(f"\n🎢 {park.name}")
-
- if hasattr(park, "location") and park.location:
- location = park.location
- address_parts = [
- park.name,
- location.street_address,
- location.city,
- location.state,
- location.country,
- ]
- address = ", ".join(part for part in address_parts if part)
- print(f" Address: {address}")
-
- # Try to geocode
- success = service.geocode_park_if_needed(park)
- if success:
- coords = park.coordinates
- print(f" ✅ Geocoded to: {coords[0]:.4f}, {coords[1]:.4f}")
- else:
- print(" ❌ Geocoding failed")
- else:
- print(" ❌ No location data available")
-
-
-def demo_cache_performance():
- """
- Demonstrate caching performance benefits.
- """
- print("\n\n⚡ Cache Performance Demo")
- print("=" * 50)
-
- service = RoadTripService()
-
- import time
-
- # Test address for geocoding
- test_address = "Disneyland, Anaheim, CA"
-
- print(f"Testing cache performance with: {test_address}")
-
- # First request (cache miss)
- print("\n1️⃣ First request (cache miss):")
- start_time = time.time()
- coords1 = service.geocode_address(test_address)
- first_duration = time.time() - start_time
-
- if coords1:
- print(f" ✅ Result: {coords1.latitude:.4f}, {coords1.longitude:.4f}")
- print(f" ⏱️ Duration: {first_duration:.2f} seconds")
-
- # Second request (cache hit)
- print("\n2️⃣ Second request (cache hit):")
- start_time = time.time()
- coords2 = service.geocode_address(test_address)
- second_duration = time.time() - start_time
-
- if coords2:
- print(f" ✅ Result: {coords2.latitude:.4f}, {coords2.longitude:.4f}")
- print(f" ⏱️ Duration: {second_duration:.2f} seconds")
-
- if first_duration > second_duration:
- speedup = first_duration / second_duration
- print(f" 🚀 Cache speedup: {speedup:.1f}x faster")
-
- if (
- coords1.latitude == coords2.latitude
- and coords1.longitude == coords2.longitude
- ):
- print(" ✅ Results identical (cache working)")
-
-
-def main():
- """
- Run all demonstration scenarios.
- """
- print("🎢 ThrillWiki Road Trip Service Demo")
- print("This demo shows practical usage scenarios for the OSM Road Trip Service")
-
- try:
- demo_florida_theme_park_trip()
- demo_cross_country_road_trip()
- demo_database_integration()
- demo_geocoding_fallback()
- demo_cache_performance()
-
- print("\n" + "=" * 50)
- print("🎉 Demo completed successfully!")
- print("\nThe Road Trip Service is ready for integration into ThrillWiki!")
- print("\nKey Features Demonstrated:")
- print("✅ Geocoding theme park addresses")
- print("✅ Route calculation with distance/time")
- print("✅ Multi-park trip optimization")
- print("✅ Database integration with Park models")
- print("✅ Caching for performance")
- print("✅ Rate limiting for OSM compliance")
- print("✅ Error handling and fallbacks")
-
- except Exception as e:
- print(f"\n❌ Demo failed with error: {e}")
- import traceback
-
- traceback.print_exc()
-
-
-if __name__ == "__main__":
- main()
diff --git a/drf_spectacular_analysis.md b/drf_spectacular_analysis.md
deleted file mode 100644
index 3671e1e7..00000000
--- a/drf_spectacular_analysis.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# DRF Spectacular Analysis - Working Classes and Status
-
-## Error Summary
-- **Error**: `AttributeError: type object 'tuple' has no attribute '_fields'`
-- **Location**: `drf_spectacular/plumbing.py:1353` in `resolve_type_hint` function
-- **Root Cause**: A SerializerMethodField somewhere has a return type annotation using plain `tuple` instead of `NamedTuple` or proper typing, and lacks `@extend_schema_field` decorator
-
-## Preprocessing Hook Status
-✅ **WORKING** - Successfully excluding problematic views:
-- EntityNotFoundView
-- EntityFuzzySearchView
-- QuickEntitySuggestionView
-- SendEmailView
-- MapCacheAPIView
-
-## Known Working Serializer Files (with @extend_schema_field decorators)
-
-### ✅ backend/apps/api/v1/serializers_rankings.py
-**Status**: FIXED - Added 6 missing decorators
-- `get_total_rides()` → `@extend_schema_field(serializers.IntegerField())`
-- `get_total_parks()` → `@extend_schema_field(serializers.IntegerField())`
-- `get_total_companies()` → `@extend_schema_field(serializers.IntegerField())`
-- `get_average_rating()` → `@extend_schema_field(serializers.FloatField())`
-- `get_total_reviews()` → `@extend_schema_field(serializers.IntegerField())`
-- `get_recent_activity()` → `@extend_schema_field(serializers.ListField(child=serializers.DictField()))`
-
-### ✅ backend/apps/api/v1/accounts/serializers.py
-**Status**: FIXED - Added 1 missing decorator
-- `get_full_name()` → `@extend_schema_field(serializers.CharField())`
-
-### ✅ backend/apps/api/v1/serializers.py
-**Status**: VERIFIED - All SerializerMethodFields have proper decorators
-- Multiple get_* methods with proper @extend_schema_field decorators
-
-## Files Still Needing Analysis
-
-### 🔍 backend/apps/api/v1/rides/serializers.py
-**Status**: NEEDS VERIFICATION
-- Contains SerializerMethodField usage
-- May have missing @extend_schema_field decorators
-
-### 🔍 backend/apps/api/v1/parks/serializers.py
-**Status**: NEEDS VERIFICATION
-- Contains SerializerMethodField usage
-- May have missing @extend_schema_field decorators
-
-### 🔍 backend/apps/api/v1/views/
-**Status**: NEEDS VERIFICATION
-- Multiple view files with potential serializer usage
-- May contain inline serializers or method fields
-
-### 🔍 backend/apps/api/v1/history/
-**Status**: NEEDS VERIFICATION
-- History-related serializers
-- May have complex return types
-
-### 🔍 backend/apps/api/v1/media/
-**Status**: NEEDS VERIFICATION
-- Media-related serializers
-- May have file/image field serializers
-
-## Search Results Summary
-
-### SerializerMethodField Usage Found
-- **Total found**: 79 SerializerMethodField method definitions across codebase
-- **Return type annotations found**: 45 get_* methods with return types
-- **All verified**: Have proper @extend_schema_field decorators
-
-### Tuple Type Hints Search
-- **Plain tuple usage**: Only 1 found in runtime check (not type hint)
-- **Typing imports**: No Tuple imports found in initial search
-- **Return type annotations with tuple**: 0 found
-
-## Systematic Analysis Plan
-
-### Phase 1: Complete File Inventory
-1. List all serializer files in backend/apps/api/v1/
-2. Identify files with SerializerMethodField usage
-3. Check each for missing @extend_schema_field decorators
-
-### Phase 2: Deep Type Hint Analysis
-1. Search for any typing imports (Tuple, Union, Optional, etc.)
-2. Look for return type annotations on get_* methods
-3. Identify any complex return types that might confuse drf-spectacular
-
-### Phase 3: View-Level Analysis
-1. Check for inline serializers in views
-2. Look for dynamic serializer creation
-3. Verify all response serializers are properly defined
-
-## Current Hypothesis
-The error persists despite fixing obvious missing decorators, suggesting:
-1. **Hidden SerializerMethodField**: A field without obvious naming pattern
-2. **Dynamic serializer**: Created at runtime without proper type hints
-3. **Third-party serializer**: From installed package (dj-rest-auth, etc.)
-4. **Complex nested type**: Union, Optional, or other typing construct with tuple
-
-## Next Steps
-1. Create complete inventory of all serializer files
-2. Systematically check each file for SerializerMethodField usage
-3. Focus on files that haven't been verified yet
-4. Look for non-standard method naming patterns
-5. Check third-party package serializers if needed
-
-## Files Excluded by Preprocessing Hook
-These views are successfully excluded and not causing the error:
-- `/api/v1/email/send/` (SendEmailView)
-- `/api/v1/core/entities/search/` (EntityFuzzySearchView)
-- `/api/v1/core/entities/not-found/` (EntityNotFoundView)
-- `/api/v1/core/entities/suggestions/` (QuickEntitySuggestionView)
-- `/api/v1/maps/cache/` (MapCacheAPIView)
-- `/api/v1/maps/cache/invalidate/` (MapCacheAPIView)
-
-## Warning Messages (Non-blocking)
-These warnings appear but don't cause the error:
-- dj-rest-auth deprecation warnings
-- Auth view schema resolution warnings
-- Health view schema warnings
-- History view parameter warnings
-
-The tuple error occurs after all warnings, indicating it's in a different serializer.
\ No newline at end of file
diff --git a/fresh-project-status-2025-01-05.md b/fresh-project-status-2025-01-05.md
deleted file mode 100644
index 3062794b..00000000
--- a/fresh-project-status-2025-01-05.md
+++ /dev/null
@@ -1,243 +0,0 @@
-# Fresh Project Status - August 23, 2025
-
-**Analysis Date:** August 23, 2025
-**Analysis Method:** Direct observation of current project state only
-**Analyst:** Claude (Fresh perspective, no prior documentation consulted)
-
-## Project Overview
-
-### Project Identity
-- **Name:** ThrillWiki Django (No React)
-- **Type:** Django web application for theme park and ride information
-- **Location:** `/Users/talor/thrillwiki_django_no_react`
-
-### Current Running State
-- **Development Server:** Uses sophisticated startup script at `./scripts/dev_server.sh`
-- **Command Used:** `lsof -ti :8000 | xargs kill -9; find . -type d -name "__pycache__" -exec rm -r {} +; ./scripts/dev_server.sh`
-- **Package Manager:** UV (Ultraviolet Python package manager) - pyproject.toml based
-- **CSS Framework:** Tailwind CSS with CLI integration
-- **Settings Module:** Auto-detecting with `config.django.local` for development
-
-## Technical Stack Analysis
-
-### Backend Framework
-- **Django:** 5.1.6 (Updated from 5.0)
-- **Database:** PostgreSQL with PostGIS (GeoDjango features)
-- **History Tracking:** django-pghistory 3.5.2 for comprehensive model change tracking
-- **Package Management:** UV with pyproject.toml (modern Python dependency management)
-- **Python Version:** Requires Python >=3.13
-
-### Frontend Approach
-- **No React:** Project explicitly excludes React (per directory name)
-- **Tailwind CSS:** Version 4.0.1 with CLI integration
-- **HTMX:** Version 1.22.0 for dynamic interactions
-- **Autocomplete:** django-htmx-autocomplete for search functionality
-
-### Key Libraries & Versions (Updated)
-- **django-pghistory:** 3.5.2 - PostgreSQL-based model history tracking
-- **djangorestframework:** 3.15.2 - API framework
-- **django-cors-headers:** 4.7.0 - CORS handling
-- **django-allauth:** 65.4.1 - Authentication system
-- **django-htmx:** 1.22.0 - HTMX integration
-- **drf-spectacular:** 0.27.0 - OpenAPI documentation
-- **django-silk:** 5.0.0 - Performance profiling
-- **django-debug-toolbar:** 4.0.0 - Development debugging
-
-## Current Entity Architecture
-
-### Core Business Entities
-
-#### 1. Parks (`parks/` app)
-- **Purpose:** Theme parks and amusement venues
-- **Models:** Park, ParkArea, ParkLocation, ParkReview, Company (aliased as Operator), CompanyHeadquarters
-- **Key Features:**
- - Advanced location integration with GeoDjango
- - Comprehensive filtering and search
- - Road trip planning integration
- - Performance-optimized querysets
-- **Status:** Fully mature implementation with extensive views and API endpoints
-
-#### 2. Rides (`rides/` app)
-- **Purpose:** Individual ride installations at parks
-- **Models:** Ride, RideModel, RollerCoasterStats, RideLocation, RideReview, Company (aliased as Manufacturer)
-- **Key Features:**
- - Detailed roller coaster statistics
- - Category-based organization
- - Location tracking
- - Review system integration
-- **Status:** Comprehensive implementation with specialized coaster data
-
-#### 3. Company Entities (Within Apps)
-- **Parks Company:** Aliased as `Operator` for park operation companies
-- **Rides Company:** Aliased as `Manufacturer` for ride manufacturing companies
-- **Architecture:** Uses model aliases rather than separate apps for clarity
-- **Status:** Implemented within existing apps with clear semantic naming
-
-### Supporting Systems
-
-#### 4. Accounts (`accounts/` app)
-- **Purpose:** User management and authentication
-- **Features:** Custom user model, social authentication, profile management
-- **Status:** Complete with allauth integration
-
-#### 5. Location (`location/` app)
-- **Purpose:** Geographic data and mapping services
-- **Features:** GeoDjango integration, geocoding, location search
-- **Status:** Integrated with parks and rides for location tracking
-
-#### 6. Media (`media/` app)
-- **Purpose:** File and photo management
-- **Features:** Organized media storage, image handling with EXIF support
-- **Status:** Comprehensive media management system
-
-#### 7. Core (`core/` app)
-- **Purpose:** Shared functionality, middleware, and utilities
-- **Features:** Custom middleware, health checks, performance monitoring
-- **Status:** Extensive core functionality with monitoring tools
-
-#### 8. Moderation (`moderation/` app)
-- **Purpose:** Content moderation and administration
-- **Features:** Moderation workflows, admin tools
-- **Status:** Integrated moderation system
-
-#### 9. Email Service (`email_service/` app)
-- **Purpose:** Email handling and notifications
-- **Features:** Custom email backends, notification system
-- **Status:** Complete email service implementation
-
-## Current Configuration Architecture
-
-### Settings Structure
-- **Base Settings:** `config/django/base.py` - comprehensive base configuration
-- **Local Settings:** `config/django/local.py` - development-optimized settings
-- **Production Settings:** `config/django/production.py` - production configuration
-- **Auto-Detection:** Smart environment detection in `manage.py`
-
-### Development Tools Integration
-- **Silk Profiler:** Advanced performance profiling with SQL query analysis
-- **Debug Toolbar:** Comprehensive debugging information
-- **NPlusOne Detection:** Automatic N+1 query detection and warnings
-- **Performance Middleware:** Custom performance monitoring
-- **Health Checks:** Multi-layered health check system
-
-### Database & Cache Configuration
-- **Database:** PostgreSQL with PostGIS for geographic features
-- **Cache:** Redis for production, locmem for development
-- **Session Storage:** Redis-backed sessions for performance
-- **Query Optimization:** Extensive use of select_related and prefetch_related
-
-## Implementation Status Analysis
-
-### Completed Features
-- **Models:** Fully implemented with history tracking for all core entities
-- **Admin Interface:** Comprehensive admin customization with geographic support
-- **API:** Complete REST API with OpenAPI documentation
-- **Templates:** Sophisticated template system with HTMX integration
-- **Search:** Advanced search with autocomplete and filtering
-- **Location Services:** Full GeoDjango integration with mapping
-- **Authentication:** Complete user management with social auth
-- **Performance:** Advanced monitoring and optimization tools
-
-### Architecture Patterns
-- **Service Layer:** Comprehensive service classes for business logic
-- **Manager/QuerySet Pattern:** Optimized database queries with custom managers
-- **Selector Pattern:** Clean separation of data access logic
-- **History Tracking:** Automatic change auditing for all major entities
-- **Slug Management:** Intelligent URL-friendly identifiers with history
-
-### Advanced Features
-- **Road Trip Planning:** Sophisticated route planning and optimization
-- **Performance Monitoring:** Real-time performance tracking and alerting
-- **Health Checks:** Multi-tier health monitoring system
-- **API Documentation:** Auto-generated OpenAPI 3.0 documentation
-- **Geographic Search:** Advanced location-based search and filtering
-
-## Development Workflow & Tooling
-
-### Modern Development Setup
-- **UV Package Management:** Fast, modern Python dependency management
-- **Auto-detecting Settings:** Intelligent environment detection
-- **Development Server Script:** Comprehensive startup automation with:
- - Port cleanup and cache clearing
- - Database migration checks
- - Static file collection
- - Tailwind CSS building
- - System health checks
- - Auto superuser creation
-
-### Code Quality Tools
-- **Black:** Code formatting (version 25.1.0)
-- **Flake8:** Linting (version 7.1.1)
-- **Pytest:** Testing framework with Django integration
-- **Coverage:** Code coverage analysis
-- **Type Hints:** Enhanced type checking with stubs
-
-### Performance & Monitoring
-- **Silk Integration:** SQL query profiling and performance analysis
-- **Debug Toolbar:** Development debugging with comprehensive panels
-- **Custom Middleware:** Performance tracking and query optimization
-- **Health Checks:** Database, cache, storage, and custom application checks
-
-## Current Development State
-
-### Project Maturity
-- **Architecture:** Highly sophisticated with clear separation of concerns
-- **Performance:** Production-ready with extensive optimization
-- **Testing:** Comprehensive test infrastructure
-- **Documentation:** Auto-generated API docs and extensive inline documentation
-- **Monitoring:** Enterprise-grade health and performance monitoring
-
-### Technical Sophistication
-- **Query Optimization:** Extensive use of select_related, prefetch_related, and custom querysets
-- **Caching Strategy:** Multi-tier caching with Redis integration
-- **Geographic Features:** Full PostGIS integration for spatial queries
-- **API Design:** RESTful APIs with comprehensive documentation
-- **Security:** Production-ready security configuration
-
-### Data Architecture Quality
-- **History Tracking:** Comprehensive audit trails for all changes
-- **Relationship Integrity:** Well-designed foreign key relationships
-- **Performance Optimization:** Database-level optimizations and indexing
-- **Geographic Integration:** Sophisticated location-based features
-- **Search Capabilities:** Advanced full-text search and filtering
-
-## Infrastructure & Deployment
-
-### Environment Configuration
-- **Environment Variables:** Comprehensive environment-based configuration
-- **Settings Modules:** Multiple environment-specific settings
-- **Security Configuration:** Production-ready security settings
-- **CORS Configuration:** Proper API access configuration
-
-### Media & Static Files
-- **Static Files:** Whitenoise integration for static file serving
-- **Media Management:** Organized media storage with automatic cleanup
-- **Image Processing:** EXIF metadata handling and image optimization
-
-## Architecture Quality Assessment
-
-### Major Strengths
-- **Production Readiness:** Enterprise-grade architecture with comprehensive monitoring
-- **Performance Optimization:** Sophisticated query optimization and caching strategies
-- **Developer Experience:** Excellent development tooling and automation
-- **Geographic Features:** Advanced PostGIS integration for location-based features
-- **API Design:** Well-documented RESTful APIs with OpenAPI integration
-- **History Tracking:** Comprehensive audit capabilities
-- **Modern Tooling:** UV package management, Tailwind CSS, HTMX integration
-
-### Technical Excellence
-- **Code Quality:** High-quality codebase with comprehensive testing
-- **Architecture Patterns:** Clean implementation of Django best practices
-- **Database Design:** Well-normalized schema with proper relationships
-- **Security:** Production-ready security configuration
-- **Monitoring:** Comprehensive health and performance monitoring
-
-### Current Focus Areas
-- **Continued Optimization:** Performance monitoring and query optimization
-- **Feature Enhancement:** Ongoing development of advanced features
-- **Geographic Expansion:** Enhanced location-based functionality
-- **API Evolution:** Continued API development and documentation
-
----
-
-**Note:** This analysis reflects the project state as of August 23, 2025, showing a significantly matured Django application with enterprise-grade architecture, comprehensive tooling, and production-ready features. The project has evolved from the early development stage described in January 2025 to a sophisticated, well-architected web application.
\ No newline at end of file
diff --git a/park_domain_analysis.md b/park_domain_analysis.md
deleted file mode 100644
index a51a4cca..00000000
--- a/park_domain_analysis.md
+++ /dev/null
@@ -1,397 +0,0 @@
-# ThrillWiki Park Domain Analysis
-
-## Executive Summary
-
-This document provides a complete inventory of all park-related models and their relationships across the ThrillWiki Django codebase. The analysis reveals that park-related functionality is currently distributed across three separate Django apps (`parks`, `operators`, and `property_owners`) that are always used together but artificially separated.
-
-## Current Architecture Overview
-
-### Apps Structure
-- **parks/** - Core park and park area models
-- **operators/** - Companies that operate theme parks
-- **property_owners/** - Companies that own park property
-- **companies/** - Empty models directory (no active models found)
-
-## Model Inventory
-
-### Parks App Models
-
-#### Park Model (`parks/models.py`)
-**Location**: `parks.models.Park`
-**Inheritance**: `TrackedModel` (provides history tracking)
-**Decorators**: `@pghistory.track()`
-
-**Fields**:
-- `name` - CharField(max_length=255)
-- `slug` - SlugField(max_length=255, unique=True)
-- `description` - TextField(blank=True)
-- `status` - CharField with choices: OPERATING, CLOSED_TEMP, CLOSED_PERM, UNDER_CONSTRUCTION, DEMOLISHED, RELOCATED
-- `opening_date` - DateField(null=True, blank=True)
-- `closing_date` - DateField(null=True, blank=True)
-- `operating_season` - CharField(max_length=255, blank=True)
-- `size_acres` - DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
-- `website` - URLField(blank=True)
-- `average_rating` - DecimalField(max_digits=3, decimal_places=2, null=True, blank=True)
-- `ride_count` - IntegerField(null=True, blank=True)
-- `coaster_count` - IntegerField(null=True, blank=True)
-- `created_at` - DateTimeField(auto_now_add=True, null=True)
-- `updated_at` - DateTimeField(auto_now=True)
-
-**Relationships**:
-- `operator` - ForeignKey to Operator (SET_NULL, null=True, blank=True, related_name="parks")
-- `property_owner` - ForeignKey to PropertyOwner (SET_NULL, null=True, blank=True, related_name="owned_parks")
-- `location` - GenericRelation to Location (related_query_name='park')
-- `photos` - GenericRelation to Photo (related_query_name="park")
-- `areas` - Reverse relation from ParkArea
-- `rides` - Reverse relation from rides app
-
-**Custom Methods**:
-- `get_absolute_url()` - Returns park detail URL
-- `get_status_color()` - Returns Tailwind CSS classes for status display
-- `formatted_location` (property) - Returns formatted address string
-- `coordinates` (property) - Returns (lat, lon) tuple
-- `get_by_slug(slug)` (classmethod) - Handles current and historical slug lookup
-- `save()` - Custom save with slug generation and historical slug tracking
-
-**Meta Options**:
-- `ordering = ["name"]`
-
-#### ParkArea Model (`parks/models.py`)
-**Location**: `parks.models.ParkArea`
-**Inheritance**: `TrackedModel`
-**Decorators**: `@pghistory.track()`
-
-**Fields**:
-- `name` - CharField(max_length=255)
-- `slug` - SlugField(max_length=255)
-- `description` - TextField(blank=True)
-- `opening_date` - DateField(null=True, blank=True)
-- `closing_date` - DateField(null=True, blank=True)
-- `created_at` - DateTimeField(auto_now_add=True, null=True)
-- `updated_at` - DateTimeField(auto_now=True)
-
-**Relationships**:
-- `park` - ForeignKey to Park (CASCADE, related_name="areas")
-
-**Custom Methods**:
-- `get_absolute_url()` - Returns area detail URL
-- `get_by_slug(slug)` (classmethod) - Handles current and historical slug lookup
-- `save()` - Auto-generates slug from name
-
-**Meta Options**:
-- `ordering = ["name"]`
-- `unique_together = ["park", "slug"]`
-
-### Operators App Models
-
-#### Operator Model (`operators/models.py`)
-**Location**: `operators.models.Operator`
-**Inheritance**: `TrackedModel`
-**Decorators**: `@pghistory.track()`
-
-**Fields**:
-- `name` - CharField(max_length=255)
-- `slug` - SlugField(max_length=255, unique=True)
-- `description` - TextField(blank=True)
-- `website` - URLField(blank=True)
-- `founded_year` - PositiveIntegerField(blank=True, null=True)
-- `headquarters` - CharField(max_length=255, blank=True)
-- `parks_count` - IntegerField(default=0)
-- `rides_count` - IntegerField(default=0)
-
-**Custom Methods**:
-- `get_absolute_url()` - Returns operator detail URL
-- `get_by_slug(slug)` (classmethod) - Handles current and historical slug lookup
-- `save()` - Auto-generates slug if missing
-
-**Meta Options**:
-- `ordering = ['name']`
-- `verbose_name = 'Operator'`
-- `verbose_name_plural = 'Operators'`
-
-### Property Owners App Models
-
-#### PropertyOwner Model (`property_owners/models.py`)
-**Location**: `property_owners.models.PropertyOwner`
-**Inheritance**: `TrackedModel`
-**Decorators**: `@pghistory.track()`
-
-**Fields**:
-- `name` - CharField(max_length=255)
-- `slug` - SlugField(max_length=255, unique=True)
-- `description` - TextField(blank=True)
-- `website` - URLField(blank=True)
-
-**Custom Methods**:
-- `get_absolute_url()` - Returns property owner detail URL
-- `get_by_slug(slug)` (classmethod) - Handles current and historical slug lookup
-- `save()` - Auto-generates slug if missing
-
-**Meta Options**:
-- `ordering = ['name']`
-- `verbose_name = 'Property Owner'`
-- `verbose_name_plural = 'Property Owners'`
-
-### Related Models from Other Apps
-
-#### TrackedModel (`history_tracking/models.py`)
-**Base class for all park-related models**
-- Provides `created_at` and `updated_at` fields
-- Includes `get_history()` method for pghistory integration
-
-#### HistoricalSlug (`history_tracking/models.py`)
-**Tracks historical slugs for all models**
-- `content_type` - ForeignKey to ContentType
-- `object_id` - PositiveIntegerField
-- `slug` - SlugField(max_length=255)
-- `created_at` - DateTimeField
-- `user` - ForeignKey to User (optional)
-
-## Relationship Diagram
-
-```mermaid
-erDiagram
- Park ||--o{ ParkArea : contains
- Park }o--|| Operator : operated_by
- Park }o--o| PropertyOwner : owned_by
- Park ||--o{ Location : has_location
- Park ||--o{ Photo : has_photos
- Park ||--o{ Ride : contains
-
- Operator {
- int id PK
- string name
- string slug UK
- text description
- string website
- int founded_year
- string headquarters
- int parks_count
- int rides_count
- datetime created_at
- datetime updated_at
- }
-
- PropertyOwner {
- int id PK
- string name
- string slug UK
- text description
- string website
- datetime created_at
- datetime updated_at
- }
-
- Park {
- int id PK
- string name
- string slug UK
- text description
- string status
- date opening_date
- date closing_date
- string operating_season
- decimal size_acres
- string website
- decimal average_rating
- int ride_count
- int coaster_count
- int operator_id FK
- int property_owner_id FK
- datetime created_at
- datetime updated_at
- }
-
- ParkArea {
- int id PK
- string name
- string slug
- text description
- date opening_date
- date closing_date
- int park_id FK
- datetime created_at
- datetime updated_at
- }
-
- Location {
- int id PK
- int content_type_id FK
- int object_id
- string name
- string location_type
- decimal latitude
- decimal longitude
- string street_address
- string city
- string state
- string country
- string postal_code
- }
-
- Photo {
- int id PK
- int content_type_id FK
- int object_id
- string image
- string caption
- int uploaded_by_id FK
- }
-
- Ride {
- int id PK
- string name
- string slug
- text description
- string category
- string status
- int park_id FK
- int park_area_id FK
- int manufacturer_id FK
- int designer_id FK
- }
-```
-
-## Admin Configurations
-
-### Parks App Admin
-- **ParkAdmin**: List display includes location, status, operator, property_owner
-- **ParkAreaAdmin**: List display includes park relationship
-- Both use `prepopulated_fields` for slug generation
-- Both include `created_at` and `updated_at` as readonly fields
-
-### Operators App Admin
-- **OperatorAdmin**: Shows parks_count and rides_count (readonly)
-- Includes founded_year filter
-- Search includes name, description, headquarters
-
-### Property Owners App Admin
-- **PropertyOwnerAdmin**: Basic configuration
-- Search includes name and description
-- No special filters or readonly fields
-
-## URL Patterns and Views
-
-### Parks App URLs (`parks/urls.py`)
-- **List/Search**: `/` - ParkSearchView with autocomplete
-- **Create**: `/create/` - ParkCreateView
-- **Detail**: `//` - ParkDetailView with slug redirect support
-- **Update**: `//edit/` - ParkUpdateView
-- **Areas**: `//areas//` - ParkAreaDetailView
-- **HTMX Endpoints**: Various endpoints for dynamic content loading
-- **Park-specific ride categories**: Multiple URL patterns for different ride types
-
-### Operators App URLs (`operators/urls.py`)
-- **List**: `/` - OperatorListView
-- **Detail**: `//` - OperatorDetailView with slug redirect support
-
-### Property Owners App URLs (`property_owners/urls.py`)
-- **List**: `/` - PropertyOwnerListView
-- **Detail**: `//` - PropertyOwnerDetailView with slug redirect support
-
-## Template Usage Patterns
-
-### Template Structure
-- **parks/park_detail.html**: Comprehensive park display with operator/property owner links
-- **operators/operator_detail.html**: Shows operated parks with park links
-- **property_owners/property_owner_detail.html**: Shows owned properties with operator info
-
-### Key Template Features
-- Cross-linking between parks, operators, and property owners
-- Conditional display of property owner (only if different from operator)
-- Status badges with Tailwind CSS classes
-- Photo galleries and location maps
-- History tracking display
-
-## Shared Functionality Patterns
-
-### Slug Generation
-All models use consistent slug generation:
-- Auto-generated from name field in `save()` method
-- Uses Django's `slugify()` function
-- Historical slug tracking via `HistoricalSlug` model
-
-### History Tracking
-Implemented via two mechanisms:
-1. **pghistory**: Automatic tracking with `@pghistory.track()` decorator
-2. **Manual tracking**: `HistoricalSlug` model for slug changes
-3. **DiffMixin**: Provides `diff_against_previous()` method for change comparison
-
-### Slug Redirect Support
-All detail views use `SlugRedirectMixin` and implement `get_by_slug()` classmethod:
-- Checks current slug first
-- Falls back to pghistory events
-- Falls back to `HistoricalSlug` records
-- Returns tuple of (object, was_redirect_needed)
-
-### Base Classes
-- **TrackedModel**: Provides `created_at`, `updated_at`, and history integration
-- **SlugRedirectMixin**: Handles historical slug redirects in views
-
-## Key Findings
-
-### Strengths
-1. **Consistent patterns**: All models follow similar slug generation and history tracking patterns
-2. **Comprehensive history**: Both automatic (pghistory) and manual (HistoricalSlug) tracking
-3. **Good separation of concerns**: Clear distinction between operators and property owners
-4. **Rich relationships**: Proper foreign key relationships with appropriate related_names
-
-### Issues
-1. **Artificial separation**: Three apps that are always used together
-2. **Duplicated code**: Similar admin configurations and view patterns across apps
-3. **Complex imports**: Cross-app imports create coupling
-4. **Template redundancy**: Similar template patterns across apps
-
-### Entity Relationship Compliance
-The current implementation follows the specified entity relationship rules:
-- ✅ Parks have required Operator relationship
-- ✅ Parks have optional PropertyOwner relationship
-- ✅ No direct Company entity references
-- ✅ Proper foreign key relationships with null/blank settings
-
-## Consolidation Recommendations
-
-Based on the analysis, I recommend consolidating the three apps into a single `parks` app with the following structure:
-
-```
-parks/
-├── models/
-│ ├── __init__.py # Import all models here
-│ ├── park.py # Park, ParkArea models
-│ ├── operators.py # Operator model
-│ └── owners.py # PropertyOwner model
-├── admin/
-│ ├── __init__.py # Register all admin classes
-│ ├── park.py # Park and ParkArea admin
-│ ├── operators.py # Operator admin
-│ └── owners.py # PropertyOwner admin
-├── views/
-│ ├── __init__.py # Import all views
-│ ├── parks.py # Park and ParkArea views
-│ ├── operators.py # Operator views
-│ └── owners.py # PropertyOwner views
-├── templates/parks/
-│ ├── parks/ # Park templates
-│ ├── operators/ # Operator templates
-│ └── owners/ # Property owner templates
-└── urls.py # All URL patterns
-```
-
-### Benefits of Consolidation
-1. **Reduced complexity**: Single app to manage instead of three
-2. **Eliminated duplication**: Shared admin mixins, view base classes, and template components
-3. **Simplified imports**: No cross-app dependencies
-4. **Better cohesion**: Related functionality grouped together
-5. **Easier maintenance**: Single location for park domain logic
-
-### Migration Strategy
-1. Create new model structure within parks app
-2. Move existing models to new locations
-3. Update all imports and references
-4. Consolidate admin configurations
-5. Merge URL patterns
-6. Update template references
-7. Run Django migrations to reflect changes
-8. Remove empty apps
-
-This consolidation maintains all existing functionality while significantly improving code organization and maintainability.
\ No newline at end of file
diff --git a/parks_listing_comprehensive_documentation.md b/parks_listing_comprehensive_documentation.md
deleted file mode 100644
index 79cecabf..00000000
--- a/parks_listing_comprehensive_documentation.md
+++ /dev/null
@@ -1,313 +0,0 @@
-# Parks Listing Page - Comprehensive Documentation
-
-## Overview
-
-The parks listing page is the primary interface for browsing and discovering theme parks in ThrillWiki. It provides search, filtering, and listing capabilities with both grid and list view modes.
-
-## Current Architecture
-
-### Models
-
-#### Park Model (`parks/models/parks.py`)
-The core Park model contains these key fields:
-- **Basic Info**: `name`, `slug`, `description`, `status`
-- **Operations**: `opening_date`, `closing_date`, `operating_season`
-- **Metadata**: `size_acres`, `website`, `average_rating`
-- **Statistics**: `ride_count`, `coaster_count` (manual fields)
-- **Relationships**:
- - `operator` (ForeignKey to Company)
- - `property_owner` (ForeignKey to Company)
- - `photos` (GenericRelation)
- - `location` (OneToOneField via ParkLocation reverse relation)
-
-#### Park Status System
-The status system uses predefined choices with corresponding CSS classes:
-
-**Status Options:**
-- `OPERATING`: "Operating" - Green badge (`bg-green-100 text-green-800`)
-- `CLOSED_TEMP`: "Temporarily Closed" - Yellow badge (`bg-yellow-100 text-yellow-800`)
-- `CLOSED_PERM`: "Permanently Closed" - Red badge (`bg-red-100 text-red-800`)
-- `UNDER_CONSTRUCTION`: "Under Construction" - Blue badge (`bg-blue-100 text-blue-800`)
-- `DEMOLISHED`: "Demolished" - Gray badge (`bg-gray-100 text-gray-800`)
-- `RELOCATED`: "Relocated" - Purple badge (`bg-purple-100 text-purple-800`)
-
-**Status Badge Implementation:**
-```html
-
- {{ park.get_status_display }}
-
-```
-
-**CSS Classes:**
-```css
-.status-badge {
- @apply inline-flex items-center px-3 py-1 text-sm font-medium rounded-full;
-}
-
-.status-operating {
- @apply text-green-800 bg-green-100 dark:bg-green-700 dark:text-green-50;
-}
-
-.status-closed {
- @apply text-red-800 bg-red-100 dark:bg-red-700 dark:text-red-50;
-}
-
-.status-construction {
- @apply text-yellow-800 bg-yellow-100 dark:bg-yellow-600 dark:text-yellow-50;
-}
-```
-
-#### ParkLocation Model (`parks/models/location.py`)
-Handles geographic data with PostGIS support:
-- **Coordinates**: `point` (PointField with SRID 4326)
-- **Address**: `street_address`, `city`, `state`, `country`, `postal_code`
-- **Trip Planning**: `highway_exit`, `parking_notes`, `best_arrival_time`, `seasonal_notes`
-- **OSM Integration**: `osm_id`, `osm_type`
-
-### Views
-
-#### ParkListView (`parks/views.py:212-272`)
-Inherits from `HTMXFilterableMixin` and `ListView`:
-- **Template**: `parks/park_list.html` (full page) or `parks/partials/park_list_item.html` (HTMX)
-- **Pagination**: 20 items per page
-- **Filter Class**: `ParkFilter`
-- **Context**: Includes `view_mode`, `is_search`, `search_query`
-- **Error Handling**: Graceful degradation with error messages
-
-**Key Methods:**
-- `get_template_names()`: Returns different templates for HTMX requests
-- `get_view_mode()`: Handles grid/list toggle
-- `get_queryset()`: Uses `get_base_park_queryset()` with filters applied
-- `get_context_data()`: Adds view mode and search context
-
-#### Supporting View Functions
-- `add_park_button()`: Returns add park button partial
-- `park_actions()`: Returns park actions partial
-- `get_park_areas()`: Dynamic area options for select elements
-- `location_search()`: OpenStreetMap Nominatim API integration
-- `reverse_geocode()`: Coordinate to address conversion
-- `search_parks()`: HTMX search endpoint
-
-### Templates
-
-#### Main Template (`parks/templates/parks/park_list.html`)
-Extends `search/layouts/filtered_list.html` with these sections:
-
-**List Actions Block:**
-- Page title ("Parks")
-- View mode toggle (Grid/List) with HTMX
-- Add Park button (authenticated users only)
-
-**Filter Section Block:**
-- Search autocomplete with Alpine.js
-- Filter form with HTMX updates
-- Loading indicators and accessibility features
-
-**Results List Block:**
-- Contains park results container
-- Includes `park_list_item.html` partial
-
-#### Park List Item Partial (`parks/templates/parks/partials/park_list_item.html`)
-Displays individual park cards:
-- **Grid Layout**: 3-column responsive grid (`md:grid-cols-2 lg:grid-cols-3`)
-- **Card Design**: White background, shadow, hover transform
-- **Content**: Park name (linked), status badge, operator link
-- **Empty State**: Helpful message with option to add parks
-- **Error Handling**: Error display with icon
-
-### Filtering System
-
-#### ParkFilter (`parks/filters.py`)
-Comprehensive filter system with validation:
-
-**Core Filters:**
-- `search`: Multi-field search (name, description, location fields)
-- `status`: Operating status dropdown
-- `operator`: Operating company selector
-- `has_operator`: Boolean filter for operator presence
-
-**Numeric Filters:**
-- `min_rides`: Minimum ride count with validation
-- `min_coasters`: Minimum coaster count with validation
-- `min_size`: Minimum size in acres with validation
-
-**Date Filters:**
-- `opening_date`: Date range filter
-
-**Location Filters:**
-- `location_search`: Search by city, state, country, address
-- `near_location`: Proximity search with geocoding
-- `radius_km`: Search radius (used with near_location)
-- `country_filter`: Country-specific filtering
-- `state_filter`: State/region filtering
-
-**Advanced Features:**
-- Custom `qs` property ensures base queryset with annotations
-- Geocoding integration with OpenStreetMap Nominatim
-- Distance calculations with PostGIS
-- Input validation with custom validators
-
-#### Base Queryset (`parks/querysets.py`)
-Optimized query with:
-- **Relationships**: `select_related('operator', 'property_owner', 'location')`
-- **Prefetches**: `photos`, `rides`
-- **Annotations**:
- - `current_ride_count`: Live count from related rides
- - `current_coaster_count`: Live count of roller coasters
-- **Ordering**: Alphabetical by name
-
-### Forms
-
-#### ParkForm (`parks/forms.py:54-312`)
-Comprehensive form for park creation/editing:
-- **Model Fields**: All Park model fields
-- **Location Fields**: Separate fields for coordinates and address
-- **Widgets**: Tailwind CSS styled with dark mode support
-- **Validation**: Coordinate range validation and precision handling
-- **Location Integration**: Automatic ParkLocation creation/update
-
-#### ParkAutocomplete (`parks/forms.py:11-38`)
-Search autocomplete functionality:
-- **Search Attributes**: Park name matching
-- **Related Data**: Includes operator and owner information
-- **Formatting**: Status and location display in results
-
-### Styling & Design
-
-#### Theme System
-Based on Tailwind CSS v4 with custom design tokens:
-- **Primary Color**: `#4f46e5` (Vibrant indigo)
-- **Secondary Color**: `#e11d48` (Vibrant rose)
-- **Accent Color**: `#8b5cf6`
-- **Font**: Poppins sans-serif
-- **Dark Mode**: Class-based toggle support
-
-#### Card Design Pattern
-Consistent across the application:
-```css
-.card {
- @apply p-6 bg-white border rounded-lg shadow-lg dark:bg-gray-800 border-gray-200/50 dark:border-gray-700/50;
-}
-
-.card-hover {
- @apply transition-transform transform hover:-translate-y-1;
-}
-```
-
-#### Grid System
-Adaptive grid with responsive breakpoints:
-```css
-.grid-cards {
- @apply grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3;
-}
-
-.grid-adaptive {
- @apply grid gap-6;
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
-}
-```
-
-#### Status Badges
-Semantic color coding with dark mode support:
-- Consistent padding: `px-3 py-1`
-- Typography: `text-sm font-medium`
-- Shape: `rounded-full`
-- Colors: Contextual based on status type
-
-### JavaScript Integration
-
-#### HTMX Features
-- **Dynamic Loading**: Park list updates without page refresh
-- **Search**: Real-time search with debouncing (300ms delay)
-- **Filters**: Form submission with URL state management
-- **View Modes**: Toggle between grid/list with state preservation
-- **Pagination**: Seamless page navigation
-- **Error Handling**: Custom error displays with HX-Trigger events
-
-#### Alpine.js Components
-- **Search Interface**: Query state management and escape key handling
-- **Filter Integration**: Form state synchronization
-- **Accessibility**: ARIA attributes for screen readers
-
-### API Integration
-
-#### OpenStreetMap Nominatim
-- **Search Endpoint**: Location autocomplete with 10 result limit
-- **Geocoding**: Address to coordinate conversion
-- **Reverse Geocoding**: Coordinate to address lookup
-- **Error Handling**: Graceful fallbacks for API failures
-- **Rate Limiting**: 5-second timeout for requests
-
-#### Location Utilities
-- **Coordinate Normalization**: Precision handling for lat/lng
-- **English Name Extraction**: Multi-language support
-- **Address Parsing**: Comprehensive address component handling
-
-### Performance Optimizations
-
-#### Database Queries
-- **Select Related**: Minimize N+1 queries for relationships
-- **Prefetch Related**: Efficient loading of many-to-many relations
-- **Annotations**: Database-level calculations for counts
-- **Distinct**: Prevent duplicate results from joins
-
-#### Frontend Performance
-- **HTMX**: Partial page updates reduce bandwidth
-- **Debouncing**: Search input optimization
-- **Lazy Loading**: Progressive content loading
-- **Caching**: Template fragment caching where appropriate
-
-### Accessibility Features
-
-#### Screen Reader Support
-- **Semantic HTML**: Proper heading hierarchy and landmarks
-- **ARIA Labels**: Descriptive labels for interactive elements
-- **Focus Management**: Keyboard navigation support
-- **Loading States**: Screen reader announcements for dynamic content
-
-#### Keyboard Navigation
-- **Escape Key**: Closes search suggestions
-- **Tab Order**: Logical focus sequence
-- **Enter/Space**: Activates buttons and links
-
-### Error Handling
-
-#### Graceful Degradation
-- **Query Failures**: Empty queryset with error message
-- **Filter Errors**: Form validation with user feedback
-- **API Timeouts**: Fallback to basic functionality
-- **JavaScript Disabled**: Basic form submission still works
-
-#### User Feedback
-- **Loading Indicators**: Spinner animations during requests
-- **Error Messages**: Clear, actionable error descriptions
-- **Empty States**: Helpful guidance when no results found
-- **Success States**: Confirmation of actions taken
-
-## Current Strengths
-
-1. **Comprehensive Filtering**: Rich set of filter options for various use cases
-2. **Performance**: Optimized queries with proper relationships and annotations
-3. **User Experience**: Smooth HTMX interactions with instant feedback
-4. **Responsive Design**: Works well on all device sizes
-5. **Accessibility**: Good screen reader and keyboard support
-6. **Status System**: Clear, well-designed status indicators
-7. **Location Integration**: PostGIS-powered geographic capabilities
-8. **Search Experience**: Real-time search with autocomplete
-9. **Error Handling**: Graceful degradation and user feedback
-10. **Dark Mode**: Consistent theming across light/dark modes
-
-## Areas for Enhancement
-
-1. **Location Filtering**: Hierarchical location filtering (Country → State → City)
-2. **Advanced Search**: More sophisticated search capabilities
-3. **Map Integration**: Geographic visualization of results
-4. **Bulk Operations**: Multi-select actions for parks
-5. **Export Functionality**: CSV/JSON export of filtered results
-6. **Bookmarking**: Save filter combinations
-7. **Recent Searches**: Search history functionality
-8. **Advanced Sorting**: Multiple sort criteria
-9. **Preview Mode**: Quick preview without navigation
-10. **Comparison Tools**: Side-by-side park comparisons
-
-This documentation provides a comprehensive foundation for understanding the current parks listing implementation and serves as a baseline for planning improvements while preserving the existing strengths and design patterns.
diff --git a/parks_listing_improvement_plan.md b/parks_listing_improvement_plan.md
deleted file mode 100644
index 648301e7..00000000
--- a/parks_listing_improvement_plan.md
+++ /dev/null
@@ -1,700 +0,0 @@
-# Parks Listing Page - Comprehensive Improvement Plan
-
-## Executive Summary
-
-This document outlines a comprehensive improvement plan for the ThrillWiki parks listing page, focusing on enhanced location-based filtering with a hierarchical Country → State → City approach, while preserving the current design theme, park status implementation, and user experience patterns.
-
-## Primary Focus: Hierarchical Location Filtering
-
-### 1. Enhanced Location Model Structure
-
-#### 1.1 Country-First Approach
-**Objective**: Implement a cascading location filter starting with countries, then drilling down to states/regions, and finally cities.
-
-**Current State**:
-- Flat location fields in `ParkLocation` model
-- Basic country/state/city filters without hierarchy
-- No standardized country/region data
-
-**Proposed Enhancement**:
-```python
-# New model structure to support hierarchical filtering
-class Country(models.Model):
- name = models.CharField(max_length=100, unique=True)
- code = models.CharField(max_length=3, unique=True) # ISO 3166-1 alpha-3
- region = models.CharField(max_length=100) # e.g., "Europe", "North America"
- park_count = models.IntegerField(default=0) # Denormalized for performance
-
- class Meta:
- verbose_name_plural = "Countries"
- ordering = ['name']
-
-class State(models.Model):
- name = models.CharField(max_length=100)
- country = models.ForeignKey(Country, on_delete=models.CASCADE, related_name='states')
- code = models.CharField(max_length=10, blank=True) # State/province code
- park_count = models.IntegerField(default=0)
-
- class Meta:
- unique_together = [['name', 'country']]
- ordering = ['name']
-
-class City(models.Model):
- name = models.CharField(max_length=100)
- state = models.ForeignKey(State, on_delete=models.CASCADE, related_name='cities')
- park_count = models.IntegerField(default=0)
-
- class Meta:
- verbose_name_plural = "Cities"
- unique_together = [['name', 'state']]
- ordering = ['name']
-
-# Enhanced ParkLocation model
-class ParkLocation(models.Model):
- park = models.OneToOneField('parks.Park', on_delete=models.CASCADE, related_name='location')
-
- # Hierarchical location references
- country = models.ForeignKey(Country, on_delete=models.PROTECT)
- state = models.ForeignKey(State, on_delete=models.PROTECT, null=True, blank=True)
- city = models.ForeignKey(City, on_delete=models.PROTECT, null=True, blank=True)
-
- # Legacy fields maintained for compatibility
- country_legacy = models.CharField(max_length=100, blank=True)
- state_legacy = models.CharField(max_length=100, blank=True)
- city_legacy = models.CharField(max_length=100, blank=True)
-
- # Existing fields preserved
- point = models.PointField(srid=4326, null=True, blank=True)
- street_address = models.CharField(max_length=255, blank=True)
- postal_code = models.CharField(max_length=20, blank=True)
-
- # Trip planning fields (preserved)
- highway_exit = models.CharField(max_length=100, blank=True)
- parking_notes = models.TextField(blank=True)
- best_arrival_time = models.TimeField(null=True, blank=True)
- seasonal_notes = models.TextField(blank=True)
-
- # OSM integration (preserved)
- osm_id = models.BigIntegerField(null=True, blank=True)
- osm_type = models.CharField(max_length=10, blank=True)
-```
-
-#### 1.2 Data Migration Strategy
-**Migration Phase 1**: Add new fields alongside existing ones
-**Migration Phase 2**: Populate new hierarchical data from existing location data
-**Migration Phase 3**: Update forms and views to use new structure
-**Migration Phase 4**: Deprecate legacy fields (keep for backwards compatibility)
-
-### 2. Advanced Filtering Interface
-
-#### 2.1 Hierarchical Filter Components
-
-**Location Filter Widget**:
-```html
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-#### 2.2 Enhanced Filter Classes
-```python
-class AdvancedParkFilter(ParkFilter):
- # Hierarchical location filters
- location_country = ModelChoiceFilter(
- field_name='location__country',
- queryset=Country.objects.annotate(
- park_count=Count('states__cities__parklocation')
- ).filter(park_count__gt=0),
- empty_label='All Countries',
- label='Country'
- )
-
- location_state = ModelChoiceFilter(
- method='filter_location_state',
- queryset=State.objects.none(), # Will be populated dynamically
- empty_label='All States/Regions',
- label='State/Region'
- )
-
- location_city = ModelChoiceFilter(
- method='filter_location_city',
- queryset=City.objects.none(), # Will be populated dynamically
- empty_label='All Cities',
- label='City'
- )
-
- # Geographic region filters
- geographic_region = ChoiceFilter(
- method='filter_geographic_region',
- choices=[
- ('north_america', 'North America'),
- ('europe', 'Europe'),
- ('asia_pacific', 'Asia Pacific'),
- ('latin_america', 'Latin America'),
- ('middle_east_africa', 'Middle East & Africa'),
- ],
- empty_label='All Regions',
- label='Geographic Region'
- )
-
- def filter_location_state(self, queryset, name, value):
- if value:
- return queryset.filter(location__state=value)
- return queryset
-
- def filter_location_city(self, queryset, name, value):
- if value:
- return queryset.filter(location__city=value)
- return queryset
-
- def filter_geographic_region(self, queryset, name, value):
- region_mapping = {
- 'north_america': ['USA', 'Canada', 'Mexico'],
- 'europe': ['United Kingdom', 'Germany', 'France', 'Spain', 'Italy'],
- # ... more mappings
- }
- if value in region_mapping:
- countries = region_mapping[value]
- return queryset.filter(location__country__name__in=countries)
- return queryset
-```
-
-### 3. Enhanced User Experience Features
-
-#### 3.1 Smart Location Suggestions
-```javascript
-// Enhanced location autocomplete with regional intelligence
-class LocationSuggestionsSystem {
- constructor() {
- this.userLocation = null;
- this.searchHistory = [];
- this.preferredRegions = [];
- }
-
- // Prioritize suggestions based on user context
- prioritizeSuggestions(suggestions) {
- return suggestions.sort((a, b) => {
- // Prioritize user's country/region
- if (this.isInPreferredRegion(a) && !this.isInPreferredRegion(b)) return -1;
- if (!this.isInPreferredRegion(a) && this.isInPreferredRegion(b)) return 1;
-
- // Then by park count
- return b.park_count - a.park_count;
- });
- }
-
- // Add breadcrumb navigation
- buildLocationBreadcrumb(country, state, city) {
- const breadcrumb = [];
- if (country) breadcrumb.push({type: 'country', name: country.name, id: country.id});
- if (state) breadcrumb.push({type: 'state', name: state.name, id: state.id});
- if (city) breadcrumb.push({type: 'city', name: city.name, id: city.id});
- return breadcrumb;
- }
-}
-```
-
-#### 3.2 Location Statistics Display
-```html
-
-
-
Browse by Location
-
-
- {% for country in top_countries %}
-
-
-
- {% endfor %}
-
-
-
-
-
-
-```
-
-### 4. Advanced Search Capabilities
-
-#### 4.1 Multi-Criteria Search
-```python
-class AdvancedSearchForm(forms.Form):
- # Text search with field weighting
- query = forms.CharField(required=False, widget=forms.TextInput(attrs={
- 'placeholder': 'Search parks, locations, operators...',
- 'class': 'form-input'
- }))
-
- # Search scope selection
- search_fields = forms.MultipleChoiceField(
- choices=[
- ('name', 'Park Name'),
- ('description', 'Description'),
- ('location', 'Location'),
- ('operator', 'Operator'),
- ('rides', 'Rides'),
- ],
- widget=forms.CheckboxSelectMultiple,
- required=False,
- initial=['name', 'location', 'operator']
- )
-
- # Advanced location search
- location_radius = forms.IntegerField(
- required=False,
- min_value=1,
- max_value=500,
- initial=50,
- widget=forms.NumberInput(attrs={'class': 'form-input'})
- )
-
- location_center = forms.CharField(required=False, widget=forms.HiddenInput())
-
- # Saved search functionality
- save_search = forms.BooleanField(required=False, label='Save this search')
- search_name = forms.CharField(required=False, max_length=100)
-```
-
-#### 4.2 Search Result Enhancement
-```html
-
-
-
-
-
-
- {% if park.distance %}
- {{ park.distance|floatformat:1 }}km away
- {% endif %}
- {% if park.search_score %}
- {{ park.search_score|floatformat:0 }}% match
- {% endif %}
-
-
-```
-
-### 5. Map Integration Features
-
-#### 5.1 Location-Aware Map Views
-```html
-
-
-
-
-
-
-
-
-
-
-```
-
-#### 5.2 Geographic Clustering
-```python
-class ParkMapView(TemplateView):
- template_name = 'parks/park_map.html'
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
-
- # Get parks with location data
- parks = get_base_park_queryset().filter(
- location__point__isnull=False
- ).select_related('location__country', 'location__state', 'location__city')
-
- # Apply filters
- filter_form = AdvancedParkFilter(self.request.GET, queryset=parks)
- parks = filter_form.qs
-
- # Prepare map data with clustering
- map_data = []
- for park in parks:
- map_data.append({
- 'id': park.id,
- 'name': park.name,
- 'slug': park.slug,
- 'status': park.status,
- 'coordinates': [park.location.latitude, park.location.longitude],
- 'country': park.location.country.name,
- 'state': park.location.state.name if park.location.state else None,
- 'city': park.location.city.name if park.location.city else None,
- })
-
- context.update({
- 'parks_json': json.dumps(map_data),
- 'center_point': self._calculate_center_point(parks),
- 'filter_form': filter_form,
- })
-
- return context
-```
-
-### 6. Performance Optimizations
-
-#### 6.1 Caching Strategy
-```python
-from django.core.cache import cache
-from django.db.models.signals import post_save, post_delete
-
-class LocationCacheManager:
- CACHE_TIMEOUT = 3600 * 24 # 24 hours
-
- @staticmethod
- def get_country_stats():
- cache_key = 'park_countries_stats'
- stats = cache.get(cache_key)
-
- if stats is None:
- stats = Country.objects.annotate(
- park_count=Count('states__cities__parklocation__park')
- ).filter(park_count__gt=0).order_by('-park_count')
- cache.set(cache_key, stats, LocationCacheManager.CACHE_TIMEOUT)
-
- return stats
-
- @staticmethod
- def invalidate_location_cache():
- cache.delete_many([
- 'park_countries_stats',
- 'park_states_stats',
- 'park_cities_stats'
- ])
-
-# Signal handlers for cache invalidation
-@receiver([post_save, post_delete], sender=Park)
-def invalidate_park_location_cache(sender, **kwargs):
- LocationCacheManager.invalidate_location_cache()
-```
-
-#### 6.2 Database Indexing Strategy
-```python
-class ParkLocation(models.Model):
- # ... existing fields ...
-
- class Meta:
- indexes = [
- models.Index(fields=['country', 'state', 'city']),
- models.Index(fields=['country', 'park_count']),
- models.Index(fields=['state', 'park_count']),
- models.Index(fields=['city', 'park_count']),
- models.Index(fields=['point']), # Spatial index
- ]
-```
-
-### 7. Preserve Current Design Elements
-
-#### 7.1 Status Implementation (Preserved)
-The current park status system is well-designed and should be maintained exactly as-is:
-- Status badge colors and styling remain unchanged
-- `get_status_color()` method preserved
-- CSS classes for status badges maintained
-- Status filtering functionality kept identical
-
-#### 7.2 Design Theme Consistency
-All new components will follow existing design patterns:
-- Tailwind CSS v4 color palette (primary: `#4f46e5`, secondary: `#e11d48`, accent: `#8b5cf6`)
-- Poppins font family
-- Card design patterns with hover effects
-- Dark mode support for all new elements
-- Consistent spacing and typography scales
-
-#### 7.3 HTMX Integration Patterns
-New filtering components will use established HTMX patterns:
-- Form submissions with `hx-get` and `hx-target`
-- URL state management with `hx-push-url`
-- Loading indicators with `hx-indicator`
-- Error handling with `HX-Trigger` events
-
-### 8. Implementation Phases
-
-#### Phase 1: Foundation (Weeks 1-2)
-1. Create new location models (Country, State, City)
-2. Build data migration scripts
-3. Implement location cache management
-4. Add database indexes
-
-#### Phase 2: Backend Integration (Weeks 3-4)
-1. Update ParkLocation model with hierarchical references
-2. Enhance filtering system with new location filters
-3. Build dynamic location endpoint views
-4. Update querysets and managers
-
-#### Phase 3: Frontend Enhancement (Weeks 5-6)
-1. Create hierarchical location filter components
-2. Implement HTMX dynamic loading for states/cities
-3. Add location statistics display
-4. Enhance search result presentation
-
-#### Phase 4: Advanced Features (Weeks 7-8)
-1. Implement map integration
-2. Add geographic clustering
-3. Build advanced search capabilities
-4. Create location-aware suggestions
-
-#### Phase 5: Testing & Optimization (Weeks 9-10)
-1. Performance testing and optimization
-2. Accessibility testing and improvements
-3. Mobile responsiveness verification
-4. User experience testing
-
-### 9. Form Update Requirements
-
-Based on the model changes, the following forms will need updates:
-
-#### 9.1 ParkForm Updates
-```python
-class EnhancedParkForm(ParkForm):
- # Location selection fields
- location_country = forms.ModelChoiceField(
- queryset=Country.objects.all(),
- required=False,
- widget=forms.Select(attrs={'class': 'form-input'})
- )
-
- location_state = forms.ModelChoiceField(
- queryset=State.objects.none(),
- required=False,
- widget=forms.Select(attrs={'class': 'form-input'})
- )
-
- location_city = forms.ModelChoiceField(
- queryset=City.objects.none(),
- required=False,
- widget=forms.Select(attrs={'class': 'form-input'})
- )
-
- # Keep existing coordinate fields
- latitude = forms.DecimalField(...) # Unchanged
- longitude = forms.DecimalField(...) # Unchanged
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
-
- # Pre-populate hierarchical location fields if editing
- if self.instance and self.instance.pk:
- if hasattr(self.instance, 'location') and self.instance.location:
- location = self.instance.location
- if location.country:
- self.fields['location_country'].initial = location.country
- self.fields['location_state'].queryset = location.country.states.all()
- if location.state:
- self.fields['location_state'].initial = location.state
- self.fields['location_city'].queryset = location.state.cities.all()
- if location.city:
- self.fields['location_city'].initial = location.city
-
- def save(self, commit=True):
- park = super().save(commit=False)
-
- if commit:
- park.save()
-
- # Handle hierarchical location assignment
- country = self.cleaned_data.get('location_country')
- state = self.cleaned_data.get('location_state')
- city = self.cleaned_data.get('location_city')
-
- if country:
- location, created = ParkLocation.objects.get_or_create(park=park)
- location.country = country
- location.state = state
- location.city = city
-
- # Maintain legacy fields for compatibility
- location.country_legacy = country.name
- if state:
- location.state_legacy = state.name
- if city:
- location.city_legacy = city.name
-
- # Handle coordinates (existing logic preserved)
- if self.cleaned_data.get('latitude') and self.cleaned_data.get('longitude'):
- location.set_coordinates(
- float(self.cleaned_data['latitude']),
- float(self.cleaned_data['longitude'])
- )
-
- location.save()
-
- return park
-```
-
-#### 9.2 Filter Form Updates
-The `ParkFilter` class will be extended rather than replaced to maintain backward compatibility:
-
-```python
-class ParkFilter(FilterSet):
- # All existing filters preserved unchanged
- search = CharFilter(...) # Unchanged
- status = ChoiceFilter(...) # Unchanged
- # ... all other existing filters preserved ...
-
- # New hierarchical location filters added
- country = ModelChoiceFilter(
- field_name='location__country',
- queryset=Country.objects.annotate(
- park_count=Count('states__cities__parklocation')
- ).filter(park_count__gt=0).order_by('name'),
- empty_label='All Countries'
- )
-
- state = ModelChoiceFilter(
- method='filter_state',
- queryset=State.objects.none(),
- empty_label='All States/Regions'
- )
-
- city = ModelChoiceFilter(
- method='filter_city',
- queryset=City.objects.none(),
- empty_label='All Cities'
- )
-
- # Preserve all existing filter methods
- def filter_search(self, queryset, name, value):
- # Existing implementation unchanged
- pass
-
- # Add new filter methods
- def filter_state(self, queryset, name, value):
- if value:
- return queryset.filter(location__state=value)
- return queryset
-
- def filter_city(self, queryset, name, value):
- if value:
- return queryset.filter(location__city=value)
- return queryset
-```
-
-### 10. Migration Strategy
-
-#### 10.1 Data Migration Plan
-```python
-# Migration 0001: Create hierarchical location models
-class Migration(migrations.Migration):
- operations = [
- migrations.CreateModel('Country', ...),
- migrations.CreateModel('State', ...),
- migrations.CreateModel('City', ...),
- migrations.AddField('ParkLocation', 'country_ref', ...),
- migrations.AddField('ParkLocation', 'state_ref', ...),
- migrations.AddField('ParkLocation', 'city_ref', ...),
- ]
-
-# Migration 0002: Populate hierarchical data
-def populate_hierarchical_data(apps, schema_editor):
- ParkLocation = apps.get_model('parks', 'ParkLocation')
- Country = apps.get_model('parks', 'Country')
- State = apps.get_model('parks', 'State')
- City = apps.get_model('parks', 'City')
-
- # Create country entries from existing data
- countries = ParkLocation.objects.values_list('country', flat=True).distinct()
- for country_name in countries:
- if country_name:
- country, created = Country.objects.get_or_create(
- name=country_name,
- defaults={'code': get_country_code(country_name)}
- )
-
- # Similar logic for states and cities...
-
-class Migration(migrations.Migration):
- operations = [
- migrations.RunPython(populate_hierarchical_data, migrations.RunPython.noop),
- ]
-```
-
-## Success Metrics
-
-1. **User Experience Metrics**:
- - Reduced average time to find parks by location (target: -30%)
- - Increased filter usage rate (target: +50%)
- - Improved mobile usability scores
-
-2. **Performance Metrics**:
- - Maintained page load times under 2 seconds
- - Database query count reduction for location filters
- - Cached response hit rate above 85%
-
-3. **Feature Adoption**:
- - Hierarchical location filter usage above 40%
- - Map view engagement increase of 25%
- - Advanced search feature adoption of 15%
-
-## Conclusion
-
-This comprehensive improvement plan enhances the parks listing page with sophisticated location-based filtering while preserving all current design elements, status implementation, and user experience patterns. The hierarchical Country → State → City approach provides intuitive navigation, while advanced features like map integration and enhanced search capabilities create a more engaging user experience.
-
-The phased implementation approach ensures minimal disruption to current functionality while progressively enhancing capabilities. All improvements maintain backward compatibility and preserve the established design language that users have come to expect from ThrillWiki.
diff --git a/replit.md b/replit.md
deleted file mode 100644
index 08beef24..00000000
--- a/replit.md
+++ /dev/null
@@ -1,156 +0,0 @@
-# ThrillWiki - Theme Park & Ride Information Platform
-
-## Project Overview
-ThrillWiki is a comprehensive Django-based web application for theme park and ride information featuring REST APIs, spatial data support, and comprehensive content management. The platform serves as a database and information system for theme parks, rides, and related content.
-
-## Setup Status: ✅ SUCCESSFULLY RUNNING
-
-### Current State
-- **Django Server**: Running successfully on port 5000 with HTTP 200 responses
-- **Database**: PostgreSQL configured and all migrations applied
-- **GeoDjango**: Spatial libraries (GDAL/GEOS) properly configured for Nix environment
-- **CloudflareImages**: Avatar functionality preserved and working
-- **Dependencies**: All Python packages installed via UV
-- **Workflow**: Active ThrillWiki Server workflow configured
-- **Deployment**: Production-ready autoscale configuration set up
-
-### Technical Configuration
-
-#### Environment Setup
-- **Python**: 3.13 with UV package manager
-- **Database**: PostgreSQL (DATABASE_URL environment variable)
-- **Server**: Django development server on 0.0.0.0:5000
-- **Spatial Libraries**: GDAL and GEOS configured with correct Nix store paths
-- **Settings**: Local development configuration active
-
-#### Database Configuration
-```
-ENGINE: django.contrib.gis.db.backends.postgis
-HOST: PostgreSQL via DATABASE_URL environment variable
-Migrations: All applied successfully (including circular dependency resolution)
-```
-
-#### Key Packages Installed
-- Django 5.2.6
-- GeoDjango with PostGIS support
-- Django REST Framework
-- Django Allauth (authentication)
-- CloudflareImages Toolkit
-- Django PGHistory
-- Pillow (image processing)
-- And 30+ other dependencies
-
-### Architecture Overview
-
-#### Apps Structure
-- **accounts**: User management and authentication (with CloudflareImages avatars)
-- **parks**: Theme park information and management
-- **rides**: Ride data and categorization
-- **core**: Shared utilities and services (analytics, page views)
-- **api**: REST API endpoints (v1)
-
-#### Major Technical Achievements
-✅ **PostgreSQL Migration**: Successfully migrated from SQLite to PostgreSQL for proper pghistory support
-✅ **GeoDjango Configuration**: GDAL and GEOS libraries properly configured with Nix store paths
-✅ **Circular Dependency Resolution**: Resolved accounts/CloudflareImages dependency cycle using staged migrations
-✅ **Spatial Data Support**: GeoDjango Point objects and spatial functionality working correctly
-✅ **CloudflareImages Integration**: Avatar functionality preserved with proper foreign key relationships
-✅ **Django-Cotton Integration**: Modern component-based template system with EXACT visual preservation
-✅ **Cotton Components**: Standardized park_card.html and ride_card.html components with full feature support
-
-### API Endpoints Available
-- `/api/v1/parks/` - Parks API with spatial data
-- `/api/v1/rides/` - Rides API with manufacturer and stats
-- `/api/v1/maps/` - Maps API with spatial features
-- `/api/v1/accounts/` - User accounts and profiles
-- `/admin/` - Django admin interface
-
-### Recent Setup Work (September 2025)
-
-#### Database Migration Strategy
-1. **Initial Issue**: Circular dependency between `accounts.0001_initial` and `django_cloudflareimages_toolkit.0001_initial`
-2. **Solution**: Split migrations into stages:
- - `accounts.0001_initial`: User models without avatar field
- - `django_cloudflareimages_toolkit.0001_initial`: CloudflareImages setup
- - `accounts.0002_*`: Added avatar field after CloudflareImages ready
-3. **Result**: All migrations applied successfully, no dependency cycles
-
-#### Spatial Libraries Configuration
-- **GDAL_LIBRARY_PATH**: `/nix/store/*/lib/libgdal.so`
-- **GEOS_LIBRARY_PATH**: `/nix/store/*/lib/libgeos_c.so`
-- **Status**: Working correctly in all Django settings files
-
-#### CloudflareImages Integration
-- **Avatar Field**: Properly configured in UserProfile model
-- **Methods**: get_avatar_url() and get_avatar_variants() working
-- **Fallback**: Default letter-based avatars for users without uploaded images
-
-### User Preferences
-- **Environment**: Replit development environment
-- **Database**: PostgreSQL with spatial data support
-- **Port Requirements**: Frontend must run on port 5000
-- **Host Configuration**: Requires 0.0.0.0 binding for Replit access
-- **CloudflareImages**: Keep functionality preserved
-
-### Development
-
-The application is currently running successfully:
-```bash
-cd backend && uv run python manage.py runserver 0.0.0.0:5000
-```
-
-**Status Verification**:
-- Homepage: HTTP 200 responses
-- Database: Parks: 0, Rides: 0 (empty but functional)
-- Models: All importing and working correctly
-- Spatial: GeoDjango Point creation successful
-
-### Deployment Configuration
-
-**Production Ready**:
-- **Target**: Autoscale deployment (stateless scaling)
-- **WSGI Server**: Gunicorn configured for port 5000
-- **Build Process**: UV package installation with requirements.txt
-- **Database**: PostgreSQL with persistent external state
-- **Images**: CloudflareImages for media handling
-
-### Next Steps for Content Population
-1. **Admin Access**: Create superuser account
-2. **Content Import**: Add theme parks and rides data
-3. **API Testing**: Verify all endpoints with real data
-4. **Frontend**: Connect any frontend components if needed
-5. **Production**: Deploy using configured autoscale settings
-
-### Django-Cotton Integration (September 2025)
-
-#### Component-Based Template System
-- **Django-Cotton Package**: Successfully integrated for modern React/Vue-style component composition
-- **Visual Preservation**: EXACT visual output maintained - zero design changes during conversion
-- **Component Library**: Full UI component system with button, input, card, auth modal, and toast container
-- **Backward Compatibility**: Seamless conversion from Django include syntax to cotton components
-
-#### Cotton Components Created
-1. **Button Component** (``): Flexible button with variant support, HTMX/Alpine.js integration
-2. **Input Component** (``): Form inputs with validation states and accessibility features
-3. **Card Component** (``): Content containers with flexible slots and styling options
-4. **Auth Modal** (``): Complete authentication modal with social login integration
-5. **Toast Container** (``): Notification system with Alpine.js store integration
-
-#### Technical Implementation
-- **Zero Visual Regression**: Comprehensive testing confirmed identical HTML output and styling
-- **Functionality Preserved**: All HTMX interactions, Alpine.js behavior, and form handling maintained
-- **Template Conversion**: All legacy `{% include %}` statements converted to cotton component syntax
-- **Production Ready**: Full integration complete with working API endpoints and interactive features
-
-### Development Notes
-- Project follows Django best practices with proper app separation
-- Comprehensive admin interface configured
-- REST API with proper serialization and filtering
-- Authentication system ready with Django Allauth
-- Spatial data and CloudflareImages fully functional
-- Modern component-based template system with django-cotton
-- All major technical hurdles resolved
-
-## Project Status: ✅ SUCCESSFULLY IMPORTED AND RUNNING
-
-**ThrillWiki is now fully operational in the Replit environment with all features working!**
\ No newline at end of file
diff --git a/schema.yml b/schema.yml
deleted file mode 100644
index 49616023..00000000
--- a/schema.yml
+++ /dev/null
@@ -1,6690 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: Retrieve a specific item from the unified history timeline.
- summary: Get unified history timeline item
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types (park,ride)
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: 'Enable location clustering for high-density areas. Default:
- false'
- examples:
- EnableClustering:
- value: true
- summary: Enable clustering
- DisableClustering:
- value: false
- summary: Disable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound (-180 to 180). Must be greater than west
- bound.
- examples:
- Example:
- value: -82.6
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound (-90 to 90). Used with south, east, west
- to define geographic bounds.
- examples:
- Example:
- value: 41.5
- - in: query
- name: q
- schema:
- type: string
- description: Text search query. Searches park/ride names, cities, and states.
- examples:
- ParkName:
- value: Cedar Point
- summary: Park name
- RideType:
- value: roller coaster
- summary: Ride type
- Location:
- value: Ohio
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound (-90 to 90). Must be less than north
- bound.
- examples:
- Example:
- value: 41.4
- - in: query
- name: types
- schema:
- type: string
- description: 'Comma-separated location types to include. Valid values: ''park'',
- ''ride''. Default: ''park,ride'''
- examples:
- AllTypes:
- value: park,ride
- summary: All types
- ParksOnly:
- value: park
- summary: Parks only
- RidesOnly:
- value: ride
- summary: Rides only
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound (-180 to 180). Used with other bounds
- for geographic filtering.
- examples:
- Example:
- value: -82.8
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level (1-20). Higher values show more detail. Used for
- clustering decisions.
- examples:
- Example:
- value: 10
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MapLocationsResponse'
- examples:
- MapLocationsResponseExample:
- value:
- status: success
- data:
- locations:
- - id: 1
- type: park
- name: Cedar Point
- slug: cedar-point
- latitude: 41.4793
- longitude: -82.6833
- status: OPERATING
- clusters: []
- bounds:
- north: 41.5
- south: 41.4
- east: -82.6
- west: -82.8
- total_count: 1
- clustered: false
- summary: Example map locations response
- description: Response containing locations and optional clusters
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MapLocationDetail'
- examples:
- MapLocationDetailExample:
- value:
- id: 1
- type: park
- name: Cedar Point
- slug: cedar-point
- description: America's Roller Coast
- latitude: 41.4793
- longitude: -82.6833
- status: OPERATING
- location:
- street_address: 1 Cedar Point Dr
- city: Sandusky
- state: Ohio
- country: United States
- postal_code: '44870'
- formatted_address: 1 Cedar Point Dr, Sandusky, Ohio, 44870,
- United States
- stats:
- coaster_count: 17
- ride_count: 70
- average_rating: 4.5
- nearby_locations: []
- summary: Example map location detail response
- description: Detailed information about a specific location
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: page
- schema:
- type: integer
- description: Page number
- - in: query
- name: page_size
- schema:
- type: integer
- description: Results per page
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types (park,ride)
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MapSearchResponse'
- examples:
- MapSearchResponseExample:
- value:
- status: success
- data:
- results:
- - id: 1
- type: park
- name: Cedar Point
- slug: cedar-point
- latitude: 41.4793
- longitude: -82.6833
- query: cedar point
- total_count: 1
- page: 1
- page_size: 20
- summary: Example map search response
- description: Response containing search results
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/:
- get:
- operationId: v1_parks_retrieve
- description: List parks with basic filtering and pagination.
- summary: List parks with filtering and pagination
- parameters:
- - in: query
- name: country
- schema:
- type: string
- - in: query
- name: page
- schema:
- type: integer
- - in: query
- name: page_size
- schema:
- type: integer
- - in: query
- name: search
- schema:
- type: string
- - in: query
- name: state
- schema:
- type: string
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- post:
- operationId: v1_parks_create
- description: Create a new park.
- summary: Create a new park
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/parks/{park_pk}/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- parameters:
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- examples:
- ParkPhotoWithCloudflareImages:
- value:
- id: 456
- image: https://imagedelivery.net/account-hash/def456ghi789/public
- image_url: https://imagedelivery.net/account-hash/def456ghi789/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
- medium: https://imagedelivery.net/account-hash/def456ghi789/medium
- large: https://imagedelivery.net/account-hash/def456ghi789/large
- public: https://imagedelivery.net/account-hash/def456ghi789/public
- caption: Beautiful park entrance
- alt_text: Main entrance gate with decorative archway
- is_primary: true
- is_approved: true
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T11:00:00Z'
- uploaded_by_username: parkfan456
- file_size: 1536000
- dimensions:
- - 1600
- - 900
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete park photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/{park_pk}/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- examples:
- ParkPhotoWithCloudflareImages:
- value:
- id: 456
- image: https://imagedelivery.net/account-hash/def456ghi789/public
- image_url: https://imagedelivery.net/account-hash/def456ghi789/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
- medium: https://imagedelivery.net/account-hash/def456ghi789/medium
- large: https://imagedelivery.net/account-hash/def456ghi789/large
- public: https://imagedelivery.net/account-hash/def456ghi789/public
- caption: Beautiful park entrance
- alt_text: Main entrance gate with decorative archway
- is_primary: true
- is_approved: true
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T11:00:00Z'
- uploaded_by_username: parkfan456
- file_size: 1536000
- dimensions:
- - 1600
- - 900
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete park photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- examples:
- ParkPhotoWithCloudflareImages:
- value:
- id: 456
- image: https://imagedelivery.net/account-hash/def456ghi789/public
- image_url: https://imagedelivery.net/account-hash/def456ghi789/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
- medium: https://imagedelivery.net/account-hash/def456ghi789/medium
- large: https://imagedelivery.net/account-hash/def456ghi789/large
- public: https://imagedelivery.net/account-hash/def456ghi789/public
- caption: Beautiful park entrance
- alt_text: Main entrance gate with decorative archway
- is_primary: true
- is_approved: true
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T11:00:00Z'
- uploaded_by_username: parkfan456
- file_size: 1536000
- dimensions:
- - 1600
- - 900
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete park photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- examples:
- ParkPhotoWithCloudflareImages:
- value:
- id: 456
- image: https://imagedelivery.net/account-hash/def456ghi789/public
- image_url: https://imagedelivery.net/account-hash/def456ghi789/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
- medium: https://imagedelivery.net/account-hash/def456ghi789/medium
- large: https://imagedelivery.net/account-hash/def456ghi789/large
- public: https://imagedelivery.net/account-hash/def456ghi789/public
- caption: Beautiful park entrance
- alt_text: Main entrance gate with decorative archway
- is_primary: true
- is_approved: true
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T11:00:00Z'
- uploaded_by_username: parkfan456
- file_size: 1536000
- dimensions:
- - 1600
- - 900
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete park photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/{park_pk}/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- examples:
- ParkPhotoWithCloudflareImages:
- value:
- id: 456
- image: https://imagedelivery.net/account-hash/def456ghi789/public
- image_url: https://imagedelivery.net/account-hash/def456ghi789/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
- medium: https://imagedelivery.net/account-hash/def456ghi789/medium
- large: https://imagedelivery.net/account-hash/def456ghi789/large
- public: https://imagedelivery.net/account-hash/def456ghi789/public
- caption: Beautiful park entrance
- alt_text: Main entrance gate with decorative archway
- is_primary: true
- is_approved: true
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T11:00:00Z'
- uploaded_by_username: parkfan456
- file_size: 1536000
- dimensions:
- - 1600
- - 900
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete park photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/{park_pk}/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- examples:
- ParkPhotoWithCloudflareImages:
- value:
- id: 456
- image: https://imagedelivery.net/account-hash/def456ghi789/public
- image_url: https://imagedelivery.net/account-hash/def456ghi789/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
- medium: https://imagedelivery.net/account-hash/def456ghi789/medium
- large: https://imagedelivery.net/account-hash/def456ghi789/large
- public: https://imagedelivery.net/account-hash/def456ghi789/public
- caption: Beautiful park entrance
- alt_text: Main entrance gate with decorative archway
- is_primary: true
- is_approved: true
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T11:00:00Z'
- uploaded_by_username: parkfan456
- file_size: 1536000
- dimensions:
- - 1600
- - 900
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete park photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/{park_pk}/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple park photos (admin only)
- summary: Bulk approve/reject photos
- parameters:
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/{park_pk}/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park
- summary: Get park photo statistics
- parameters:
- - in: path
- name: park_pk
- schema:
- type: integer
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/{id}/:
- get:
- operationId: v1_parks_retrieve_2
- summary: Retrieve, update or delete a park
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- put:
- operationId: v1_parks_update
- summary: Retrieve, update or delete a park
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- patch:
- operationId: v1_parks_partial_update
- summary: Retrieve, update or delete a park
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- delete:
- operationId: v1_parks_destroy
- summary: Retrieve, update or delete a park
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/parks/filter-options/:
- get:
- operationId: v1_parks_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for parks
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/search-suggestions/:
- get:
- operationId: v1_parks_search_suggestions_retrieve
- summary: Search suggestions for park search box
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/parks/search/companies/:
- get:
- operationId: v1_parks_search_companies_retrieve
- summary: Search companies (operators/property owners) for autocomplete
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride
- summary: Get ride comparisons
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides with filtering and pagination
- parameters:
- - in: query
- name: page
- schema:
- type: integer
- - in: query
- name: page_size
- schema:
- type: integer
- - in: query
- name: park_slug
- schema:
- type: string
- - in: query
- name: search
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: Create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{ride_pk}/photos/:
- get:
- operationId: v1_rides_photos_list
- description: Retrieve a paginated list of ride photos with filtering capabilities.
- summary: List ride photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRidePhotoListOutputList'
- description: ''
- post:
- operationId: v1_rides_photos_create
- description: Upload a new photo for a ride. Requires authentication.
- summary: Upload ride photo
- parameters:
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- examples:
- RidePhotoWithCloudflareImages:
- value:
- id: 123
- image: https://imagedelivery.net/account-hash/abc123def456/public
- image_url: https://imagedelivery.net/account-hash/abc123def456/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
- medium: https://imagedelivery.net/account-hash/abc123def456/medium
- large: https://imagedelivery.net/account-hash/abc123def456/large
- public: https://imagedelivery.net/account-hash/abc123def456/public
- caption: Amazing roller coaster photo
- alt_text: Steel roller coaster with multiple inversions
- is_primary: true
- is_approved: true
- photo_type: exterior
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T10:00:00Z'
- uploaded_by_username: photographer123
- file_size: 2048576
- dimensions:
- - 1920
- - 1080
- ride_slug: steel-vengeance
- ride_name: Steel Vengeance
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete ride photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/{id}/:
- get:
- operationId: v1_rides_photos_retrieve
- description: Retrieve detailed information about a specific ride photo.
- summary: Get ride photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- examples:
- RidePhotoWithCloudflareImages:
- value:
- id: 123
- image: https://imagedelivery.net/account-hash/abc123def456/public
- image_url: https://imagedelivery.net/account-hash/abc123def456/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
- medium: https://imagedelivery.net/account-hash/abc123def456/medium
- large: https://imagedelivery.net/account-hash/abc123def456/large
- public: https://imagedelivery.net/account-hash/abc123def456/public
- caption: Amazing roller coaster photo
- alt_text: Steel roller coaster with multiple inversions
- is_primary: true
- is_approved: true
- photo_type: exterior
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T10:00:00Z'
- uploaded_by_username: photographer123
- file_size: 2048576
- dimensions:
- - 1920
- - 1080
- ride_slug: steel-vengeance
- ride_name: Steel Vengeance
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete ride photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_rides_photos_update
- description: Update ride photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update ride photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- examples:
- RidePhotoWithCloudflareImages:
- value:
- id: 123
- image: https://imagedelivery.net/account-hash/abc123def456/public
- image_url: https://imagedelivery.net/account-hash/abc123def456/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
- medium: https://imagedelivery.net/account-hash/abc123def456/medium
- large: https://imagedelivery.net/account-hash/abc123def456/large
- public: https://imagedelivery.net/account-hash/abc123def456/public
- caption: Amazing roller coaster photo
- alt_text: Steel roller coaster with multiple inversions
- is_primary: true
- is_approved: true
- photo_type: exterior
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T10:00:00Z'
- uploaded_by_username: photographer123
- file_size: 2048576
- dimensions:
- - 1920
- - 1080
- ride_slug: steel-vengeance
- ride_name: Steel Vengeance
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete ride photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_rides_photos_partial_update
- description: Partially update ride photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update ride photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- examples:
- RidePhotoWithCloudflareImages:
- value:
- id: 123
- image: https://imagedelivery.net/account-hash/abc123def456/public
- image_url: https://imagedelivery.net/account-hash/abc123def456/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
- medium: https://imagedelivery.net/account-hash/abc123def456/medium
- large: https://imagedelivery.net/account-hash/abc123def456/large
- public: https://imagedelivery.net/account-hash/abc123def456/public
- caption: Amazing roller coaster photo
- alt_text: Steel roller coaster with multiple inversions
- is_primary: true
- is_approved: true
- photo_type: exterior
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T10:00:00Z'
- uploaded_by_username: photographer123
- file_size: 2048576
- dimensions:
- - 1920
- - 1080
- ride_slug: steel-vengeance
- ride_name: Steel Vengeance
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete ride photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_rides_photos_destroy
- description: Delete a ride photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete ride photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/{id}/set_primary/:
- post:
- operationId: v1_rides_photos_set_primary_create
- description: Set this photo as the primary photo for the ride
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- examples:
- RidePhotoWithCloudflareImages:
- value:
- id: 123
- image: https://imagedelivery.net/account-hash/abc123def456/public
- image_url: https://imagedelivery.net/account-hash/abc123def456/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
- medium: https://imagedelivery.net/account-hash/abc123def456/medium
- large: https://imagedelivery.net/account-hash/abc123def456/large
- public: https://imagedelivery.net/account-hash/abc123def456/public
- caption: Amazing roller coaster photo
- alt_text: Steel roller coaster with multiple inversions
- is_primary: true
- is_approved: true
- photo_type: exterior
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T10:00:00Z'
- uploaded_by_username: photographer123
- file_size: 2048576
- dimensions:
- - 1920
- - 1080
- ride_slug: steel-vengeance
- ride_name: Steel Vengeance
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete ride photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_rides_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- examples:
- RidePhotoWithCloudflareImages:
- value:
- id: 123
- image: https://imagedelivery.net/account-hash/abc123def456/public
- image_url: https://imagedelivery.net/account-hash/abc123def456/public
- image_variants:
- thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
- medium: https://imagedelivery.net/account-hash/abc123def456/medium
- large: https://imagedelivery.net/account-hash/abc123def456/large
- public: https://imagedelivery.net/account-hash/abc123def456/public
- caption: Amazing roller coaster photo
- alt_text: Steel roller coaster with multiple inversions
- is_primary: true
- is_approved: true
- photo_type: exterior
- created_at: '2023-01-01T12:00:00Z'
- updated_at: '2023-01-01T12:00:00Z'
- date_taken: '2023-01-01T10:00:00Z'
- uploaded_by_username: photographer123
- file_size: 2048576
- dimensions:
- - 1920
- - 1080
- ride_slug: steel-vengeance
- ride_name: Steel Vengeance
- park_slug: cedar-point
- park_name: Cedar Point
- summary: Complete ride photo response
- description: Example response showing all fields including Cloudflare
- Images URLs and variants
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/bulk_approve/:
- post:
- operationId: v1_rides_photos_bulk_approve_create
- description: Bulk approve or reject multiple ride photos (admin only)
- summary: Bulk approve/reject photos
- parameters:
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/stats/:
- get:
- operationId: v1_rides_photos_stats_retrieve
- description: Get photo statistics for the ride
- summary: Get ride photo statistics
- parameters:
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/stats/:
- get:
- operationId: get_platform_stats
- description: "Returns comprehensive aggregate statistics about the ThrillWiki\
- \ platform.\n \n This endpoint provides detailed counts and\
- \ breakdowns of all major entities including:\n - Parks, rides, and\
- \ roller coasters\n - Companies (manufacturers, operators, designers,\
- \ property owners)\n - Photos and reviews\n - Ride categories\
- \ (roller coasters, dark rides, flat rides, etc.)\n - Status breakdowns\
- \ (operating, closed, under construction, etc.)\n \n Results\
- \ are cached for 5 minutes for optimal performance and automatically \n \
- \ invalidated when relevant data changes.\n \n **No authentication\
- \ required** - this is a public endpoint."
- summary: Get platform statistics
- tags:
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Stats'
- examples:
- SampleResponse:
- value:
- total_parks: 7
- total_rides: 10
- total_manufacturers: 6
- total_operators: 7
- total_designers: 4
- total_property_owners: 0
- total_roller_coasters: 8
- total_photos: 0
- total_park_photos: 0
- total_ride_photos: 0
- total_reviews: 8
- total_park_reviews: 4
- total_ride_reviews: 4
- roller_coasters: 10
- operating_parks: 7
- operating_rides: 10
- last_updated: '2025-08-28T17:34:59.677143+00:00'
- relative_last_updated: just now
- summary: Sample Response
- description: Example of platform statistics response
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- properties:
- error:
- type: string
- description: Error message if statistics calculation fails
- description: ''
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MapLocationDetail:
- type: object
- description: Serializer for detailed map location information.
- properties:
- id:
- type: integer
- type:
- type: string
- name:
- type: string
- slug:
- type: string
- description:
- type: string
- latitude:
- type: number
- format: double
- nullable: true
- longitude:
- type: number
- format: double
- nullable: true
- status:
- type: string
- location:
- type: object
- additionalProperties: {}
- readOnly: true
- stats:
- type: object
- additionalProperties: {}
- readOnly: true
- nearby_locations:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - description
- - id
- - latitude
- - location
- - longitude
- - name
- - nearby_locations
- - slug
- - stats
- - status
- - type
- MapLocationsResponse:
- type: object
- description: Response serializer for map locations endpoint.
- properties:
- status:
- type: string
- default: success
- locations:
- type: array
- items:
- type: object
- additionalProperties: {}
- clusters:
- type: array
- items:
- type: object
- additionalProperties: {}
- bounds:
- type: object
- additionalProperties: {}
- total_count:
- type: integer
- default: 0
- clustered:
- type: boolean
- default: false
- required:
- - locations
- MapSearchResponse:
- type: object
- description: Response serializer for map search endpoint.
- properties:
- status:
- type: string
- default: success
- results:
- type: array
- items:
- type: object
- additionalProperties: {}
- query:
- type: string
- total_count:
- type: integer
- default: 0
- page:
- type: integer
- default: 1
- page_size:
- type: integer
- default: 20
- required:
- - query
- - results
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRidePhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RidePhotoListOutput'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoApprovalInputRequest:
- type: object
- description: Input serializer for bulk photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- description: Park photo stored on Cloudflare Images
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- description: Park photo stored on Cloudflare Images
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with Cloudflare Images
- support.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- description: Park photo stored on Cloudflare Images
- image_url:
- type: string
- format: uri
- nullable: true
- description: Full URL to the Cloudflare Images asset
- readOnly: true
- image_variants:
- type: object
- additionalProperties:
- type: string
- format: uri
- description: Available Cloudflare Images variants with their URLs
- readOnly: true
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - image_url
- - image_variants
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with Cloudflare Images
- support.
- properties:
- image:
- type: string
- format: binary
- description: Park photo stored on Cloudflare Images
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoStatsOutput:
- type: object
- description: Output serializer for park photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- required:
- - approved_photos
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedRidePhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating ride photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoTypeEnum:
- enum:
- - exterior
- - queue
- - station
- - onride
- - construction
- - other
- type: string
- description: |-
- * `exterior` - Exterior View
- * `queue` - Queue Area
- * `station` - Station
- * `onride` - On-Ride
- * `construction` - Construction
- * `other` - Other
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RidePhotoApprovalInputRequest:
- type: object
- description: Input serializer for photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- RidePhotoCreateInputRequest:
- type: object
- description: Input serializer for creating ride photos.
- properties:
- image:
- type: string
- format: binary
- description: Ride photo stored on Cloudflare Images
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- is_primary:
- type: boolean
- required:
- - image
- RidePhotoListOutput:
- type: object
- description: Simplified output serializer for ride photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- description: Ride photo stored on Cloudflare Images
- caption:
- type: string
- readOnly: true
- photo_type:
- allOf:
- - $ref: '#/components/schemas/PhotoTypeEnum'
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - photo_type
- - uploaded_by_username
- RidePhotoOutput:
- type: object
- description: Output serializer for ride photos with Cloudflare Images support.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- description: Ride photo stored on Cloudflare Images
- image_url:
- type: string
- format: uri
- nullable: true
- description: Full URL to the Cloudflare Images asset
- readOnly: true
- image_variants:
- type: object
- additionalProperties:
- type: string
- format: uri
- description: Available Cloudflare Images variants with their URLs
- readOnly: true
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- ride_slug:
- type: string
- readOnly: true
- ride_name:
- type: string
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - image_url
- - image_variants
- - park_name
- - park_slug
- - ride_name
- - ride_slug
- - updated_at
- - uploaded_by_username
- RidePhotoOutputRequest:
- type: object
- description: Output serializer for ride photos with Cloudflare Images support.
- properties:
- image:
- type: string
- format: binary
- description: Ride photo stored on Cloudflare Images
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- RidePhotoStatsOutput:
- type: object
- description: Output serializer for ride photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- by_type:
- type: object
- additionalProperties:
- type: integer
- description: Photo counts by type
- required:
- - approved_photos
- - by_type
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- RidePhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating ride photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- is_primary:
- type: boolean
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- Stats:
- type: object
- description: |-
- Serializer for platform statistics response.
-
- This serializer defines the structure of the statistics API response,
- including all the various counts and breakdowns available.
- properties:
- total_parks:
- type: integer
- description: Total number of parks in the database
- total_rides:
- type: integer
- description: Total number of rides in the database
- total_manufacturers:
- type: integer
- description: Total number of ride manufacturers
- total_operators:
- type: integer
- description: Total number of park operators
- total_designers:
- type: integer
- description: Total number of ride designers
- total_property_owners:
- type: integer
- description: Total number of property owners
- total_roller_coasters:
- type: integer
- description: Total number of roller coasters with detailed stats
- total_photos:
- type: integer
- description: Total number of photos (parks + rides combined)
- total_park_photos:
- type: integer
- description: Total number of park photos
- total_ride_photos:
- type: integer
- description: Total number of ride photos
- total_reviews:
- type: integer
- description: Total number of reviews (parks + rides)
- total_park_reviews:
- type: integer
- description: Total number of park reviews
- total_ride_reviews:
- type: integer
- description: Total number of ride reviews
- roller_coasters:
- type: integer
- description: Number of rides categorized as roller coasters
- dark_rides:
- type: integer
- description: Number of rides categorized as dark rides
- flat_rides:
- type: integer
- description: Number of rides categorized as flat rides
- water_rides:
- type: integer
- description: Number of rides categorized as water rides
- transport_rides:
- type: integer
- description: Number of rides categorized as transport rides
- other_rides:
- type: integer
- description: Number of rides categorized as other
- operating_parks:
- type: integer
- description: Number of currently operating parks
- temporarily_closed_parks:
- type: integer
- description: Number of temporarily closed parks
- permanently_closed_parks:
- type: integer
- description: Number of permanently closed parks
- under_construction_parks:
- type: integer
- description: Number of parks under construction
- demolished_parks:
- type: integer
- description: Number of demolished parks
- relocated_parks:
- type: integer
- description: Number of relocated parks
- operating_rides:
- type: integer
- description: Number of currently operating rides
- temporarily_closed_rides:
- type: integer
- description: Number of temporarily closed rides
- sbno_rides:
- type: integer
- description: Number of rides standing but not operating
- closing_rides:
- type: integer
- description: Number of rides in the process of closing
- permanently_closed_rides:
- type: integer
- description: Number of permanently closed rides
- under_construction_rides:
- type: integer
- description: Number of rides under construction
- demolished_rides:
- type: integer
- description: Number of demolished rides
- relocated_rides:
- type: integer
- description: Number of relocated rides
- last_updated:
- type: string
- description: ISO timestamp when these statistics were last calculated
- relative_last_updated:
- type: string
- description: Human-readable relative time since last update (e.g., '2 minutes
- ago')
- required:
- - last_updated
- - relative_last_updated
- - total_designers
- - total_manufacturers
- - total_operators
- - total_park_photos
- - total_park_reviews
- - total_parks
- - total_photos
- - total_property_owners
- - total_reviews
- - total_ride_photos
- - total_ride_reviews
- - total_rides
- - total_roller_coasters
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
diff --git a/schema_clean.yaml b/schema_clean.yaml
deleted file mode 100644
index c22265dd..00000000
--- a/schema_clean.yaml
+++ /dev/null
@@ -1,8320 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: Retrieve a specific item from the unified history timeline.
- summary: Get unified history timeline item
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: Enable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- - in: query
- name: q
- schema:
- type: string
- description: Text query
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/:
- get:
- operationId: v1_media_photos_list
- description: Retrieve a list of photos with optional filtering
- summary: List photos
- parameters:
- - in: query
- name: content_type
- schema:
- type: string
- description: Filter by content type (e.g., 'parks.park', 'rides.ride')
- - in: query
- name: is_primary
- schema:
- type: boolean
- description: Filter by primary photos only
- - in: query
- name: object_id
- schema:
- type: integer
- description: Filter by object ID
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedPhotoListOutputList'
- description: ''
- post:
- operationId: v1_media_photos_create
- description: 'Create a new photo entry (note: use PhotoUploadAPIView for actual
- file uploads)'
- summary: Create photo
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/:
- get:
- operationId: v1_media_photos_retrieve
- description: Retrieve detailed information about a specific photo
- summary: Get photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_media_photos_update
- description: Update photo information (caption, alt text, etc.)
- summary: Update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_media_photos_partial_update
- description: Partially update photo information (caption, alt text, etc.)
- summary: Partially update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_media_photos_destroy
- description: Delete a photo (only by owner or admin)
- summary: Delete photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/set_primary/:
- post:
- operationId: v1_media_photos_set_primary_create
- description: Set this photo as the primary photo for its content object
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/bulk-action/:
- post:
- operationId: v1_media_photos_bulk_action_create
- description: Perform bulk actions on multiple photos (delete, approve, etc.)
- summary: Bulk photo actions
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/stats/:
- get:
- operationId: v1_media_stats_retrieve
- description: Retrieve statistics about photos and media usage
- summary: Get media statistics
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MediaStatsOutput'
- description: ''
- /api/v1/media/upload/:
- post:
- operationId: v1_media_upload_create
- description: Upload a photo and associate it with a content object (park, ride,
- etc.)
- summary: Upload photo
- tags:
- - Media
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUploadOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple park photos (admin only)
- summary: Bulk approve/reject photos
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park
- summary: Get park photo statistics
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride
- summary: Get ride comparisons
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/delete/:
- get:
- operationId: v1_rides_delete_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_delete_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_delete_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_delete_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/duplicate/:
- get:
- operationId: v1_rides_duplicate_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_duplicate_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_duplicate_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_duplicate_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/publish/:
- get:
- operationId: v1_rides_publish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_publish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_publish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_publish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/unpublish/:
- get:
- operationId: v1_rides_unpublish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_unpublish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_unpublish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_unpublish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/update/:
- get:
- operationId: v1_rides_update_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_update_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_update_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-create/:
- get:
- operationId: v1_rides_bulk_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-delete/:
- get:
- operationId: v1_rides_bulk_delete_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_delete_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-update/:
- get:
- operationId: v1_rides_bulk_update_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_update_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/create/:
- get:
- operationId: v1_rides_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/export/:
- get:
- operationId: v1_rides_export_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_export_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/featured/:
- get:
- operationId: v1_rides_featured_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_featured_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/import/:
- get:
- operationId: v1_rides_import_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_import_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/list/:
- get:
- operationId: v1_rides_list_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_list_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/recommendations/:
- get:
- operationId: v1_rides_recommendations_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_recommendations_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/related/:
- get:
- operationId: v1_rides_related_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_related_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search/:
- get:
- operationId: v1_rides_search_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_search_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/stats/:
- get:
- operationId: v1_rides_stats_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_stats_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/trending/:
- get:
- operationId: v1_rides_trending_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_trending_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- ActionEnum:
- enum:
- - delete
- - approve
- - reject
- type: string
- description: |-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- BulkPhotoActionInputRequest:
- type: object
- description: Input serializer for bulk photo actions.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to perform action on
- action:
- allOf:
- - $ref: '#/components/schemas/ActionEnum'
- description: |-
- Action to perform on selected photos
-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- required:
- - action
- - photo_ids
- BulkPhotoActionOutput:
- type: object
- description: Output serializer for bulk photo actions.
- properties:
- success_count:
- type: integer
- failed_count:
- type: integer
- error_messages:
- type: array
- items:
- type: string
- message:
- type: string
- required:
- - failed_count
- - message
- - success_count
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MediaStatsOutput:
- type: object
- description: Output serializer for media statistics.
- properties:
- total_photos:
- type: integer
- photos_by_content_type:
- type: object
- additionalProperties: {}
- recent_uploads:
- type: integer
- top_uploaders:
- type: array
- items: {}
- storage_usage:
- type: object
- additionalProperties: {}
- required:
- - photos_by_content_type
- - recent_uploads
- - storage_usage
- - top_uploaders
- - total_photos
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/PhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoApprovalInputRequest:
- type: object
- description: Input serializer for bulk photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoStatsOutput:
- type: object
- description: Output serializer for park photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- required:
- - approved_photos
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoDetailOutput:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - uploaded_by
- - url
- - width
- PhotoDetailOutputRequest:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- minLength: 1
- thumbnail_url:
- type: string
- format: uri
- minLength: 1
- caption:
- type: string
- minLength: 1
- alt_text:
- type: string
- minLength: 1
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- minLength: 1
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- minLength: 1
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - url
- - width
- PhotoListOutput:
- type: object
- description: Output serializer for photo list view.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - caption
- - id
- - is_primary
- - uploaded_at
- - uploaded_by
- - url
- PhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUploadInputRequest:
- type: object
- description: Input serializer for photo uploads.
- properties:
- photo:
- type: string
- format: binary
- description: The image file to upload
- app_label:
- type: string
- minLength: 1
- description: App label of the content object (e.g., 'parks', 'rides')
- maxLength: 100
- model:
- type: string
- minLength: 1
- description: Model name of the content object (e.g., 'park', 'ride')
- maxLength: 100
- object_id:
- type: integer
- description: ID of the content object
- caption:
- type: string
- description: Optional caption for the photo
- maxLength: 500
- alt_text:
- type: string
- description: Optional alt text for accessibility
- maxLength: 255
- is_primary:
- type: boolean
- default: false
- description: Whether this should be the primary photo
- photo_type:
- type: string
- minLength: 1
- default: general
- description: 'Type of photo (for rides: ''general'', ''on_ride'', ''construction'',
- etc.)'
- maxLength: 50
- required:
- - app_label
- - model
- - object_id
- - photo
- PhotoUploadOutput:
- type: object
- description: Output serializer for photo uploads.
- properties:
- id:
- type: integer
- url:
- type: string
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- message:
- type: string
- required:
- - alt_text
- - caption
- - id
- - is_primary
- - message
- - url
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
diff --git a/schema_duplicate_fixed.yaml b/schema_duplicate_fixed.yaml
deleted file mode 100644
index 3a80f9e6..00000000
--- a/schema_duplicate_fixed.yaml
+++ /dev/null
@@ -1,8183 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: Retrieve a specific item from the unified history timeline.
- summary: Get unified history timeline item
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: Enable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- - in: query
- name: q
- schema:
- type: string
- description: Text query
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/:
- get:
- operationId: v1_media_photos_list
- description: Retrieve a list of photos with optional filtering
- summary: List photos
- parameters:
- - in: query
- name: content_type
- schema:
- type: string
- description: Filter by content type (e.g., 'parks.park', 'rides.ride')
- - in: query
- name: is_primary
- schema:
- type: boolean
- description: Filter by primary photos only
- - in: query
- name: object_id
- schema:
- type: integer
- description: Filter by object ID
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedPhotoListOutputList'
- description: ''
- post:
- operationId: v1_media_photos_create
- description: 'Create a new photo entry (note: use PhotoUploadAPIView for actual
- file uploads)'
- summary: Create photo
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/:
- get:
- operationId: v1_media_photos_retrieve
- description: Retrieve detailed information about a specific photo
- summary: Get photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_media_photos_update
- description: Update photo information (caption, alt text, etc.)
- summary: Update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_media_photos_partial_update
- description: Partially update photo information (caption, alt text, etc.)
- summary: Partially update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_media_photos_destroy
- description: Delete a photo (only by owner or admin)
- summary: Delete photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/set_primary/:
- post:
- operationId: v1_media_photos_set_primary_create
- description: Set this photo as the primary photo for its content object
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/bulk-action/:
- post:
- operationId: v1_media_photos_bulk_action_create
- description: Perform bulk actions on multiple photos (delete, approve, etc.)
- summary: Bulk photo actions
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/stats/:
- get:
- operationId: v1_media_stats_retrieve
- description: Retrieve statistics about photos and media usage
- summary: Get media statistics
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MediaStatsOutput'
- description: ''
- /api/v1/media/upload/:
- post:
- operationId: v1_media_upload_create
- description: Upload a photo and associate it with a content object (park, ride,
- etc.)
- summary: Upload photo
- tags:
- - Media
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUploadOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple park photos (admin only)
- summary: Bulk approve/reject photos
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park
- summary: Get park photo statistics
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride
- summary: Get ride comparisons
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/delete/:
- get:
- operationId: v1_rides_delete_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_delete_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_delete_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_delete_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/duplicate/:
- post:
- operationId: v1_rides_duplicate_create
- description: Duplicate an existing ride.
- summary: Duplicate a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/publish/:
- get:
- operationId: v1_rides_publish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_publish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_publish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_publish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/unpublish/:
- get:
- operationId: v1_rides_unpublish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_unpublish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_unpublish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_unpublish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/update/:
- get:
- operationId: v1_rides_update_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_update_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_update_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-create/:
- get:
- operationId: v1_rides_bulk_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-delete/:
- get:
- operationId: v1_rides_bulk_delete_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_delete_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-update/:
- get:
- operationId: v1_rides_bulk_update_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_update_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/create/:
- get:
- operationId: v1_rides_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/export/:
- get:
- operationId: v1_rides_export_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_export_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/featured/:
- get:
- operationId: v1_rides_featured_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_featured_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/import/:
- get:
- operationId: v1_rides_import_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_import_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/list/:
- get:
- operationId: v1_rides_list_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_list_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/recommendations/:
- get:
- operationId: v1_rides_recommendations_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_recommendations_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/related/:
- get:
- operationId: v1_rides_related_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_related_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search/:
- get:
- operationId: v1_rides_search_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_search_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/stats/:
- get:
- operationId: v1_rides_stats_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_stats_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/trending/:
- get:
- operationId: v1_rides_trending_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_trending_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- ActionEnum:
- enum:
- - delete
- - approve
- - reject
- type: string
- description: |-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- BulkPhotoActionInputRequest:
- type: object
- description: Input serializer for bulk photo actions.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to perform action on
- action:
- allOf:
- - $ref: '#/components/schemas/ActionEnum'
- description: |-
- Action to perform on selected photos
-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- required:
- - action
- - photo_ids
- BulkPhotoActionOutput:
- type: object
- description: Output serializer for bulk photo actions.
- properties:
- success_count:
- type: integer
- failed_count:
- type: integer
- error_messages:
- type: array
- items:
- type: string
- message:
- type: string
- required:
- - failed_count
- - message
- - success_count
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MediaStatsOutput:
- type: object
- description: Output serializer for media statistics.
- properties:
- total_photos:
- type: integer
- photos_by_content_type:
- type: object
- additionalProperties: {}
- recent_uploads:
- type: integer
- top_uploaders:
- type: array
- items: {}
- storage_usage:
- type: object
- additionalProperties: {}
- required:
- - photos_by_content_type
- - recent_uploads
- - storage_usage
- - top_uploaders
- - total_photos
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/PhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoApprovalInputRequest:
- type: object
- description: Input serializer for bulk photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoStatsOutput:
- type: object
- description: Output serializer for park photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- required:
- - approved_photos
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoDetailOutput:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - uploaded_by
- - url
- - width
- PhotoDetailOutputRequest:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- minLength: 1
- thumbnail_url:
- type: string
- format: uri
- minLength: 1
- caption:
- type: string
- minLength: 1
- alt_text:
- type: string
- minLength: 1
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- minLength: 1
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- minLength: 1
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - url
- - width
- PhotoListOutput:
- type: object
- description: Output serializer for photo list view.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - caption
- - id
- - is_primary
- - uploaded_at
- - uploaded_by
- - url
- PhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUploadInputRequest:
- type: object
- description: Input serializer for photo uploads.
- properties:
- photo:
- type: string
- format: binary
- description: The image file to upload
- app_label:
- type: string
- minLength: 1
- description: App label of the content object (e.g., 'parks', 'rides')
- maxLength: 100
- model:
- type: string
- minLength: 1
- description: Model name of the content object (e.g., 'park', 'ride')
- maxLength: 100
- object_id:
- type: integer
- description: ID of the content object
- caption:
- type: string
- description: Optional caption for the photo
- maxLength: 500
- alt_text:
- type: string
- description: Optional alt text for accessibility
- maxLength: 255
- is_primary:
- type: boolean
- default: false
- description: Whether this should be the primary photo
- photo_type:
- type: string
- minLength: 1
- default: general
- description: 'Type of photo (for rides: ''general'', ''on_ride'', ''construction'',
- etc.)'
- maxLength: 50
- required:
- - app_label
- - model
- - object_id
- - photo
- PhotoUploadOutput:
- type: object
- description: Output serializer for photo uploads.
- properties:
- id:
- type: integer
- url:
- type: string
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- message:
- type: string
- required:
- - alt_text
- - caption
- - id
- - is_primary
- - message
- - url
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
diff --git a/schema_final.yaml b/schema_final.yaml
deleted file mode 100644
index d74e32d0..00000000
--- a/schema_final.yaml
+++ /dev/null
@@ -1,8330 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: Retrieve a specific item from the unified history timeline.
- summary: Get unified history timeline item
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: Enable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- - in: query
- name: q
- schema:
- type: string
- description: Text query
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/:
- get:
- operationId: v1_media_photos_list
- description: Retrieve a list of photos with optional filtering
- summary: List photos
- parameters:
- - in: query
- name: content_type
- schema:
- type: string
- description: Filter by content type (e.g., 'parks.park', 'rides.ride')
- - in: query
- name: is_primary
- schema:
- type: boolean
- description: Filter by primary photos only
- - in: query
- name: object_id
- schema:
- type: integer
- description: Filter by object ID
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedPhotoListOutputList'
- description: ''
- post:
- operationId: v1_media_photos_create
- description: 'Create a new photo entry (note: use PhotoUploadAPIView for actual
- file uploads)'
- summary: Create photo
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/:
- get:
- operationId: v1_media_photos_retrieve
- description: Retrieve detailed information about a specific photo
- summary: Get photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_media_photos_update
- description: Update photo information (caption, alt text, etc.)
- summary: Update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_media_photos_partial_update
- description: Partially update photo information (caption, alt text, etc.)
- summary: Partially update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_media_photos_destroy
- description: Delete a photo (only by owner or admin)
- summary: Delete photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/set_primary/:
- post:
- operationId: v1_media_photos_set_primary_create
- description: Set this photo as the primary photo for its content object
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/bulk-action/:
- post:
- operationId: v1_media_photos_bulk_action_create
- description: Perform bulk actions on multiple photos (delete, approve, etc.)
- summary: Bulk photo actions
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/stats/:
- get:
- operationId: v1_media_stats_retrieve
- description: Retrieve statistics about photos and media usage
- summary: Get media statistics
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MediaStatsOutput'
- description: ''
- /api/v1/media/upload/:
- post:
- operationId: v1_media_upload_create
- description: Upload a photo and associate it with a content object (park, ride,
- etc.)
- summary: Upload photo
- tags:
- - Media
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUploadOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple park photos (admin only)
- summary: Bulk approve/reject photos
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park
- summary: Get park photo statistics
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride
- summary: Get ride comparisons
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/delete/:
- get:
- operationId: v1_rides_delete_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_delete_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_delete_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_delete_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/duplicate/:
- get:
- operationId: v1_rides_duplicate_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_duplicate_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_duplicate_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_duplicate_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/publish/:
- get:
- operationId: v1_rides_publish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_publish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_publish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_publish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/unpublish/:
- get:
- operationId: v1_rides_unpublish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_unpublish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_unpublish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_unpublish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/update/:
- get:
- operationId: v1_rides_update_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_update_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_update_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-create/:
- get:
- operationId: v1_rides_bulk_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-delete/:
- get:
- operationId: v1_rides_bulk_delete_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_delete_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-update/:
- get:
- operationId: v1_rides_bulk_update_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_update_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/create/:
- get:
- operationId: v1_rides_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/export/:
- get:
- operationId: v1_rides_export_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_export_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/featured/:
- get:
- operationId: v1_rides_featured_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_featured_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/import/:
- get:
- operationId: v1_rides_import_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_import_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/list/:
- get:
- operationId: v1_rides_list_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_list_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/recommendations/:
- get:
- operationId: v1_rides_recommendations_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_recommendations_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/related/:
- get:
- operationId: v1_rides_related_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_related_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search/:
- get:
- operationId: v1_rides_search_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_search_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/stats/:
- get:
- operationId: v1_rides_stats_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_stats_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/trending/:
- get:
- operationId: v1_rides_trending_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_trending_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- ActionEnum:
- enum:
- - delete
- - approve
- - reject
- type: string
- description: |-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- BulkPhotoActionInputRequest:
- type: object
- description: Input serializer for bulk photo actions.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to perform action on
- action:
- allOf:
- - $ref: '#/components/schemas/ActionEnum'
- description: |-
- Action to perform on selected photos
-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- required:
- - action
- - photo_ids
- BulkPhotoActionOutput:
- type: object
- description: Output serializer for bulk photo actions.
- properties:
- success_count:
- type: integer
- failed_count:
- type: integer
- error_messages:
- type: array
- items:
- type: string
- message:
- type: string
- required:
- - failed_count
- - message
- - success_count
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MediaStatsOutput:
- type: object
- description: Output serializer for media statistics.
- properties:
- total_photos:
- type: integer
- photos_by_content_type:
- type: object
- additionalProperties: {}
- recent_uploads:
- type: integer
- top_uploaders:
- type: array
- items: {}
- storage_usage:
- type: object
- additionalProperties: {}
- required:
- - photos_by_content_type
- - recent_uploads
- - storage_usage
- - top_uploaders
- - total_photos
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/PhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoApprovalInputRequest:
- type: object
- description: Input serializer for bulk photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoStatsOutput:
- type: object
- description: Output serializer for park photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- required:
- - approved_photos
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoDetailOutput:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - uploaded_by
- - url
- - width
- PhotoDetailOutputRequest:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- minLength: 1
- thumbnail_url:
- type: string
- format: uri
- minLength: 1
- caption:
- type: string
- minLength: 1
- alt_text:
- type: string
- minLength: 1
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- minLength: 1
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- minLength: 1
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - url
- - width
- PhotoListOutput:
- type: object
- description: Output serializer for photo list view.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - caption
- - id
- - is_primary
- - uploaded_at
- - uploaded_by
- - url
- PhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUploadInputRequest:
- type: object
- description: Input serializer for photo uploads.
- properties:
- photo:
- type: string
- format: binary
- description: The image file to upload
- app_label:
- type: string
- minLength: 1
- description: App label of the content object (e.g., 'parks', 'rides')
- maxLength: 100
- model:
- type: string
- minLength: 1
- description: Model name of the content object (e.g., 'park', 'ride')
- maxLength: 100
- object_id:
- type: integer
- description: ID of the content object
- caption:
- type: string
- description: Optional caption for the photo
- maxLength: 500
- alt_text:
- type: string
- description: Optional alt text for accessibility
- maxLength: 255
- is_primary:
- type: boolean
- default: false
- description: Whether this should be the primary photo
- photo_type:
- type: string
- minLength: 1
- default: general
- description: 'Type of photo (for rides: ''general'', ''on_ride'', ''construction'',
- etc.)'
- maxLength: 50
- required:
- - app_label
- - model
- - object_id
- - photo
- PhotoUploadOutput:
- type: object
- description: Output serializer for photo uploads.
- properties:
- id:
- type: integer
- url:
- type: string
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- message:
- type: string
- required:
- - alt_text
- - caption
- - id
- - is_primary
- - message
- - url
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
-- name: Reviews
- description: User reviews and ratings for parks and rides
-- name: locations
- description: Geographic location services
-- name: accounts
- description: User account management
-- name: media
- description: Media and image management
-- name: moderation
- description: Content moderation
diff --git a/schema_final_clean.yaml b/schema_final_clean.yaml
deleted file mode 100644
index fb69c0e2..00000000
--- a/schema_final_clean.yaml
+++ /dev/null
@@ -1,6394 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: Retrieve a specific item from the unified history timeline.
- summary: Get unified history timeline item
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: Enable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- - in: query
- name: q
- schema:
- type: string
- description: Text query
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/:
- get:
- operationId: v1_media_photos_list
- description: Retrieve a list of photos with optional filtering
- summary: List photos
- parameters:
- - in: query
- name: content_type
- schema:
- type: string
- description: Filter by content type (e.g., 'parks.park', 'rides.ride')
- - in: query
- name: is_primary
- schema:
- type: boolean
- description: Filter by primary photos only
- - in: query
- name: object_id
- schema:
- type: integer
- description: Filter by object ID
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedPhotoListOutputList'
- description: ''
- post:
- operationId: v1_media_photos_create
- description: 'Create a new photo entry (note: use PhotoUploadAPIView for actual
- file uploads)'
- summary: Create photo
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/:
- get:
- operationId: v1_media_photos_retrieve
- description: Retrieve detailed information about a specific photo
- summary: Get photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_media_photos_update
- description: Update photo information (caption, alt text, etc.)
- summary: Update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_media_photos_partial_update
- description: Partially update photo information (caption, alt text, etc.)
- summary: Partially update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_media_photos_destroy
- description: Delete a photo (only by owner or admin)
- summary: Delete photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/set_primary/:
- post:
- operationId: v1_media_photos_set_primary_create
- description: Set this photo as the primary photo for its content object
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/bulk-action/:
- post:
- operationId: v1_media_photos_bulk_action_create
- description: Perform bulk actions on multiple photos (delete, approve, etc.)
- summary: Bulk photo actions
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/stats/:
- get:
- operationId: v1_media_stats_retrieve
- description: Retrieve statistics about photos and media usage
- summary: Get media statistics
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MediaStatsOutput'
- description: ''
- /api/v1/media/upload/:
- post:
- operationId: v1_media_upload_create
- description: Upload a photo and associate it with a content object (park, ride,
- etc.)
- summary: Upload photo
- tags:
- - Media
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUploadOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple park photos (admin only)
- summary: Bulk approve/reject photos
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park
- summary: Get park photo statistics
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride
- summary: Get ride comparisons
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides with filtering and pagination
- parameters:
- - in: query
- name: page
- schema:
- type: integer
- - in: query
- name: page_size
- schema:
- type: integer
- - in: query
- name: park_slug
- schema:
- type: string
- - in: query
- name: search
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: Create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{ride_pk}/photos/photos/:
- get:
- operationId: v1_rides_photos_photos_list
- description: Retrieve a paginated list of ride photos with filtering capabilities.
- summary: List ride photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRidePhotoListOutputList'
- description: ''
- post:
- operationId: v1_rides_photos_photos_create
- description: Upload a new photo for a ride. Requires authentication.
- summary: Upload ride photo
- parameters:
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/photos/{id}/:
- get:
- operationId: v1_rides_photos_photos_retrieve
- description: Retrieve detailed information about a specific ride photo.
- summary: Get ride photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_rides_photos_photos_update
- description: Update ride photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update ride photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_rides_photos_photos_partial_update
- description: Partially update ride photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update ride photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_rides_photos_photos_destroy
- description: Delete a ride photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete ride photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/photos/{id}/set_primary/:
- post:
- operationId: v1_rides_photos_photos_set_primary_create
- description: Set this photo as the primary photo for the ride
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_rides_photos_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this ride photo.
- required: true
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/photos/bulk_approve/:
- post:
- operationId: v1_rides_photos_photos_bulk_approve_create
- description: Bulk approve or reject multiple ride photos (admin only)
- summary: Bulk approve/reject photos
- parameters:
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/RidePhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/RidePhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/{ride_pk}/photos/photos/stats/:
- get:
- operationId: v1_rides_photos_photos_stats_retrieve
- description: Get photo statistics for the ride
- summary: Get ride photo statistics
- parameters:
- - in: path
- name: ride_pk
- schema:
- type: integer
- required: true
- tags:
- - Ride Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RidePhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- ActionEnum:
- enum:
- - delete
- - approve
- - reject
- type: string
- description: |-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- BulkPhotoActionInputRequest:
- type: object
- description: Input serializer for bulk photo actions.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to perform action on
- action:
- allOf:
- - $ref: '#/components/schemas/ActionEnum'
- description: |-
- Action to perform on selected photos
-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- required:
- - action
- - photo_ids
- BulkPhotoActionOutput:
- type: object
- description: Output serializer for bulk photo actions.
- properties:
- success_count:
- type: integer
- failed_count:
- type: integer
- error_messages:
- type: array
- items:
- type: string
- message:
- type: string
- required:
- - failed_count
- - message
- - success_count
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MediaStatsOutput:
- type: object
- description: Output serializer for media statistics.
- properties:
- total_photos:
- type: integer
- photos_by_content_type:
- type: object
- additionalProperties: {}
- recent_uploads:
- type: integer
- top_uploaders:
- type: array
- items: {}
- storage_usage:
- type: object
- additionalProperties: {}
- required:
- - photos_by_content_type
- - recent_uploads
- - storage_usage
- - top_uploaders
- - total_photos
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/PhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRidePhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RidePhotoListOutput'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoApprovalInputRequest:
- type: object
- description: Input serializer for bulk photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoStatsOutput:
- type: object
- description: Output serializer for park photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- required:
- - approved_photos
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedRidePhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating ride photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoDetailOutput:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - uploaded_by
- - url
- - width
- PhotoDetailOutputRequest:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- minLength: 1
- thumbnail_url:
- type: string
- format: uri
- minLength: 1
- caption:
- type: string
- minLength: 1
- alt_text:
- type: string
- minLength: 1
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- minLength: 1
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- minLength: 1
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - url
- - width
- PhotoListOutput:
- type: object
- description: Output serializer for photo list view.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - caption
- - id
- - is_primary
- - uploaded_at
- - uploaded_by
- - url
- PhotoTypeEnum:
- enum:
- - exterior
- - queue
- - station
- - onride
- - construction
- - other
- type: string
- description: |-
- * `exterior` - Exterior View
- * `queue` - Queue Area
- * `station` - Station
- * `onride` - On-Ride
- * `construction` - Construction
- * `other` - Other
- PhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUploadInputRequest:
- type: object
- description: Input serializer for photo uploads.
- properties:
- photo:
- type: string
- format: binary
- description: The image file to upload
- app_label:
- type: string
- minLength: 1
- description: App label of the content object (e.g., 'parks', 'rides')
- maxLength: 100
- model:
- type: string
- minLength: 1
- description: Model name of the content object (e.g., 'park', 'ride')
- maxLength: 100
- object_id:
- type: integer
- description: ID of the content object
- caption:
- type: string
- description: Optional caption for the photo
- maxLength: 500
- alt_text:
- type: string
- description: Optional alt text for accessibility
- maxLength: 255
- is_primary:
- type: boolean
- default: false
- description: Whether this should be the primary photo
- photo_type:
- type: string
- minLength: 1
- default: general
- description: 'Type of photo (for rides: ''general'', ''on_ride'', ''construction'',
- etc.)'
- maxLength: 50
- required:
- - app_label
- - model
- - object_id
- - photo
- PhotoUploadOutput:
- type: object
- description: Output serializer for photo uploads.
- properties:
- id:
- type: integer
- url:
- type: string
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- message:
- type: string
- required:
- - alt_text
- - caption
- - id
- - is_primary
- - message
- - url
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RidePhotoApprovalInputRequest:
- type: object
- description: Input serializer for photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- RidePhotoCreateInputRequest:
- type: object
- description: Input serializer for creating ride photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- is_primary:
- type: boolean
- required:
- - image
- RidePhotoListOutput:
- type: object
- description: Simplified output serializer for ride photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- photo_type:
- allOf:
- - $ref: '#/components/schemas/PhotoTypeEnum'
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - photo_type
- - uploaded_by_username
- RidePhotoOutput:
- type: object
- description: Output serializer for ride photos.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: Get file size in bytes.
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Get image dimensions as [width, height].
- readOnly: true
- ride_slug:
- type: string
- readOnly: true
- ride_name:
- type: string
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - ride_name
- - ride_slug
- - updated_at
- - uploaded_by_username
- RidePhotoOutputRequest:
- type: object
- description: Output serializer for ride photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- RidePhotoStatsOutput:
- type: object
- description: Output serializer for ride photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- by_type:
- type: object
- additionalProperties:
- type: integer
- description: Photo counts by type
- required:
- - approved_photos
- - by_type
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- RidePhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating ride photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- photo_type:
- $ref: '#/components/schemas/PhotoTypeEnum'
- is_primary:
- type: boolean
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
diff --git a/schema_fixed.yaml b/schema_fixed.yaml
deleted file mode 100644
index c3e06116..00000000
--- a/schema_fixed.yaml
+++ /dev/null
@@ -1,8227 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: |-
- ViewSet for unified history timeline across all models.
-
- Provides a comprehensive view of all changes across
- parks, rides, and companies in chronological order.
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - v1
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: Enable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- - in: query
- name: q
- schema:
- type: string
- description: Text query
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/:
- get:
- operationId: v1_media_photos_list
- description: Retrieve a list of photos with optional filtering
- summary: List photos
- parameters:
- - in: query
- name: content_type
- schema:
- type: string
- description: Filter by content type (e.g., 'parks.park', 'rides.ride')
- - in: query
- name: is_primary
- schema:
- type: boolean
- description: Filter by primary photos only
- - in: query
- name: object_id
- schema:
- type: integer
- description: Filter by object ID
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedPhotoListOutputList'
- description: ''
- post:
- operationId: v1_media_photos_create
- description: ViewSet for managing photos across domains.
- tags:
- - v1
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- /api/v1/media/photos/{id}/:
- get:
- operationId: v1_media_photos_retrieve
- description: Retrieve detailed information about a specific photo
- summary: Get photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_media_photos_update
- description: Update photo information (caption, alt text, etc.)
- summary: Update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_media_photos_partial_update
- description: ViewSet for managing photos across domains.
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - v1
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInput'
- description: ''
- delete:
- operationId: v1_media_photos_destroy
- description: Delete a photo (only by owner or admin)
- summary: Delete photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/set_primary/:
- post:
- operationId: v1_media_photos_set_primary_create
- description: Set this photo as the primary photo for its content object
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/bulk-action/:
- post:
- operationId: v1_media_photos_bulk_action_create
- description: Perform bulk actions on multiple photos (delete, approve, etc.)
- summary: Bulk photo actions
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/stats/:
- get:
- operationId: v1_media_stats_retrieve
- description: Retrieve statistics about photos and media usage
- summary: Get media statistics
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MediaStatsOutput'
- description: ''
- /api/v1/media/upload/:
- post:
- operationId: v1_media_upload_create
- description: Upload a photo and associate it with a content object (park, ride,
- etc.)
- summary: Upload photo
- tags:
- - Media
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUploadOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park.
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - v1
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- /api/v1/parks/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility.
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - v1
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- /api/v1/parks/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple photos (admin only).
- tags:
- - v1
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- /api/v1/parks/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park.
- tags:
- - v1
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride.
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - v1
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRanking'
- examples:
- RideRankingExample:
- value:
- id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/delete/:
- get:
- operationId: v1_rides_delete_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_delete_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_delete_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_delete_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/duplicate/:
- get:
- operationId: v1_rides_duplicate_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_duplicate_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_duplicate_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_duplicate_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/publish/:
- get:
- operationId: v1_rides_publish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_publish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_publish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_publish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/unpublish/:
- get:
- operationId: v1_rides_unpublish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_unpublish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_unpublish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_unpublish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/update/:
- get:
- operationId: v1_rides_update_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_update_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_update_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-create/:
- get:
- operationId: v1_rides_bulk_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-delete/:
- get:
- operationId: v1_rides_bulk_delete_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_delete_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-update/:
- get:
- operationId: v1_rides_bulk_update_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_update_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/create/:
- get:
- operationId: v1_rides_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/export/:
- get:
- operationId: v1_rides_export_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_export_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/featured/:
- get:
- operationId: v1_rides_featured_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_featured_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/import/:
- get:
- operationId: v1_rides_import_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_import_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/list/:
- get:
- operationId: v1_rides_list_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_list_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/recommendations/:
- get:
- operationId: v1_rides_recommendations_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_recommendations_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/related/:
- get:
- operationId: v1_rides_related_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_related_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search/:
- get:
- operationId: v1_rides_search_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_search_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/stats/:
- get:
- operationId: v1_rides_stats_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_stats_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/trending/:
- get:
- operationId: v1_rides_trending_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_trending_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- ActionEnum:
- enum:
- - delete
- - approve
- - reject
- type: string
- description: |-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- BulkPhotoActionInputRequest:
- type: object
- description: Input serializer for bulk photo actions.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to perform action on
- action:
- allOf:
- - $ref: '#/components/schemas/ActionEnum'
- description: |-
- Action to perform on selected photos
-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- required:
- - action
- - photo_ids
- BulkPhotoActionOutput:
- type: object
- description: Output serializer for bulk photo actions.
- properties:
- success_count:
- type: integer
- failed_count:
- type: integer
- error_messages:
- type: array
- items:
- type: string
- message:
- type: string
- required:
- - failed_count
- - message
- - success_count
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MediaStatsOutput:
- type: object
- description: Output serializer for media statistics.
- properties:
- total_photos:
- type: integer
- photos_by_content_type:
- type: object
- additionalProperties: {}
- recent_uploads:
- type: integer
- top_uploaders:
- type: array
- items: {}
- storage_usage:
- type: object
- additionalProperties: {}
- required:
- - photos_by_content_type
- - recent_uploads
- - storage_usage
- - top_uploaders
- - total_photos
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/PhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoDetailOutput:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - uploaded_by
- - url
- - width
- PhotoDetailOutputRequest:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- minLength: 1
- thumbnail_url:
- type: string
- format: uri
- minLength: 1
- caption:
- type: string
- minLength: 1
- alt_text:
- type: string
- minLength: 1
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- minLength: 1
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- minLength: 1
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - url
- - width
- PhotoListOutput:
- type: object
- description: Output serializer for photo list view.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - caption
- - id
- - is_primary
- - uploaded_at
- - uploaded_by
- - url
- PhotoUpdateInput:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUploadInputRequest:
- type: object
- description: Input serializer for photo uploads.
- properties:
- photo:
- type: string
- format: binary
- description: The image file to upload
- app_label:
- type: string
- minLength: 1
- description: App label of the content object (e.g., 'parks', 'rides')
- maxLength: 100
- model:
- type: string
- minLength: 1
- description: Model name of the content object (e.g., 'park', 'ride')
- maxLength: 100
- object_id:
- type: integer
- description: ID of the content object
- caption:
- type: string
- description: Optional caption for the photo
- maxLength: 500
- alt_text:
- type: string
- description: Optional alt text for accessibility
- maxLength: 255
- is_primary:
- type: boolean
- default: false
- description: Whether this should be the primary photo
- photo_type:
- type: string
- minLength: 1
- default: general
- description: 'Type of photo (for rides: ''general'', ''on_ride'', ''construction'',
- etc.)'
- maxLength: 50
- required:
- - app_label
- - model
- - object_id
- - photo
- PhotoUploadOutput:
- type: object
- description: Output serializer for photo uploads.
- properties:
- id:
- type: integer
- url:
- type: string
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- message:
- type: string
- required:
- - alt_text
- - caption
- - id
- - is_primary
- - message
- - url
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
-- name: Reviews
- description: User reviews and ratings for parks and rides
-- name: locations
- description: Geographic location services
-- name: accounts
- description: User account management
-- name: media
- description: Media and image management
-- name: moderation
- description: Content moderation
diff --git a/schema_no_duplicate.yaml b/schema_no_duplicate.yaml
deleted file mode 100644
index 39953da2..00000000
--- a/schema_no_duplicate.yaml
+++ /dev/null
@@ -1,8135 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: Retrieve a specific item from the unified history timeline.
- summary: Get unified history timeline item
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: Enable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- - in: query
- name: q
- schema:
- type: string
- description: Text query
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/:
- get:
- operationId: v1_media_photos_list
- description: Retrieve a list of photos with optional filtering
- summary: List photos
- parameters:
- - in: query
- name: content_type
- schema:
- type: string
- description: Filter by content type (e.g., 'parks.park', 'rides.ride')
- - in: query
- name: is_primary
- schema:
- type: boolean
- description: Filter by primary photos only
- - in: query
- name: object_id
- schema:
- type: integer
- description: Filter by object ID
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedPhotoListOutputList'
- description: ''
- post:
- operationId: v1_media_photos_create
- description: 'Create a new photo entry (note: use PhotoUploadAPIView for actual
- file uploads)'
- summary: Create photo
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/:
- get:
- operationId: v1_media_photos_retrieve
- description: Retrieve detailed information about a specific photo
- summary: Get photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_media_photos_update
- description: Update photo information (caption, alt text, etc.)
- summary: Update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_media_photos_partial_update
- description: Partially update photo information (caption, alt text, etc.)
- summary: Partially update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_media_photos_destroy
- description: Delete a photo (only by owner or admin)
- summary: Delete photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/set_primary/:
- post:
- operationId: v1_media_photos_set_primary_create
- description: Set this photo as the primary photo for its content object
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/bulk-action/:
- post:
- operationId: v1_media_photos_bulk_action_create
- description: Perform bulk actions on multiple photos (delete, approve, etc.)
- summary: Bulk photo actions
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/stats/:
- get:
- operationId: v1_media_stats_retrieve
- description: Retrieve statistics about photos and media usage
- summary: Get media statistics
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MediaStatsOutput'
- description: ''
- /api/v1/media/upload/:
- post:
- operationId: v1_media_upload_create
- description: Upload a photo and associate it with a content object (park, ride,
- etc.)
- summary: Upload photo
- tags:
- - Media
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUploadOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple park photos (admin only)
- summary: Bulk approve/reject photos
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park
- summary: Get park photo statistics
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride
- summary: Get ride comparisons
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/delete/:
- get:
- operationId: v1_rides_delete_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_delete_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_delete_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_delete_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/publish/:
- get:
- operationId: v1_rides_publish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_publish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_publish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_publish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/unpublish/:
- get:
- operationId: v1_rides_unpublish_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_unpublish_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_unpublish_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_unpublish_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/update/:
- get:
- operationId: v1_rides_update_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_update_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_update_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-create/:
- get:
- operationId: v1_rides_bulk_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-delete/:
- get:
- operationId: v1_rides_bulk_delete_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_delete_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/bulk-update/:
- get:
- operationId: v1_rides_bulk_update_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_bulk_update_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/create/:
- get:
- operationId: v1_rides_create_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_create_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/export/:
- get:
- operationId: v1_rides_export_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_export_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/featured/:
- get:
- operationId: v1_rides_featured_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_featured_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/import/:
- get:
- operationId: v1_rides_import_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_import_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/list/:
- get:
- operationId: v1_rides_list_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_list_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/recommendations/:
- get:
- operationId: v1_rides_recommendations_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_recommendations_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/related/:
- get:
- operationId: v1_rides_related_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_related_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search/:
- get:
- operationId: v1_rides_search_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_search_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/stats/:
- get:
- operationId: v1_rides_stats_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_stats_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/trending/:
- get:
- operationId: v1_rides_trending_list
- description: List rides with basic filtering and pagination.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- post:
- operationId: v1_rides_trending_create
- description: Create a new ride.
- summary: List rides or create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- ActionEnum:
- enum:
- - delete
- - approve
- - reject
- type: string
- description: |-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- BulkPhotoActionInputRequest:
- type: object
- description: Input serializer for bulk photo actions.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to perform action on
- action:
- allOf:
- - $ref: '#/components/schemas/ActionEnum'
- description: |-
- Action to perform on selected photos
-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- required:
- - action
- - photo_ids
- BulkPhotoActionOutput:
- type: object
- description: Output serializer for bulk photo actions.
- properties:
- success_count:
- type: integer
- failed_count:
- type: integer
- error_messages:
- type: array
- items:
- type: string
- message:
- type: string
- required:
- - failed_count
- - message
- - success_count
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MediaStatsOutput:
- type: object
- description: Output serializer for media statistics.
- properties:
- total_photos:
- type: integer
- photos_by_content_type:
- type: object
- additionalProperties: {}
- recent_uploads:
- type: integer
- top_uploaders:
- type: array
- items: {}
- storage_usage:
- type: object
- additionalProperties: {}
- required:
- - photos_by_content_type
- - recent_uploads
- - storage_usage
- - top_uploaders
- - total_photos
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/PhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoApprovalInputRequest:
- type: object
- description: Input serializer for bulk photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoStatsOutput:
- type: object
- description: Output serializer for park photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- required:
- - approved_photos
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoDetailOutput:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - uploaded_by
- - url
- - width
- PhotoDetailOutputRequest:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- minLength: 1
- thumbnail_url:
- type: string
- format: uri
- minLength: 1
- caption:
- type: string
- minLength: 1
- alt_text:
- type: string
- minLength: 1
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- minLength: 1
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- minLength: 1
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - url
- - width
- PhotoListOutput:
- type: object
- description: Output serializer for photo list view.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - caption
- - id
- - is_primary
- - uploaded_at
- - uploaded_by
- - url
- PhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUploadInputRequest:
- type: object
- description: Input serializer for photo uploads.
- properties:
- photo:
- type: string
- format: binary
- description: The image file to upload
- app_label:
- type: string
- minLength: 1
- description: App label of the content object (e.g., 'parks', 'rides')
- maxLength: 100
- model:
- type: string
- minLength: 1
- description: Model name of the content object (e.g., 'park', 'ride')
- maxLength: 100
- object_id:
- type: integer
- description: ID of the content object
- caption:
- type: string
- description: Optional caption for the photo
- maxLength: 500
- alt_text:
- type: string
- description: Optional alt text for accessibility
- maxLength: 255
- is_primary:
- type: boolean
- default: false
- description: Whether this should be the primary photo
- photo_type:
- type: string
- minLength: 1
- default: general
- description: 'Type of photo (for rides: ''general'', ''on_ride'', ''construction'',
- etc.)'
- maxLength: 50
- required:
- - app_label
- - model
- - object_id
- - photo
- PhotoUploadOutput:
- type: object
- description: Output serializer for photo uploads.
- properties:
- id:
- type: integer
- url:
- type: string
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- message:
- type: string
- required:
- - alt_text
- - caption
- - id
- - is_primary
- - message
- - url
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
diff --git a/schema_no_duplicates.yaml b/schema_no_duplicates.yaml
deleted file mode 100644
index 87ae6dbc..00000000
--- a/schema_no_duplicates.yaml
+++ /dev/null
@@ -1,5616 +0,0 @@
-openapi: 3.0.3
-info:
- title: ThrillWiki API
- version: 1.0.0
- description: Comprehensive theme park and ride information API
-paths:
- /api/v1/accounts/profiles/:
- get:
- operationId: v1_accounts_profiles_list
- description: Retrieve a list of user profiles.
- summary: List user profiles
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUserProfileOutputList'
- description: ''
- post:
- operationId: v1_accounts_profiles_create
- description: Create a new user profile.
- summary: Create user profile
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/profiles/{id}/:
- get:
- operationId: v1_accounts_profiles_retrieve
- description: Retrieve a specific user profile by ID.
- summary: Get user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- put:
- operationId: v1_accounts_profiles_update
- description: Update a user profile.
- summary: Update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/UserProfileUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- patch:
- operationId: v1_accounts_profiles_partial_update
- description: Partially update a user profile.
- summary: Partially update user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- delete:
- operationId: v1_accounts_profiles_destroy
- description: Delete a user profile.
- summary: Delete user profile
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this user profile.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/profiles/me/:
- get:
- operationId: v1_accounts_profiles_me_retrieve
- description: Retrieve the current authenticated user's profile.
- summary: Get current user's profile
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserProfileOutput'
- description: ''
- /api/v1/accounts/toplist-items/:
- get:
- operationId: v1_accounts_toplist_items_list
- description: Retrieve a list of top list items.
- summary: List top list items
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListItemOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplist_items_create
- description: Add a new item to a top list.
- summary: Create top list item
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- /api/v1/accounts/toplist-items/{id}/:
- get:
- operationId: v1_accounts_toplist_items_retrieve
- description: Retrieve a specific top list item by ID.
- summary: Get top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- put:
- operationId: v1_accounts_toplist_items_update
- description: Update a top list item.
- summary: Update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplist_items_partial_update
- description: Partially update a top list item.
- summary: Partially update top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplist_items_destroy
- description: Remove an item from a top list.
- summary: Delete top list item
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list item.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplist-items/reorder/:
- post:
- operationId: v1_accounts_toplist_items_reorder_create
- description: Reorder items within a top list.
- summary: Reorder top list items
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListItemOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- success:
- type: boolean
- description: ''
- /api/v1/accounts/toplists/:
- get:
- operationId: v1_accounts_toplists_list
- description: Retrieve a list of top lists.
- summary: List top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- post:
- operationId: v1_accounts_toplists_create
- description: Create a new top list.
- summary: Create top list
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/{id}/:
- get:
- operationId: v1_accounts_toplists_retrieve
- description: Retrieve a specific top list by ID.
- summary: Get top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- put:
- operationId: v1_accounts_toplists_update
- description: Update a top list.
- summary: Update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListUpdateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- patch:
- operationId: v1_accounts_toplists_partial_update
- description: Partially update a top list.
- summary: Partially update top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- delete:
- operationId: v1_accounts_toplists_destroy
- description: Delete a top list.
- summary: Delete top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- /api/v1/accounts/toplists/{id}/duplicate/:
- post:
- operationId: v1_accounts_toplists_duplicate_create
- description: Create a copy of an existing top list for the current user.
- summary: Duplicate top list
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this top list.
- required: true
- tags:
- - Accounts
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/TopListOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/TopListOutput'
- description: ''
- /api/v1/accounts/toplists/my_lists/:
- get:
- operationId: v1_accounts_toplists_my_lists_list
- description: Retrieve all top lists belonging to the current user.
- summary: Get current user's top lists
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Accounts
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedTopListOutputList'
- description: ''
- /api/v1/auth/login/:
- post:
- operationId: v1_auth_login_create
- description: Authenticate user with username/email and password.
- summary: User login
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- examples:
- LoginInputExample:
- value:
- username: thrillseeker
- password: securepassword123
- summary: Example login request
- description: Login with username or email and password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LoginInputRequest'
- required: true
- security:
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LoginOutput'
- examples:
- LoginOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- message: Login successful
- summary: Example login response
- description: Successful login response with token and user data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/logout/:
- post:
- operationId: v1_auth_logout_create
- description: Logout the current user and invalidate their token.
- summary: User logout
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/LogoutOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LogoutOutput'
- examples:
- LogoutOutputExample:
- value:
- message: Logout successful
- summary: Example logout response
- description: Successful logout response
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/change/:
- post:
- operationId: v1_auth_password_change_create
- description: Change the current user's password.
- summary: Change password
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- examples:
- PasswordChangeInputExample:
- value:
- old_password: oldpassword123
- new_password: newpassword456
- new_password_confirm: newpassword456
- summary: Example password change request
- description: Change current user's password
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordChangeInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordChangeOutput'
- examples:
- PasswordChangeOutputExample:
- value:
- detail: Password changed successfully
- summary: Example password change response
- description: Password changed successfully response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/password/reset/:
- post:
- operationId: v1_auth_password_reset_create
- description: Send a password reset email to the user.
- summary: Request password reset
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- examples:
- PasswordResetInputExample:
- value:
- email: user@example.com
- summary: Example password reset request
- description: Request password reset email
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PasswordResetInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PasswordResetOutput'
- examples:
- PasswordResetOutputExample:
- value:
- detail: Password reset email sent
- summary: Example password reset response
- description: Password reset email sent response
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/providers/:
- get:
- operationId: v1_auth_providers_retrieve
- description: Retrieve available social authentication providers.
- summary: Get social providers
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/signup/:
- post:
- operationId: v1_auth_signup_create
- description: Register a new user account.
- summary: User registration
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- examples:
- SignupInputExample:
- value:
- username: newuser
- email: newuser@example.com
- password: securepassword123
- password_confirm: securepassword123
- first_name: Jane
- last_name: Smith
- summary: Example registration request
- description: Register a new user account
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/SignupInputRequest'
- required: true
- security:
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SignupOutput'
- examples:
- SignupOutputExample:
- value:
- token: abc123def456ghi789
- user:
- id: 2
- username: newuser
- email: newuser@example.com
- first_name: Jane
- last_name: Smith
- message: Registration successful
- summary: Example registration response
- description: Successful registration response with token and user
- data
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/auth/status/:
- post:
- operationId: v1_auth_status_create
- description: Check if user is authenticated and return user data.
- summary: Check authentication status
- tags:
- - Authentication
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/AuthStatusOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthStatusOutput'
- examples:
- AuthStatusAuthenticatedExample:
- value:
- authenticated: true
- user:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- summary: Example authenticated status
- description: Response when user is authenticated
- AuthStatusUnauthenticatedExample:
- value:
- authenticated: false
- user: null
- summary: Example unauthenticated status
- description: Response when user is not authenticated
- description: ''
- /api/v1/auth/user/:
- get:
- operationId: v1_auth_user_retrieve
- description: Retrieve information about the currently authenticated user.
- summary: Get current user
- tags:
- - Authentication
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserOutput'
- examples:
- UserOutputExample:
- value:
- id: 1
- username: thrillseeker
- email: user@example.com
- first_name: John
- last_name: Doe
- is_active: true
- date_joined: '2024-01-01T00:00:00Z'
- summary: Example user response
- description: A typical user object in API responses
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/core/entities/not-found/:
- post:
- operationId: v1_core_entities_not_found_create
- description: Handle entity not found scenarios with fuzzy matching suggestions
- and authentication prompts
- summary: Handle entity not found
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/search/:
- post:
- operationId: v1_core_entities_search_create
- description: Perform fuzzy entity search with authentication prompts for entity
- creation
- summary: Fuzzy entity search
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/core/entities/suggestions/:
- get:
- operationId: v1_core_entities_suggestions_retrieve
- description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
- summary: Quick entity suggestions
- tags:
- - Core
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/email/send/:
- post:
- operationId: v1_email_send_create
- description: Send an email via the email service.
- summary: Send email
- tags:
- - Email
- requestBody:
- content:
- type:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- properties:
- schema:
- to:
- type: string
- format: email
- description: Recipient email address
- subject:
- type: string
- description: Email subject
- text:
- type: string
- description: Email body text
- from_email:
- type: string
- format: email
- description: Sender email address (optional)
- required:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified request body
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- response:
- type: object
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/:
- get:
- operationId: v1_health_retrieve
- description: Get comprehensive health check information including system metrics.
- summary: Health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/HealthCheckOutput'
- description: ''
- /api/v1/health/performance/:
- get:
- operationId: v1_health_performance_retrieve
- description: Get performance metrics and database analysis (debug mode only).
- summary: Performance metrics
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PerformanceMetricsOutput'
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: Unspecified response body
- description: ''
- /api/v1/health/simple/:
- get:
- operationId: v1_health_simple_retrieve
- description: Simple health check endpoint for load balancers.
- summary: Simple health check
- tags:
- - Health
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- '503':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SimpleHealthOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/:
- get:
- operationId: v1_history_parks_list
- description: Retrieve history timeline for a specific park including all changes
- over time.
- summary: Get park history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/detail/:
- get:
- operationId: v1_history_parks_detail_retrieve
- description: Retrieve complete history for a park including current state and
- timeline.
- summary: Get complete park history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Parks
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkHistoryOutput'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
- get:
- operationId: v1_history_parks_rides_list
- description: Retrieve history timeline for a specific ride including all changes
- over time.
- summary: Get ride history
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 50, max: 500)'
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideHistoryEventList'
- description: ''
- /api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
- get:
- operationId: v1_history_parks_rides_detail_retrieve
- description: Retrieve complete history for a ride including current state and
- timeline.
- summary: Get complete ride history
- parameters:
- - in: path
- name: park_slug
- schema:
- type: string
- required: true
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - History
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideHistoryOutput'
- description: ''
- /api/v1/history/timeline/:
- get:
- operationId: v1_history_timeline_list
- description: Retrieve a unified timeline of all changes across parks, rides,
- and companies.
- summary: Unified history timeline
- parameters:
- - in: query
- name: end_date
- schema:
- type: string
- format: date
- description: Filter events before this date (YYYY-MM-DD)
- - in: query
- name: event_type
- schema:
- type: string
- description: Filter by event type (created, updated, deleted)
- - in: query
- name: limit
- schema:
- type: integer
- description: 'Number of history events to return (default: 100, max: 1000)'
- - in: query
- name: model_type
- schema:
- type: string
- description: Filter by model type (park, ride, company)
- - in: query
- name: offset
- schema:
- type: integer
- description: Offset for pagination
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: significance
- schema:
- type: string
- description: Filter by change significance (major, minor, routine)
- - in: query
- name: start_date
- schema:
- type: string
- format: date
- description: Filter events after this date (YYYY-MM-DD)
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
- description: ''
- /api/v1/history/timeline/{id}/:
- get:
- operationId: v1_history_timeline_retrieve
- description: Retrieve a specific item from the unified history timeline.
- summary: Get unified history timeline item
- parameters:
- - in: path
- name: id
- schema:
- type: string
- required: true
- tags:
- - History
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- description: ''
- /api/v1/maps/bounds/:
- get:
- operationId: v1_maps_bounds_retrieve
- description: Get locations within specific geographic bounds.
- summary: Get locations within bounds
- parameters:
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- required: true
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- required: true
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- required: true
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/:
- post:
- operationId: v1_maps_cache_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/cache/invalidate/:
- post:
- operationId: v1_maps_cache_invalidate_create
- description: Invalidate specific cache entries.
- summary: Invalidate specific cache entries
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_maps_cache_invalidate_destroy
- description: Clear all map cache (admin only).
- summary: Clear map cache
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/:
- get:
- operationId: v1_maps_locations_retrieve
- description: Get map locations with optional clustering and filtering.
- summary: Get map locations
- parameters:
- - in: query
- name: cluster
- schema:
- type: boolean
- description: Enable clustering
- - in: query
- name: east
- schema:
- type: number
- description: Eastern longitude bound
- - in: query
- name: north
- schema:
- type: number
- description: Northern latitude bound
- - in: query
- name: q
- schema:
- type: string
- description: Text query
- - in: query
- name: south
- schema:
- type: number
- description: Southern latitude bound
- - in: query
- name: types
- schema:
- type: string
- description: Comma-separated location types
- - in: query
- name: west
- schema:
- type: number
- description: Western longitude bound
- - in: query
- name: zoom
- schema:
- type: integer
- description: Map zoom level
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/locations/{location_type}/{location_id}/:
- get:
- operationId: v1_maps_locations_retrieve_2
- description: Get detailed information about a specific location.
- summary: Get location details
- parameters:
- - in: path
- name: location_id
- schema:
- type: integer
- description: ID of the location
- required: true
- - in: path
- name: location_type
- schema:
- type: string
- description: Type of location
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/search/:
- get:
- operationId: v1_maps_search_retrieve
- description: Search locations by text query with optional bounds filtering.
- summary: Search map locations
- parameters:
- - in: query
- name: q
- schema:
- type: string
- description: Search query
- required: true
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/maps/stats/:
- get:
- operationId: v1_maps_stats_retrieve
- description: Get map service statistics and performance metrics.
- summary: Get map service statistics
- tags:
- - Maps
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/:
- get:
- operationId: v1_media_photos_list
- description: Retrieve a list of photos with optional filtering
- summary: List photos
- parameters:
- - in: query
- name: content_type
- schema:
- type: string
- description: Filter by content type (e.g., 'parks.park', 'rides.ride')
- - in: query
- name: is_primary
- schema:
- type: boolean
- description: Filter by primary photos only
- - in: query
- name: object_id
- schema:
- type: integer
- description: Filter by object ID
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedPhotoListOutputList'
- description: ''
- post:
- operationId: v1_media_photos_create
- description: 'Create a new photo entry (note: use PhotoUploadAPIView for actual
- file uploads)'
- summary: Create photo
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/:
- get:
- operationId: v1_media_photos_retrieve
- description: Retrieve detailed information about a specific photo
- summary: Get photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_media_photos_update
- description: Update photo information (caption, alt text, etc.)
- summary: Update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_media_photos_partial_update
- description: Partially update photo information (caption, alt text, etc.)
- summary: Partially update photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutput'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_media_photos_destroy
- description: Delete a photo (only by owner or admin)
- summary: Delete photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/{id}/set_primary/:
- post:
- operationId: v1_media_photos_set_primary_create
- description: Set this photo as the primary photo for its content object
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- examples:
- PhotoDetailExample:
- value:
- id: 1
- url: https://example.com/media/photos/ride123.jpg
- thumbnail_url: https://example.com/media/thumbnails/ride123_thumb.jpg
- caption: Amazing view of Steel Vengeance
- alt_text: Steel Vengeance roller coaster with blue sky
- is_primary: true
- uploaded_at: '2024-08-15T10:30:00Z'
- uploaded_by:
- id: 1
- username: coaster_photographer
- display_name: Coaster Photographer
- content_type: Ride
- object_id: 123
- summary: Example photo detail response
- description: A photo with full details
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoDetailOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/photos/bulk-action/:
- post:
- operationId: v1_media_photos_bulk_action_create
- description: Perform bulk actions on multiple photos (delete, approve, etc.)
- summary: Bulk photo actions
- tags:
- - Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkPhotoActionOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/media/stats/:
- get:
- operationId: v1_media_stats_retrieve
- description: Retrieve statistics about photos and media usage
- summary: Get media statistics
- tags:
- - Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/MediaStatsOutput'
- description: ''
- /api/v1/media/upload/:
- post:
- operationId: v1_media_upload_create
- description: Upload a photo and associate it with a content object (park, ride,
- etc.)
- summary: Upload photo
- tags:
- - Media
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PhotoUploadInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PhotoUploadOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/:
- get:
- operationId: v1_parks_photos_list
- description: Retrieve a paginated list of park photos with filtering capabilities.
- summary: List park photos
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - name: search
- required: false
- in: query
- description: A search term.
- schema:
- type: string
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
- description: ''
- post:
- operationId: v1_parks_photos_create
- description: Upload a new photo for a park. Requires authentication.
- summary: Upload park photo
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoCreateInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/:
- get:
- operationId: v1_parks_photos_retrieve
- description: Retrieve detailed information about a specific park photo.
- summary: Get park photo details
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- put:
- operationId: v1_parks_photos_update
- description: Update park photo information. Requires authentication and ownership
- or admin privileges.
- summary: Update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- patch:
- operationId: v1_parks_photos_partial_update
- description: Partially update park photo information. Requires authentication
- and ownership or admin privileges.
- summary: Partially update park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutput'
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- delete:
- operationId: v1_parks_photos_destroy
- description: Delete a park photo. Requires authentication and ownership or admin
- privileges.
- summary: Delete park photo
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '204':
- description: No response body
- '401':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary/:
- post:
- operationId: v1_parks_photos_set_primary_create
- description: Set this photo as the primary photo for the park
- summary: Set photo as primary
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/{id}/set_primary_legacy/:
- post:
- operationId: v1_parks_photos_set_primary_legacy_create
- description: Legacy set primary action for backwards compatibility
- summary: Set photo as primary (legacy)
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- description: A unique integer value identifying this park photo.
- required: true
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoOutputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/bulk_approve/:
- post:
- operationId: v1_parks_photos_bulk_approve_create
- description: Bulk approve or reject multiple park photos (admin only)
- summary: Bulk approve/reject photos
- tags:
- - Park Media
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
- required: true
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '400':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/parks/photos/stats/:
- get:
- operationId: v1_parks_photos_stats_retrieve
- description: Get photo statistics for the park
- summary: Get park photo statistics
- tags:
- - Park Media
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ParkPhotoStatsOutput'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '500':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/:
- get:
- operationId: v1_rankings_list
- description: Get the current ride rankings calculated using the Internet Roller
- Coaster Poll algorithm.
- summary: List ride rankings
- parameters:
- - in: query
- name: category
- schema:
- type: string
- enum:
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: Filter by ride category (RC, DR, FR, WR, TR, OT)
- - in: query
- name: min_riders
- schema:
- type: integer
- description: Minimum number of mutual riders required
- - in: query
- name: ordering
- schema:
- type: string
- description: Order results (rank, -rank, winning_percentage, -winning_percentage)
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: park
- schema:
- type: string
- description: Filter by park slug
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRideRankingList'
- examples:
- RideRankingExample:
- value:
- count: 123
- next: http://api.example.org/accounts/?page=4
- previous: http://api.example.org/accounts/?page=2
- results:
- - id: 1
- rank: 1
- ride:
- id: 123
- name: Steel Vengeance
- slug: steel-vengeance
- park:
- id: 45
- name: Cedar Point
- slug: cedar-point
- category: RC
- wins: 523
- losses: 87
- ties: 45
- winning_percentage: 0.8234
- mutual_riders_count: 1250
- comparison_count: 655
- average_rating: 9.2
- last_calculated: '2024-01-15T02:00:00Z'
- rank_change: 2
- previous_rank: 3
- summary: Example ranking response
- description: A ride ranking with all metrics
- description: ''
- /api/v1/rankings/{ride_slug}/:
- get:
- operationId: v1_rankings_retrieve
- description: Get detailed ranking information for a specific ride.
- summary: Get ranking details
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideRankingDetail'
- description: ''
- '404':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/comparisons/:
- get:
- operationId: v1_rankings_comparisons_retrieve
- description: Get head-to-head comparisons for a specific ride
- summary: Get ride comparisons
- parameters:
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/{ride_slug}/history/:
- get:
- operationId: v1_rankings_history_list
- description: Get historical ranking data for a specific ride.
- summary: Get ranking history
- parameters:
- - name: ordering
- required: false
- in: query
- description: Which field to use when ordering the results.
- schema:
- type: string
- - name: page
- required: false
- in: query
- description: A page number within the paginated result set.
- schema:
- type: integer
- - in: query
- name: ride__category
- schema:
- type: string
- enum:
- - ''
- - DR
- - FR
- - OT
- - RC
- - TR
- - WR
- description: |-
- * `` - Select ride type
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `TR` - Transport
- * `OT` - Other
- - in: path
- name: ride_slug
- schema:
- type: string
- required: true
- tags:
- - Rankings
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PaginatedRankingSnapshotList'
- description: ''
- /api/v1/rankings/calculate/:
- post:
- operationId: v1_rankings_calculate_create
- description: Manually trigger a ranking calculation (admin only).
- summary: Trigger ranking calculation
- tags:
- - Rankings
- - Admin
- security:
- - cookieAuth: []
- - tokenAuth: []
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- '403':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rankings/statistics/:
- get:
- operationId: v1_rankings_statistics_retrieve
- description: Get overall statistics about the ranking system.
- summary: Get ranking statistics
- tags:
- - Rankings
- - Statistics
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RankingStats'
- description: ''
- /api/v1/rides/:
- get:
- operationId: v1_rides_list
- description: List rides with basic filtering and pagination.
- summary: List rides with filtering and pagination
- parameters:
- - in: query
- name: page
- schema:
- type: integer
- - in: query
- name: page_size
- schema:
- type: integer
- - in: query
- name: park_slug
- schema:
- type: string
- - in: query
- name: search
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RideListOutput'
- examples:
- RideListExample:
- value:
- - id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- average_rating: 4.8
- capacity_per_hour: 1200
- opening_date: '2018-05-05'
- summary: Example ride list response
- description: A typical ride in the list view
- description: ''
- post:
- operationId: v1_rides_create
- description: Create a new ride.
- summary: Create a new ride
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/{id}/:
- get:
- operationId: v1_rides_retrieve
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- put:
- operationId: v1_rides_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- patch:
- operationId: v1_rides_partial_update
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- delete:
- operationId: v1_rides_destroy
- summary: Retrieve, update or delete a ride
- parameters:
- - in: path
- name: id
- schema:
- type: integer
- required: true
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RideDetailOutput'
- examples:
- RideDetailExample:
- value:
- id: 1
- name: Steel Vengeance
- slug: steel-vengeance
- category: ROLLER_COASTER
- status: OPERATING
- description: Hybrid roller coaster featuring RMC I-Box track
- park:
- id: 1
- name: Cedar Point
- slug: cedar-point
- opening_date: '2018-05-05'
- min_height_in: 48
- capacity_per_hour: 1200
- ride_duration_seconds: 150
- average_rating: 4.8
- manufacturer:
- id: 1
- name: Rocky Mountain Construction
- slug: rocky-mountain-construction
- summary: Example ride detail response
- description: A complete ride detail response
- description: ''
- /api/v1/rides/filter-options/:
- get:
- operationId: v1_rides_filter_options_retrieve
- description: Return static/dynamic filter options used by the frontend.
- summary: Get filter options for rides
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search-suggestions/:
- get:
- operationId: v1_rides_search_suggestions_retrieve
- summary: Search suggestions for ride search box
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/rides/search/companies/:
- get:
- operationId: v1_rides_search_companies_retrieve
- summary: Search companies (manufacturers/designers) for autocomplete
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/rides/search/ride-models/:
- get:
- operationId: v1_rides_search_ride_models_retrieve
- summary: Search ride models for autocomplete
- parameters:
- - in: query
- name: q
- schema:
- type: string
- tags:
- - Rides
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- description: No response body
- /api/v1/trending/content/:
- get:
- operationId: v1_trending_content_retrieve
- description: Retrieve trending parks and rides based on view counts, ratings,
- and recency.
- summary: Get trending content
- parameters:
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of trending items to return (default: 20, max: 100)'
- - in: query
- name: timeframe
- schema:
- type: string
- enum:
- - day
- - month
- - week
- default: week
- description: 'Timeframe for trending calculation (day, week, month) - default:
- week'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
- /api/v1/trending/new/:
- get:
- operationId: v1_trending_new_retrieve
- description: Retrieve recently added parks and rides.
- summary: Get new content
- parameters:
- - in: query
- name: days
- schema:
- type: integer
- default: 30
- description: 'Number of days to look back for new content (default: 30, max:
- 365)'
- - in: query
- name: limit
- schema:
- type: integer
- default: 20
- description: 'Number of new items to return (default: 20, max: 100)'
- tags:
- - Trending
- security:
- - cookieAuth: []
- - tokenAuth: []
- - {}
- responses:
- '200':
- content:
- application/json:
- schema:
- type: object
- additionalProperties: {}
- description: ''
-components:
- schemas:
- ActionEnum:
- enum:
- - delete
- - approve
- - reject
- type: string
- description: |-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- AuthStatusOutput:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- AuthStatusOutputRequest:
- type: object
- description: Output serializer for authentication status.
- properties:
- authenticated:
- type: boolean
- description: Whether user is authenticated
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutputRequest'
- nullable: true
- description: User information if authenticated
- required:
- - authenticated
- - user
- BulkPhotoActionInputRequest:
- type: object
- description: Input serializer for bulk photo actions.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to perform action on
- action:
- allOf:
- - $ref: '#/components/schemas/ActionEnum'
- description: |-
- Action to perform on selected photos
-
- * `delete` - Delete
- * `approve` - Approve
- * `reject` - Reject
- required:
- - action
- - photo_ids
- BulkPhotoActionOutput:
- type: object
- description: Output serializer for bulk photo actions.
- properties:
- success_count:
- type: integer
- failed_count:
- type: integer
- error_messages:
- type: array
- items:
- type: string
- message:
- type: string
- required:
- - failed_count
- - message
- - success_count
- CategoryEnum:
- enum:
- - RC
- - DR
- - FR
- - WR
- - PK
- type: string
- description: |-
- * `RC` - Roller Coaster
- * `DR` - Dark Ride
- * `FR` - Flat Ride
- * `WR` - Water Ride
- * `PK` - Park
- HealthCheckOutput:
- type: object
- description: Output serializer for health check responses.
- properties:
- status:
- $ref: '#/components/schemas/HealthCheckOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- version:
- type: string
- environment:
- type: string
- response_time_ms:
- type: number
- format: double
- checks:
- type: object
- additionalProperties: {}
- metrics:
- type: object
- additionalProperties: {}
- required:
- - checks
- - environment
- - metrics
- - response_time_ms
- - status
- - timestamp
- - version
- HealthCheckOutputStatusEnum:
- enum:
- - healthy
- - unhealthy
- type: string
- description: |-
- * `healthy` - healthy
- * `unhealthy` - unhealthy
- HistorySummary:
- type: object
- description: Serializer for history summary information.
- properties:
- total_events:
- type: integer
- first_recorded:
- type: string
- format: date-time
- nullable: true
- last_modified:
- type: string
- format: date-time
- nullable: true
- required:
- - first_recorded
- - last_modified
- - total_events
- LoginInputRequest:
- type: object
- description: Input serializer for user login.
- properties:
- username:
- type: string
- minLength: 1
- description: Username or email address
- maxLength: 150
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- required:
- - password
- - username
- LoginOutput:
- type: object
- description: Output serializer for login response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- LogoutOutput:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- description: Success message
- required:
- - message
- LogoutOutputRequest:
- type: object
- description: Output serializer for logout response.
- properties:
- message:
- type: string
- minLength: 1
- description: Success message
- required:
- - message
- MediaStatsOutput:
- type: object
- description: Output serializer for media statistics.
- properties:
- total_photos:
- type: integer
- photos_by_content_type:
- type: object
- additionalProperties: {}
- recent_uploads:
- type: integer
- top_uploaders:
- type: array
- items: {}
- storage_usage:
- type: object
- additionalProperties: {}
- required:
- - photos_by_content_type
- - recent_uploads
- - storage_usage
- - top_uploaders
- - total_photos
- PaginatedParkHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- PaginatedParkPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/ParkPhotoListOutput'
- PaginatedPhotoListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/PhotoListOutput'
- PaginatedRankingSnapshotList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RankingSnapshot'
- PaginatedRideHistoryEventList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- PaginatedRideRankingList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/RideRanking'
- PaginatedTopListItemOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- PaginatedTopListOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/TopListOutput'
- PaginatedUnifiedHistoryTimelineList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UnifiedHistoryTimeline'
- PaginatedUserProfileOutputList:
- type: object
- required:
- - count
- - results
- properties:
- count:
- type: integer
- example: 123
- next:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=4
- previous:
- type: string
- nullable: true
- format: uri
- example: http://api.example.org/accounts/?page=2
- results:
- type: array
- items:
- $ref: '#/components/schemas/UserProfileOutput'
- ParkHistoryEvent:
- type: object
- description: Serializer for park history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- ParkHistoryOutput:
- type: object
- description: Output serializer for complete park history.
- properties:
- park:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/ParkHistoryEvent'
- required:
- - current_state
- - events
- - park
- - summary
- ParkPhotoApprovalInputRequest:
- type: object
- description: Input serializer for bulk photo approval operations.
- properties:
- photo_ids:
- type: array
- items:
- type: integer
- description: List of photo IDs to approve
- approve:
- type: boolean
- default: true
- description: Whether to approve (True) or reject (False) the photos
- required:
- - photo_ids
- ParkPhotoCreateInputRequest:
- type: object
- description: Input serializer for creating park photos.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- required:
- - image
- ParkPhotoListOutput:
- type: object
- description: Optimized output serializer for park photo lists.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- readOnly: true
- caption:
- type: string
- readOnly: true
- is_primary:
- type: boolean
- readOnly: true
- is_approved:
- type: boolean
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- uploaded_by_username:
- type: string
- readOnly: true
- required:
- - caption
- - created_at
- - id
- - image
- - is_approved
- - is_primary
- - uploaded_by_username
- ParkPhotoOutput:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- id:
- type: integer
- readOnly: true
- image:
- type: string
- format: uri
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- date_taken:
- type: string
- format: date-time
- nullable: true
- uploaded_by_username:
- type: string
- readOnly: true
- file_size:
- type: integer
- nullable: true
- description: File size in bytes
- readOnly: true
- dimensions:
- type: array
- items:
- type: integer
- nullable: true
- description: Image dimensions as [width, height] in pixels
- readOnly: true
- park_slug:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- required:
- - created_at
- - dimensions
- - file_size
- - id
- - image
- - park_name
- - park_slug
- - updated_at
- - uploaded_by_username
- ParkPhotoOutputRequest:
- type: object
- description: Enhanced output serializer for park photos with rich field structure.
- properties:
- image:
- type: string
- format: binary
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- is_approved:
- type: boolean
- date_taken:
- type: string
- format: date-time
- nullable: true
- required:
- - image
- ParkPhotoStatsOutput:
- type: object
- description: Output serializer for park photo statistics.
- properties:
- total_photos:
- type: integer
- approved_photos:
- type: integer
- pending_photos:
- type: integer
- has_primary:
- type: boolean
- recent_uploads:
- type: integer
- required:
- - approved_photos
- - has_primary
- - pending_photos
- - recent_uploads
- - total_photos
- ParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PasswordChangeInputRequest:
- type: object
- description: Input serializer for password change.
- properties:
- old_password:
- type: string
- writeOnly: true
- minLength: 1
- description: Current password
- new_password:
- type: string
- writeOnly: true
- minLength: 1
- description: New password
- new_password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: New password confirmation
- required:
- - new_password
- - new_password_confirm
- - old_password
- PasswordChangeOutput:
- type: object
- description: Output serializer for password change response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PasswordResetInputRequest:
- type: object
- description: Input serializer for password reset request.
- properties:
- email:
- type: string
- format: email
- minLength: 1
- description: Email address for password reset
- required:
- - email
- PasswordResetOutput:
- type: object
- description: Output serializer for password reset response.
- properties:
- detail:
- type: string
- description: Success message
- required:
- - detail
- PatchedParkPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating park photos.
- properties:
- caption:
- type: string
- maxLength: 255
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedPhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PatchedTopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- PatchedTopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- PatchedUserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- PerformanceMetricsOutput:
- type: object
- description: Output serializer for performance metrics.
- properties:
- timestamp:
- type: string
- format: date-time
- database_analysis:
- type: object
- additionalProperties: {}
- cache_performance:
- type: object
- additionalProperties: {}
- recent_slow_queries:
- type: array
- items: {}
- required:
- - cache_performance
- - database_analysis
- - recent_slow_queries
- - timestamp
- PhotoDetailOutput:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - uploaded_by
- - url
- - width
- PhotoDetailOutputRequest:
- type: object
- description: Output serializer for photo details.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- minLength: 1
- thumbnail_url:
- type: string
- format: uri
- minLength: 1
- caption:
- type: string
- minLength: 1
- alt_text:
- type: string
- minLength: 1
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- content_type:
- type: string
- minLength: 1
- object_id:
- type: integer
- file_size:
- type: integer
- width:
- type: integer
- height:
- type: integer
- format:
- type: string
- minLength: 1
- required:
- - alt_text
- - caption
- - content_type
- - file_size
- - format
- - height
- - id
- - is_primary
- - object_id
- - uploaded_at
- - url
- - width
- PhotoListOutput:
- type: object
- description: Output serializer for photo list view.
- properties:
- id:
- type: integer
- url:
- type: string
- format: uri
- thumbnail_url:
- type: string
- format: uri
- caption:
- type: string
- is_primary:
- type: boolean
- uploaded_at:
- type: string
- format: date-time
- uploaded_by:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - caption
- - id
- - is_primary
- - uploaded_at
- - uploaded_by
- - url
- PhotoUpdateInputRequest:
- type: object
- description: Input serializer for updating photos.
- properties:
- caption:
- type: string
- maxLength: 500
- alt_text:
- type: string
- maxLength: 255
- is_primary:
- type: boolean
- PhotoUploadInputRequest:
- type: object
- description: Input serializer for photo uploads.
- properties:
- photo:
- type: string
- format: binary
- description: The image file to upload
- app_label:
- type: string
- minLength: 1
- description: App label of the content object (e.g., 'parks', 'rides')
- maxLength: 100
- model:
- type: string
- minLength: 1
- description: Model name of the content object (e.g., 'park', 'ride')
- maxLength: 100
- object_id:
- type: integer
- description: ID of the content object
- caption:
- type: string
- description: Optional caption for the photo
- maxLength: 500
- alt_text:
- type: string
- description: Optional alt text for accessibility
- maxLength: 255
- is_primary:
- type: boolean
- default: false
- description: Whether this should be the primary photo
- photo_type:
- type: string
- minLength: 1
- default: general
- description: 'Type of photo (for rides: ''general'', ''on_ride'', ''construction'',
- etc.)'
- maxLength: 50
- required:
- - app_label
- - model
- - object_id
- - photo
- PhotoUploadOutput:
- type: object
- description: Output serializer for photo uploads.
- properties:
- id:
- type: integer
- url:
- type: string
- caption:
- type: string
- alt_text:
- type: string
- is_primary:
- type: boolean
- message:
- type: string
- required:
- - alt_text
- - caption
- - id
- - is_primary
- - message
- - url
- RankingSnapshot:
- type: object
- description: Serializer for ranking history snapshots.
- properties:
- id:
- type: integer
- readOnly: true
- ride:
- type: integer
- ride_name:
- type: string
- readOnly: true
- park_name:
- type: string
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- snapshot_date:
- type: string
- format: date
- description: Date when this ranking snapshot was taken
- required:
- - id
- - park_name
- - rank
- - ride
- - ride_name
- - snapshot_date
- - winning_percentage
- RankingStats:
- type: object
- description: Serializer for ranking system statistics.
- properties:
- total_ranked_rides:
- type: integer
- total_comparisons:
- type: integer
- last_calculation_time:
- type: string
- format: date-time
- calculation_duration:
- type: number
- format: double
- top_rated_ride:
- type: object
- additionalProperties: {}
- most_compared_ride:
- type: object
- additionalProperties: {}
- biggest_rank_change:
- type: object
- additionalProperties: {}
- required:
- - biggest_rank_change
- - calculation_duration
- - last_calculation_time
- - most_compared_ride
- - top_rated_ride
- - total_comparisons
- - total_ranked_rides
- RideDetailOutput:
- type: object
- description: Output serializer for ride detail view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- post_closing_status:
- type: string
- nullable: true
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- park_area:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- status_since:
- type: string
- format: date
- nullable: true
- min_height_in:
- type: integer
- nullable: true
- max_height_in:
- type: integer
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- ride_duration_seconds:
- type: integer
- nullable: true
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- designer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- ride_model:
- allOf:
- - $ref: '#/components/schemas/RideModelOutput'
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - designer
- - id
- - manufacturer
- - max_height_in
- - min_height_in
- - name
- - opening_date
- - park
- - park_area
- - post_closing_status
- - ride_duration_seconds
- - ride_model
- - slug
- - status
- - status_since
- - updated_at
- RideHistoryEvent:
- type: object
- description: Serializer for ride history events.
- properties:
- pgh_id:
- type: integer
- readOnly: true
- pgh_created_at:
- type: string
- format: date-time
- readOnly: true
- pgh_label:
- type: string
- readOnly: true
- pgh_obj_id:
- type: integer
- readOnly: true
- pgh_context:
- readOnly: true
- nullable: true
- pgh_data:
- readOnly: true
- event_type:
- type: string
- readOnly: true
- changes:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - changes
- - event_type
- - pgh_context
- - pgh_created_at
- - pgh_data
- - pgh_id
- - pgh_label
- - pgh_obj_id
- RideHistoryOutput:
- type: object
- description: Output serializer for complete ride history.
- properties:
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- current_state:
- type: object
- additionalProperties: {}
- readOnly: true
- summary:
- $ref: '#/components/schemas/HistorySummary'
- events:
- type: array
- items:
- $ref: '#/components/schemas/RideHistoryEvent'
- required:
- - current_state
- - events
- - ride
- - summary
- RideListOutput:
- type: object
- description: Output serializer for ride list view.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- category:
- type: string
- status:
- type: string
- description:
- type: string
- park:
- $ref: '#/components/schemas/RideParkOutput'
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- capacity_per_hour:
- type: integer
- nullable: true
- opening_date:
- type: string
- format: date
- nullable: true
- closing_date:
- type: string
- format: date
- nullable: true
- created_at:
- type: string
- format: date-time
- updated_at:
- type: string
- format: date-time
- required:
- - average_rating
- - capacity_per_hour
- - category
- - closing_date
- - created_at
- - description
- - id
- - name
- - opening_date
- - park
- - slug
- - status
- - updated_at
- RideModelOutput:
- type: object
- description: Output serializer for ride model data.
- properties:
- id:
- type: integer
- name:
- type: string
- description:
- type: string
- category:
- type: string
- manufacturer:
- type: object
- additionalProperties: {}
- nullable: true
- readOnly: true
- required:
- - category
- - description
- - id
- - manufacturer
- - name
- RideParkOutput:
- type: object
- description: Output serializer for ride's park data.
- properties:
- id:
- type: integer
- name:
- type: string
- slug:
- type: string
- required:
- - id
- - name
- - slug
- RideRanking:
- type: object
- description: Serializer for ride rankings.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- rank_change:
- type: integer
- nullable: true
- readOnly: true
- previous_rank:
- type: integer
- nullable: true
- readOnly: true
- required:
- - id
- - previous_rank
- - rank
- - rank_change
- - ride
- - winning_percentage
- RideRankingDetail:
- type: object
- description: Detailed serializer for a specific ride's ranking.
- properties:
- id:
- type: integer
- readOnly: true
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Overall rank position (1 = best)
- ride:
- type: object
- additionalProperties: {}
- readOnly: true
- wins:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides this ride beats in pairwise comparisons
- losses:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides that beat this ride in pairwise comparisons
- ties:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of rides with equal preference in pairwise comparisons
- winning_percentage:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
- description: Win percentage where ties count as 0.5
- mutual_riders_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Total number of users who have rated this ride
- comparison_count:
- type: integer
- maximum: 2147483647
- minimum: 0
- description: Number of other rides this was compared against
- average_rating:
- type: string
- format: decimal
- pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
- nullable: true
- description: Average rating from all users who have rated this ride
- last_calculated:
- type: string
- format: date-time
- description: When this ranking was last calculated
- calculation_version:
- type: string
- description: Algorithm version used for calculation
- maxLength: 10
- head_to_head_comparisons:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- ranking_history:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - head_to_head_comparisons
- - id
- - rank
- - ranking_history
- - ride
- - winning_percentage
- SignupInputRequest:
- type: object
- description: Input serializer for user registration.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- password:
- type: string
- writeOnly: true
- minLength: 1
- description: User password
- password_confirm:
- type: string
- writeOnly: true
- minLength: 1
- description: Password confirmation
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - password
- - password_confirm
- - username
- SignupOutput:
- type: object
- description: Output serializer for registration response.
- properties:
- token:
- type: string
- description: Authentication token
- user:
- allOf:
- - $ref: '#/components/schemas/UserOutput'
- description: User information
- message:
- type: string
- description: Success message
- required:
- - message
- - token
- - user
- SimpleHealthOutput:
- type: object
- description: Output serializer for simple health check.
- properties:
- status:
- $ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
- timestamp:
- type: string
- format: date-time
- error:
- type: string
- required:
- - status
- - timestamp
- SimpleHealthOutputStatusEnum:
- enum:
- - ok
- - error
- type: string
- description: |-
- * `ok` - ok
- * `error` - error
- TopListCreateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- user:
- type: integer
- required:
- - category
- - title
- - user
- TopListItemCreateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - created_at
- - id
- - object_id
- - rank
- - top_list
- - updated_at
- TopListItemOutputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListItemUpdateInputRequest:
- type: object
- properties:
- object_id:
- type: integer
- maximum: 2147483647
- minimum: 0
- rank:
- type: integer
- maximum: 2147483647
- minimum: 0
- notes:
- type: string
- top_list:
- type: integer
- content_type:
- type: integer
- required:
- - content_type
- - object_id
- - rank
- - top_list
- TopListOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- items:
- type: array
- items:
- $ref: '#/components/schemas/TopListItemOutput'
- readOnly: true
- title:
- type: string
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- created_at:
- type: string
- format: date-time
- readOnly: true
- updated_at:
- type: string
- format: date-time
- readOnly: true
- required:
- - category
- - created_at
- - id
- - items
- - title
- - updated_at
- - user
- TopListOutputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- TopListUpdateInputRequest:
- type: object
- properties:
- title:
- type: string
- minLength: 1
- maxLength: 100
- category:
- $ref: '#/components/schemas/CategoryEnum'
- description:
- type: string
- required:
- - category
- - title
- UnifiedHistoryTimeline:
- type: object
- description: Serializer for unified history timeline.
- properties:
- summary:
- type: object
- additionalProperties: {}
- readOnly: true
- events:
- type: array
- items:
- type: object
- additionalProperties: {}
- readOnly: true
- required:
- - events
- - summary
- User:
- type: object
- description: User serializer for API responses
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- date_joined:
- type: string
- format: date-time
- readOnly: true
- is_active:
- type: boolean
- readOnly: true
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- avatar_url:
- type: string
- nullable: true
- description: Get user avatar URL
- readOnly: true
- required:
- - avatar_url
- - date_joined
- - id
- - is_active
- - username
- UserOutput:
- type: object
- description: Output serializer for user data.
- properties:
- id:
- type: integer
- readOnly: true
- username:
- type: string
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- date_joined:
- type: string
- format: date-time
- readOnly: true
- required:
- - date_joined
- - id
- - username
- UserOutputRequest:
- type: object
- description: Output serializer for user data.
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- is_active:
- type: boolean
- title: Active
- description: Designates whether this user should be treated as active. Unselect
- this instead of deleting accounts.
- required:
- - username
- UserProfileCreateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- user:
- type: integer
- required:
- - display_name
- - user
- UserProfileOutput:
- type: object
- properties:
- id:
- type: integer
- readOnly: true
- user:
- allOf:
- - $ref: '#/components/schemas/User'
- readOnly: true
- avatar_url:
- type: string
- format: uri
- nullable: true
- readOnly: true
- profile_id:
- type: string
- readOnly: true
- description: Unique identifier for this profile that remains constant
- display_name:
- type: string
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: uri
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - avatar_url
- - display_name
- - id
- - profile_id
- - user
- UserProfileUpdateInputRequest:
- type: object
- properties:
- display_name:
- type: string
- minLength: 1
- description: This is the name that will be displayed on the site
- maxLength: 50
- avatar:
- type: string
- format: binary
- pronouns:
- type: string
- maxLength: 50
- bio:
- type: string
- maxLength: 500
- twitter:
- type: string
- format: uri
- maxLength: 200
- instagram:
- type: string
- format: uri
- maxLength: 200
- youtube:
- type: string
- format: uri
- maxLength: 200
- discord:
- type: string
- maxLength: 100
- coaster_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- dark_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- flat_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- water_ride_credits:
- type: integer
- maximum: 2147483647
- minimum: -2147483648
- required:
- - display_name
- UserRequest:
- type: object
- description: User serializer for API responses
- properties:
- username:
- type: string
- minLength: 1
- description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
- only.
- pattern: ^[\w.@+-]+$
- maxLength: 150
- email:
- type: string
- format: email
- title: Email address
- maxLength: 254
- first_name:
- type: string
- maxLength: 150
- last_name:
- type: string
- maxLength: 150
- required:
- - username
- securitySchemes:
- cookieAuth:
- type: apiKey
- in: cookie
- name: sessionid
- tokenAuth:
- type: apiKey
- in: header
- name: Authorization
- description: Token-based authentication with required prefix "Token"
-tags:
-- name: Parks
- description: Theme park operations
-- name: Rides
- description: Ride information and management
-- name: Statistics
- description: Statistical endpoints providing aggregated data and insights
diff --git a/setup_social_providers.py b/setup_social_providers.py
deleted file mode 100644
index 85dd6700..00000000
--- a/setup_social_providers.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-"""
-Script to set up social authentication providers for development.
-Run this with: uv run manage.py shell < setup_social_providers.py
-"""
-
-from allauth.socialaccount.models import SocialApp
-from django.contrib.sites.models import Site
-
-# Get the current site
-site = Site.objects.get_current()
-print(f"Setting up social providers for site: {site}")
-
-# Clear existing social apps to avoid duplicates
-SocialApp.objects.all().delete()
-print("Cleared existing social apps")
-
-# Create Google social app
-google_app = SocialApp.objects.create(
- provider="google",
- name="Google",
- client_id="demo-google-client-id.apps.googleusercontent.com",
- secret="demo-google-client-secret",
- key="", # Not used for Google
-)
-google_app.sites.add(site)
-print("✅ Created Google social app")
-
-# Create Discord social app
-discord_app = SocialApp.objects.create(
- provider="discord",
- name="Discord",
- client_id="demo-discord-client-id",
- secret="demo-discord-client-secret",
- key="", # Not used for Discord
-)
-discord_app.sites.add(site)
-print("✅ Created Discord social app")
-
-# List all social apps
-print("\nConfigured social apps:")
-for app in SocialApp.objects.all():
- print(f"- {app.name} ({app.provider}): {app.client_id}")
-
-print(f"\nTotal social apps: {SocialApp.objects.count()}")
diff --git a/temp_secret.txt b/temp_secret.txt
deleted file mode 100644
index 8d9bf684..00000000
--- a/temp_secret.txt
+++ /dev/null
@@ -1 +0,0 @@
-SECRET_KEY=django-insecure-dev-key-for-replit-P6s9nnrqG-aEktGOOZm-GsGEvGC117gdjmRqHif8rSM
diff --git a/test-args.sh b/test-args.sh
deleted file mode 100755
index 5d8c787c..00000000
--- a/test-args.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-
-# Parse options FIRST
-echo "DEBUG: Arguments received: $@"
-echo "DEBUG: Number of arguments: $#"
-
-while [[ $# -gt 0 ]]; do
- echo "DEBUG: Processing argument: $1"
- case "$1" in
- --non-interactive)
- export NON_INTERACTIVE="true"
- echo "DEBUG: NON_INTERACTIVE set to $NON_INTERACTIVE"
- shift
- ;;
- --debug)
- export CONFIG_DEBUG="true"
- echo "DEBUG: CONFIG_DEBUG set to $CONFIG_DEBUG"
- shift
- ;;
- -*)
- echo "Unknown option: $1"
- exit 1
- ;;
- *)
- # This is the command - stop parsing options
- echo "DEBUG: Found command argument: $1, breaking"
- break
- ;;
- esac
-done
-
-# NOW set the command after options are parsed
-local_command="${1:-setup}"
-echo "DEBUG: Command is: $local_command"
-echo "DEBUG: NON_INTERACTIVE is: ${NON_INTERACTIVE:-unset}"
-echo "DEBUG: CONFIG_DEBUG is: ${CONFIG_DEBUG:-unset}"
-
-# Test the conditional logic
-if [[ "$NON_INTERACTIVE" != "true" ]]; then
- echo "WOULD SHOW: Interactive banner and prompt"
-else
- echo "WOULD SKIP: Interactive banner and prompt (non-interactive mode)"
-fi
\ No newline at end of file
diff --git a/test-auto-pull.md b/test-auto-pull.md
deleted file mode 100644
index e230dbf6..00000000
--- a/test-auto-pull.md
+++ /dev/null
@@ -1 +0,0 @@
-# Auto-pull test - Sun Aug 17 11:29:56 EDT 2025
diff --git a/test_all_endpoints.sh b/test_all_endpoints.sh
deleted file mode 100755
index 8efff93c..00000000
--- a/test_all_endpoints.sh
+++ /dev/null
@@ -1,293 +0,0 @@
-#!/bin/bash
-
-# ThrillWiki API Endpoint Testing Script
-# Tests all available API endpoints with curl
-# Base URL: http://127.0.0.1:8000
-
-BASE_URL="http://127.0.0.1:8000"
-
-# Colors for output formatting
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-BLUE='\033[0;34m'
-NC='\033[0m' # No Color
-
-# Function to print section headers
-print_header() {
- echo -e "\n${BLUE}=== $1 ===${NC}"
-}
-
-# Function to make curl request and display raw output
-test_endpoint() {
- local method=$1
- local endpoint=$2
- local description=$3
- local data=$4
-
- echo -e "\n${YELLOW}$description${NC}"
- echo -e "${GREEN}$method $endpoint${NC}"
-
- if [ "$method" = "GET" ]; then
- curl -s "$BASE_URL$endpoint"
- elif [ "$method" = "POST" ] && [ -n "$data" ]; then
- curl -s -X POST -H "Content-Type: application/json" -d "$data" "$BASE_URL$endpoint"
- elif [ "$method" = "POST" ]; then
- curl -s -X POST -H "Content-Type: application/json" "$BASE_URL$endpoint"
- elif [ "$method" = "PUT" ] && [ -n "$data" ]; then
- curl -s -X PUT -H "Content-Type: application/json" -d "$data" "$BASE_URL$endpoint"
- elif [ "$method" = "PATCH" ] && [ -n "$data" ]; then
- curl -s -X PATCH -H "Content-Type: application/json" -d "$data" "$BASE_URL$endpoint"
- elif [ "$method" = "DELETE" ]; then
- curl -s -X DELETE "$BASE_URL$endpoint"
- fi
- echo -e "\n"
-}
-
-# Main page
-print_header "HOME PAGE"
-test_endpoint "GET" "/" "Home page"
-
-# Health checks
-print_header "HEALTH CHECKS"
-test_endpoint "GET" "/health/" "Django health check"
-test_endpoint "GET" "/api/v1/health/" "API health check"
-test_endpoint "GET" "/api/v1/health/simple/" "Simple health check"
-test_endpoint "GET" "/api/v1/health/performance/" "Performance metrics"
-
-# API Documentation
-print_header "API DOCUMENTATION"
-test_endpoint "GET" "/api/schema/" "API schema"
-test_endpoint "GET" "/api/docs/" "Swagger UI"
-test_endpoint "GET" "/api/redoc/" "ReDoc documentation"
-
-# Authentication endpoints
-print_header "AUTHENTICATION"
-test_endpoint "GET" "/api/v1/auth/status/" "Auth status"
-test_endpoint "POST" "/api/v1/auth/login/" "Login" '{"username":"test","password":"test"}'
-test_endpoint "POST" "/api/v1/auth/signup/" "Signup" '{"username":"test","email":"test@example.com","password":"test123"}'
-test_endpoint "POST" "/api/v1/auth/logout/" "Logout"
-test_endpoint "GET" "/api/v1/auth/user/" "Current user"
-test_endpoint "POST" "/api/v1/auth/token/refresh/" "Refresh JWT token"
-test_endpoint "POST" "/api/v1/auth/password/reset/" "Password reset" '{"email":"test@example.com"}'
-test_endpoint "POST" "/api/v1/auth/password/change/" "Password change" '{"old_password":"old","new_password":"new"}'
-
-# Social authentication
-print_header "SOCIAL AUTHENTICATION"
-test_endpoint "GET" "/api/v1/auth/social/providers/" "Social providers"
-test_endpoint "GET" "/api/v1/auth/social/providers/available/" "Available providers"
-test_endpoint "GET" "/api/v1/auth/social/connected/" "Connected providers"
-test_endpoint "GET" "/api/v1/auth/social/status/" "Social auth status"
-test_endpoint "POST" "/api/v1/auth/social/connect/google/" "Connect Google (example)"
-test_endpoint "POST" "/api/v1/auth/social/disconnect/google/" "Disconnect Google (example)"
-
-# Email verification
-test_endpoint "POST" "/api/v1/auth/resend-verification/" "Resend email verification"
-test_endpoint "GET" "/api/v1/auth/verify-email/sample-token/" "Verify email (sample token)"
-
-# Parks API
-print_header "PARKS API"
-test_endpoint "GET" "/api/v1/parks/" "List parks"
-test_endpoint "POST" "/api/v1/parks/" "Create park" '{"name":"Test Park","location":"Test Location"}'
-test_endpoint "GET" "/api/v1/parks/hybrid/" "Hybrid park list"
-test_endpoint "GET" "/api/v1/parks/hybrid/filter-metadata/" "Park filter metadata"
-test_endpoint "GET" "/api/v1/parks/filter-options/" "Park filter options"
-test_endpoint "GET" "/api/v1/parks/search/companies/" "Search companies"
-test_endpoint "GET" "/api/v1/parks/search-suggestions/" "Park search suggestions"
-test_endpoint "GET" "/api/v1/parks/1/" "Park detail (ID 1)"
-test_endpoint "GET" "/api/v1/parks/sample-park/" "Park detail (slug)"
-test_endpoint "GET" "/api/v1/parks/1/image-settings/" "Park image settings"
-
-# Park photos
-print_header "PARK PHOTOS"
-test_endpoint "GET" "/api/v1/parks/1/photos/" "List park photos"
-test_endpoint "POST" "/api/v1/parks/1/photos/" "Upload park photo"
-test_endpoint "GET" "/api/v1/parks/1/photos/1/" "Park photo detail"
-
-# Rides API
-print_header "RIDES API"
-test_endpoint "GET" "/api/v1/rides/" "List rides"
-test_endpoint "POST" "/api/v1/rides/" "Create ride" '{"name":"Test Ride","park":1}'
-test_endpoint "GET" "/api/v1/rides/hybrid/" "Hybrid ride filtering"
-test_endpoint "GET" "/api/v1/rides/hybrid/filter-metadata/" "Ride filter metadata"
-test_endpoint "GET" "/api/v1/rides/filter-options/" "Ride filter options"
-test_endpoint "GET" "/api/v1/rides/search/companies/" "Search ride companies"
-test_endpoint "GET" "/api/v1/rides/search/ride-models/" "Search ride models"
-test_endpoint "GET" "/api/v1/rides/search-suggestions/" "Ride search suggestions"
-test_endpoint "GET" "/api/v1/rides/1/" "Ride detail"
-test_endpoint "GET" "/api/v1/rides/1/image-settings/" "Ride image settings"
-
-# Ride photos
-print_header "RIDE PHOTOS"
-test_endpoint "GET" "/api/v1/rides/1/photos/" "List ride photos"
-test_endpoint "POST" "/api/v1/rides/1/photos/" "Upload ride photo"
-test_endpoint "GET" "/api/v1/rides/1/photos/1/" "Ride photo detail"
-
-# Ride manufacturers and models
-print_header "RIDE MANUFACTURERS & MODELS"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/" "Manufacturer ride models"
-test_endpoint "POST" "/api/v1/rides/manufacturers/sample-manufacturer/" "Create ride model"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/search/" "Search ride models"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/filter-options/" "Model filter options"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/stats/" "Model stats"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/sample-model/" "Ride model detail"
-
-# Ride model variants and specs
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/sample-model/variants/" "Model variants"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/sample-model/variants/1/" "Variant detail"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/sample-model/technical-specs/" "Technical specs"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/sample-model/technical-specs/1/" "Tech spec detail"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/sample-model/photos/" "Model photos"
-test_endpoint "GET" "/api/v1/rides/manufacturers/sample-manufacturer/sample-model/photos/1/" "Model photo detail"
-
-# Rankings API
-print_header "RANKINGS API"
-test_endpoint "GET" "/api/v1/rankings/" "List rankings"
-test_endpoint "POST" "/api/v1/rankings/calculate/" "Trigger ranking calculation"
-
-# Trending API
-print_header "TRENDING & NEW CONTENT"
-test_endpoint "GET" "/api/v1/trending/" "Trending content"
-test_endpoint "GET" "/api/v1/new-content/" "New content"
-test_endpoint "POST" "/api/v1/trending/calculate/" "Trigger trending calculation"
-
-# Statistics API
-print_header "STATISTICS"
-test_endpoint "GET" "/api/v1/stats/" "Site statistics"
-test_endpoint "POST" "/api/v1/stats/recalculate/" "Recalculate statistics"
-
-# Reviews API
-print_header "REVIEWS"
-test_endpoint "GET" "/api/v1/reviews/latest/" "Latest reviews"
-
-# Account management
-print_header "ACCOUNT MANAGEMENT"
-test_endpoint "GET" "/api/v1/accounts/profile/" "User profile"
-test_endpoint "PUT" "/api/v1/accounts/profile/update/" "Update profile"
-test_endpoint "GET" "/api/v1/accounts/profile/account/" "Account info"
-test_endpoint "PUT" "/api/v1/accounts/profile/account/" "Update account"
-
-# User preferences
-print_header "USER PREFERENCES"
-test_endpoint "GET" "/api/v1/accounts/preferences/" "User preferences"
-test_endpoint "PUT" "/api/v1/accounts/preferences/update/" "Update preferences"
-test_endpoint "PUT" "/api/v1/accounts/preferences/theme/" "Update theme"
-
-# Notification settings
-test_endpoint "GET" "/api/v1/accounts/settings/notifications/" "Notification settings"
-test_endpoint "PUT" "/api/v1/accounts/settings/notifications/update/" "Update notifications"
-
-# Privacy settings
-test_endpoint "GET" "/api/v1/accounts/settings/privacy/" "Privacy settings"
-test_endpoint "PUT" "/api/v1/accounts/settings/privacy/update/" "Update privacy"
-
-# Security settings
-test_endpoint "GET" "/api/v1/accounts/settings/security/" "Security settings"
-test_endpoint "PUT" "/api/v1/accounts/settings/security/update/" "Update security"
-
-# User statistics and top lists
-test_endpoint "GET" "/api/v1/accounts/statistics/" "User statistics"
-test_endpoint "GET" "/api/v1/accounts/top-lists/" "User top lists"
-test_endpoint "POST" "/api/v1/accounts/top-lists/create/" "Create top list"
-test_endpoint "PUT" "/api/v1/accounts/top-lists/1/" "Update top list"
-test_endpoint "DELETE" "/api/v1/accounts/top-lists/1/" "Delete top list"
-
-# Notifications
-print_header "NOTIFICATIONS"
-test_endpoint "GET" "/api/v1/accounts/notifications/" "User notifications"
-test_endpoint "POST" "/api/v1/accounts/notifications/mark-read/" "Mark notifications read"
-test_endpoint "GET" "/api/v1/accounts/notification-preferences/" "Notification preferences"
-test_endpoint "PUT" "/api/v1/accounts/notification-preferences/update/" "Update notification preferences"
-
-# Avatar management
-test_endpoint "POST" "/api/v1/accounts/profile/avatar/upload/" "Upload avatar"
-test_endpoint "POST" "/api/v1/accounts/profile/avatar/save/" "Save avatar"
-test_endpoint "DELETE" "/api/v1/accounts/profile/avatar/delete/" "Delete avatar"
-
-# Account deletion
-print_header "ACCOUNT DELETION"
-test_endpoint "POST" "/api/v1/accounts/delete-account/request/" "Request account deletion"
-test_endpoint "POST" "/api/v1/accounts/delete-account/verify/" "Verify account deletion"
-test_endpoint "POST" "/api/v1/accounts/delete-account/cancel/" "Cancel account deletion"
-test_endpoint "GET" "/api/v1/accounts/users/sample-id/deletion-check/" "Check deletion eligibility"
-test_endpoint "DELETE" "/api/v1/accounts/users/sample-id/delete/" "Admin delete user"
-
-# History API
-print_header "HISTORY"
-test_endpoint "GET" "/api/v1/history/timeline/" "Unified timeline"
-test_endpoint "GET" "/api/v1/history/parks/sample-park/" "Park history list"
-test_endpoint "GET" "/api/v1/history/parks/sample-park/detail/" "Park history detail"
-test_endpoint "GET" "/api/v1/history/parks/sample-park/rides/sample-ride/" "Ride history list"
-test_endpoint "GET" "/api/v1/history/parks/sample-park/rides/sample-ride/detail/" "Ride history detail"
-
-# Email API
-print_header "EMAIL"
-test_endpoint "POST" "/api/v1/email/send/" "Send email" '{"to":"test@example.com","subject":"Test","message":"Test message"}'
-
-# Core API
-print_header "CORE SEARCH & ENTITIES"
-test_endpoint "GET" "/api/v1/core/entities/search/" "Entity fuzzy search"
-test_endpoint "GET" "/api/v1/core/entities/not-found/" "Entity not found"
-test_endpoint "GET" "/api/v1/core/entities/suggestions/" "Quick entity suggestions"
-
-# Maps API
-print_header "MAPS"
-test_endpoint "GET" "/api/v1/maps/locations/" "Map locations"
-test_endpoint "GET" "/api/v1/maps/locations/park/1/" "Map location detail"
-test_endpoint "GET" "/api/v1/maps/search/" "Map search"
-test_endpoint "GET" "/api/v1/maps/bounds/" "Map bounds query"
-test_endpoint "GET" "/api/v1/maps/stats/" "Map statistics"
-test_endpoint "GET" "/api/v1/maps/cache/" "Map cache info"
-test_endpoint "POST" "/api/v1/maps/cache/invalidate/" "Invalidate map cache"
-
-# Moderation API
-print_header "MODERATION"
-test_endpoint "GET" "/api/v1/moderation/reports/" "List reports"
-test_endpoint "POST" "/api/v1/moderation/reports/" "Create report"
-test_endpoint "GET" "/api/v1/moderation/reports/1/" "Report detail"
-test_endpoint "GET" "/api/v1/moderation/reports/stats/" "Report stats"
-test_endpoint "POST" "/api/v1/moderation/reports/1/assign/" "Assign report"
-test_endpoint "POST" "/api/v1/moderation/reports/1/resolve/" "Resolve report"
-
-# Moderation queue
-test_endpoint "GET" "/api/v1/moderation/queue/" "Moderation queue"
-test_endpoint "GET" "/api/v1/moderation/queue/1/" "Queue item detail"
-test_endpoint "GET" "/api/v1/moderation/queue/my_queue/" "My queue items"
-test_endpoint "POST" "/api/v1/moderation/queue/1/assign/" "Assign queue item"
-test_endpoint "POST" "/api/v1/moderation/queue/1/unassign/" "Unassign queue item"
-test_endpoint "POST" "/api/v1/moderation/queue/1/complete/" "Complete queue item"
-
-# Moderation actions
-test_endpoint "GET" "/api/v1/moderation/actions/" "Moderation actions"
-test_endpoint "GET" "/api/v1/moderation/actions/active/" "Active actions"
-test_endpoint "GET" "/api/v1/moderation/actions/expired/" "Expired actions"
-test_endpoint "POST" "/api/v1/moderation/actions/1/deactivate/" "Deactivate action"
-
-# Bulk operations
-test_endpoint "GET" "/api/v1/moderation/bulk-operations/" "Bulk operations"
-test_endpoint "GET" "/api/v1/moderation/bulk-operations/running/" "Running operations"
-test_endpoint "GET" "/api/v1/moderation/bulk-operations/1/" "Bulk operation detail"
-test_endpoint "GET" "/api/v1/moderation/bulk-operations/1/logs/" "Operation logs"
-test_endpoint "POST" "/api/v1/moderation/bulk-operations/1/cancel/" "Cancel operation"
-test_endpoint "POST" "/api/v1/moderation/bulk-operations/1/retry/" "Retry operation"
-
-# User moderation
-test_endpoint "GET" "/api/v1/moderation/users/1/" "User moderation profile"
-test_endpoint "POST" "/api/v1/moderation/users/1/moderate/" "Moderate user"
-test_endpoint "GET" "/api/v1/moderation/users/search/" "Search users for moderation"
-test_endpoint "GET" "/api/v1/moderation/users/stats/" "User moderation stats"
-
-# Cloudflare Images Toolkit
-print_header "CLOUDFLARE IMAGES"
-test_endpoint "GET" "/api/v1/cloudflare-images/" "Cloudflare Images endpoints (varies by toolkit)"
-
-# Environment and settings
-print_header "ENVIRONMENT & SETTINGS"
-test_endpoint "GET" "/env-settings/" "Environment and settings"
-
-# Static pages
-print_header "STATIC PAGES"
-test_endpoint "GET" "/terms/" "Terms of service"
-test_endpoint "GET" "/privacy/" "Privacy policy"
-
-echo -e "\n${GREEN}=== All endpoint tests completed ===${NC}"
\ No newline at end of file
diff --git a/test_avatar.txt b/test_avatar.txt
deleted file mode 100644
index 9897ba21..00000000
--- a/test_avatar.txt
+++ /dev/null
@@ -1 +0,0 @@
-Testing image file validation
diff --git a/test_avatar_upload.py b/test_avatar_upload.py
deleted file mode 100644
index eb52b8b7..00000000
--- a/test_avatar_upload.py
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/usr/bin/env python
-"""
-Test script for the 3-step avatar upload process.
-This script will:
-1. Request an upload URL
-2. Upload an image to Cloudflare
-3. Save the avatar reference
-"""
-
-import requests
-
-# Configuration
-BASE_URL = "http://127.0.0.1:8000"
-API_BASE = f"{BASE_URL}/api/v1"
-
-# You'll need to get these from your browser's developer tools or login endpoint
-ACCESS_TOKEN = "your_jwt_token_here" # Replace with actual token
-REFRESH_TOKEN = "your_refresh_token_here" # Replace with actual token
-
-# Headers for authenticated requests
-HEADERS = {
- "Authorization": f"Bearer {ACCESS_TOKEN}",
- "Content-Type": "application/json",
-}
-
-
-def step1_get_upload_url():
- """Step 1: Get upload URL from django-cloudflareimages-toolkit"""
- print("Step 1: Requesting upload URL...")
-
- url = f"{API_BASE}/cloudflare-images/api/upload-url/"
- data = {
- "metadata": {
- "type": "avatar",
- "userId": "7627" # Replace with your user ID
- },
- "require_signed_urls": False
- }
-
- response = requests.post(url, json=data, headers=HEADERS)
- print(f"Status: {response.status_code}")
- print(f"Response: {response.json()}")
-
- if response.status_code == 201:
- result = response.json()
- return result["upload_url"], result["cloudflare_id"]
- else:
- raise Exception(f"Failed to get upload URL: {response.text}")
-
-
-def step2_upload_image(upload_url):
- """Step 2: Upload image directly to Cloudflare"""
- print("\nStep 2: Uploading image to Cloudflare...")
-
- # Create a simple test image (1x1 pixel PNG)
- # This is a minimal valid PNG file
- png_data = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00\x00\x00\tpHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x12IDATx\x9cc```bPPP\x00\x02\xd2\x00\x00\x00\x05\x00\x01\r\n-\xdb\x00\x00\x00\x00IEND\xaeB`\x82'
-
- files = {
- 'file': ('test_avatar.png', png_data, 'image/png')
- }
-
- # Upload to Cloudflare (no auth headers needed for direct upload)
- response = requests.post(upload_url, files=files)
- print(f"Status: {response.status_code}")
- print(f"Response: {response.json()}")
-
- if response.status_code in [200, 201]:
- return response.json()
- else:
- raise Exception(f"Failed to upload image: {response.text}")
-
-
-def step3_save_avatar(cloudflare_id):
- """Step 3: Save avatar reference in our system"""
- print("\nStep 3: Saving avatar reference...")
-
- url = f"{API_BASE}/accounts/profile/avatar/save/"
- data = {
- "cloudflare_image_id": cloudflare_id
- }
-
- response = requests.post(url, json=data, headers=HEADERS)
- print(f"Status: {response.status_code}")
- print(f"Response: {response.json()}")
-
- if response.status_code == 200:
- return response.json()
- else:
- raise Exception(f"Failed to save avatar: {response.text}")
-
-
-def main():
- """Run the complete 3-step process"""
- try:
- # Step 1: Get upload URL
- upload_url, cloudflare_id = step1_get_upload_url()
-
- # Step 2: Upload image
- upload_result = step2_upload_image(upload_url)
-
- # Step 3: Save avatar reference
- save_result = step3_save_avatar(cloudflare_id)
-
- print("\n✅ Success! Avatar upload completed.")
- print(f"Avatar URL: {save_result.get('avatar_url')}")
-
- except Exception as e:
- print(f"\n❌ Error: {e}")
-
-
-if __name__ == "__main__":
- print("🚀 Testing 3-step avatar upload process...")
- print("⚠️ Make sure to update ACCESS_TOKEN in the script!")
- print()
-
- if ACCESS_TOKEN == "your_jwt_token_here":
- print("❌ Please update ACCESS_TOKEN in the script first!")
- print("You can get it from:")
- print("1. Browser developer tools after logging in")
- print("2. Or use the login endpoint to get a token")
- exit(1)
-
- main()
diff --git a/test_endpoints_raw.sh b/test_endpoints_raw.sh
deleted file mode 100755
index b81eefba..00000000
--- a/test_endpoints_raw.sh
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/bin/bash
-
-# ThrillWiki API Endpoint Testing Script - Raw Output Only
-# Base URL: http://127.0.0.1:8000
-
-BASE_URL="http://127.0.0.1:8000"
-
-echo "=== HOME PAGE ==="
-curl -s "$BASE_URL/"
-
-echo -e "\n=== HEALTH CHECKS ==="
-curl -s "$BASE_URL/health/"
-curl -s "$BASE_URL/api/v1/health/"
-curl -s "$BASE_URL/api/v1/health/simple/"
-curl -s "$BASE_URL/api/v1/health/performance/"
-
-echo -e "\n=== API DOCUMENTATION ==="
-curl -s "$BASE_URL/api/schema/"
-curl -s "$BASE_URL/api/docs/"
-curl -s "$BASE_URL/api/redoc/"
-
-echo -e "\n=== AUTHENTICATION ==="
-curl -s "$BASE_URL/api/v1/auth/status/"
-curl -s -X POST -H "Content-Type: application/json" -d '{"username":"test","password":"test"}' "$BASE_URL/api/v1/auth/login/"
-curl -s -X POST -H "Content-Type: application/json" -d '{"username":"test","email":"test@example.com","password":"test123"}' "$BASE_URL/api/v1/auth/signup/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/auth/logout/"
-curl -s "$BASE_URL/api/v1/auth/user/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/auth/token/refresh/"
-curl -s -X POST -H "Content-Type: application/json" -d '{"email":"test@example.com"}' "$BASE_URL/api/v1/auth/password/reset/"
-curl -s -X POST -H "Content-Type: application/json" -d '{"old_password":"old","new_password":"new"}' "$BASE_URL/api/v1/auth/password/change/"
-
-echo -e "\n=== SOCIAL AUTHENTICATION ==="
-curl -s "$BASE_URL/api/v1/auth/social/providers/"
-curl -s "$BASE_URL/api/v1/auth/social/providers/available/"
-curl -s "$BASE_URL/api/v1/auth/social/connected/"
-curl -s "$BASE_URL/api/v1/auth/social/status/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/auth/social/connect/google/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/auth/social/disconnect/google/"
-
-echo -e "\n=== EMAIL VERIFICATION ==="
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/auth/resend-verification/"
-curl -s "$BASE_URL/api/v1/auth/verify-email/sample-token/"
-
-echo -e "\n=== PARKS API ==="
-curl -s "$BASE_URL/api/v1/parks/"
-curl -s -X POST -H "Content-Type: application/json" -d '{"name":"Test Park","location":"Test Location"}' "$BASE_URL/api/v1/parks/"
-curl -s "$BASE_URL/api/v1/parks/hybrid/"
-curl -s "$BASE_URL/api/v1/parks/hybrid/filter-metadata/"
-curl -s "$BASE_URL/api/v1/parks/filter-options/"
-curl -s "$BASE_URL/api/v1/parks/search/companies/"
-curl -s "$BASE_URL/api/v1/parks/search-suggestions/"
-curl -s "$BASE_URL/api/v1/parks/1/"
-curl -s "$BASE_URL/api/v1/parks/sample-park/"
-curl -s "$BASE_URL/api/v1/parks/1/image-settings/"
-
-echo -e "\n=== PARK PHOTOS ==="
-curl -s "$BASE_URL/api/v1/parks/1/photos/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/parks/1/photos/"
-curl -s "$BASE_URL/api/v1/parks/1/photos/1/"
-
-echo -e "\n=== RIDES API ==="
-curl -s "$BASE_URL/api/v1/rides/"
-curl -s -X POST -H "Content-Type: application/json" -d '{"name":"Test Ride","park":1}' "$BASE_URL/api/v1/rides/"
-curl -s "$BASE_URL/api/v1/rides/hybrid/"
-curl -s "$BASE_URL/api/v1/rides/hybrid/filter-metadata/"
-curl -s "$BASE_URL/api/v1/rides/filter-options/"
-curl -s "$BASE_URL/api/v1/rides/search/companies/"
-curl -s "$BASE_URL/api/v1/rides/search/ride-models/"
-curl -s "$BASE_URL/api/v1/rides/search-suggestions/"
-curl -s "$BASE_URL/api/v1/rides/1/"
-curl -s "$BASE_URL/api/v1/rides/1/image-settings/"
-
-echo -e "\n=== RIDE PHOTOS ==="
-curl -s "$BASE_URL/api/v1/rides/1/photos/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/rides/1/photos/"
-curl -s "$BASE_URL/api/v1/rides/1/photos/1/"
-
-echo -e "\n=== RIDE MANUFACTURERS & MODELS ==="
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/search/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/filter-options/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/stats/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/sample-model/"
-
-echo -e "\n=== RIDE MODEL VARIANTS & SPECS ==="
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/sample-model/variants/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/sample-model/variants/1/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/sample-model/technical-specs/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/sample-model/technical-specs/1/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/sample-model/photos/"
-curl -s "$BASE_URL/api/v1/rides/manufacturers/sample-manufacturer/sample-model/photos/1/"
-
-echo -e "\n=== RANKINGS API ==="
-curl -s "$BASE_URL/api/v1/rankings/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/rankings/calculate/"
-
-echo -e "\n=== TRENDING & NEW CONTENT ==="
-curl -s "$BASE_URL/api/v1/trending/"
-curl -s "$BASE_URL/api/v1/new-content/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/trending/calculate/"
-
-echo -e "\n=== STATISTICS ==="
-curl -s "$BASE_URL/api/v1/stats/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/stats/recalculate/"
-
-echo -e "\n=== REVIEWS ==="
-curl -s "$BASE_URL/api/v1/reviews/latest/"
-
-echo -e "\n=== ACCOUNT MANAGEMENT ==="
-curl -s "$BASE_URL/api/v1/accounts/profile/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/profile/update/"
-curl -s "$BASE_URL/api/v1/accounts/profile/account/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/profile/account/"
-
-echo -e "\n=== USER PREFERENCES ==="
-curl -s "$BASE_URL/api/v1/accounts/preferences/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/preferences/update/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/preferences/theme/"
-
-echo -e "\n=== NOTIFICATION SETTINGS ==="
-curl -s "$BASE_URL/api/v1/accounts/settings/notifications/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/settings/notifications/update/"
-
-echo -e "\n=== PRIVACY SETTINGS ==="
-curl -s "$BASE_URL/api/v1/accounts/settings/privacy/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/settings/privacy/update/"
-
-echo -e "\n=== SECURITY SETTINGS ==="
-curl -s "$BASE_URL/api/v1/accounts/settings/security/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/settings/security/update/"
-
-echo -e "\n=== USER STATISTICS & TOP LISTS ==="
-curl -s "$BASE_URL/api/v1/accounts/statistics/"
-curl -s "$BASE_URL/api/v1/accounts/top-lists/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/top-lists/create/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/top-lists/1/"
-curl -s -X DELETE "$BASE_URL/api/v1/accounts/top-lists/1/"
-
-echo -e "\n=== NOTIFICATIONS ==="
-curl -s "$BASE_URL/api/v1/accounts/notifications/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/notifications/mark-read/"
-curl -s "$BASE_URL/api/v1/accounts/notification-preferences/"
-curl -s -X PUT -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/notification-preferences/update/"
-
-echo -e "\n=== AVATAR MANAGEMENT ==="
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/profile/avatar/upload/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/profile/avatar/save/"
-curl -s -X DELETE "$BASE_URL/api/v1/accounts/profile/avatar/delete/"
-
-echo -e "\n=== ACCOUNT DELETION ==="
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/delete-account/request/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/delete-account/verify/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/accounts/delete-account/cancel/"
-curl -s "$BASE_URL/api/v1/accounts/users/sample-id/deletion-check/"
-curl -s -X DELETE "$BASE_URL/api/v1/accounts/users/sample-id/delete/"
-
-echo -e "\n=== HISTORY ==="
-curl -s "$BASE_URL/api/v1/history/timeline/"
-curl -s "$BASE_URL/api/v1/history/parks/sample-park/"
-curl -s "$BASE_URL/api/v1/history/parks/sample-park/detail/"
-curl -s "$BASE_URL/api/v1/history/parks/sample-park/rides/sample-ride/"
-curl -s "$BASE_URL/api/v1/history/parks/sample-park/rides/sample-ride/detail/"
-
-echo -e "\n=== EMAIL ==="
-curl -s -X POST -H "Content-Type: application/json" -d '{"to":"test@example.com","subject":"Test","message":"Test message"}' "$BASE_URL/api/v1/email/send/"
-
-echo -e "\n=== CORE SEARCH & ENTITIES ==="
-curl -s "$BASE_URL/api/v1/core/entities/search/"
-curl -s "$BASE_URL/api/v1/core/entities/not-found/"
-curl -s "$BASE_URL/api/v1/core/entities/suggestions/"
-
-echo -e "\n=== MAPS ==="
-curl -s "$BASE_URL/api/v1/maps/locations/"
-curl -s "$BASE_URL/api/v1/maps/locations/park/1/"
-curl -s "$BASE_URL/api/v1/maps/search/"
-curl -s "$BASE_URL/api/v1/maps/bounds/"
-curl -s "$BASE_URL/api/v1/maps/stats/"
-curl -s "$BASE_URL/api/v1/maps/cache/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/maps/cache/invalidate/"
-
-echo -e "\n=== MODERATION ==="
-curl -s "$BASE_URL/api/v1/moderation/reports/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/reports/"
-curl -s "$BASE_URL/api/v1/moderation/reports/1/"
-curl -s "$BASE_URL/api/v1/moderation/reports/stats/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/reports/1/assign/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/reports/1/resolve/"
-
-echo -e "\n=== MODERATION QUEUE ==="
-curl -s "$BASE_URL/api/v1/moderation/queue/"
-curl -s "$BASE_URL/api/v1/moderation/queue/1/"
-curl -s "$BASE_URL/api/v1/moderation/queue/my_queue/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/queue/1/assign/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/queue/1/unassign/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/queue/1/complete/"
-
-echo -e "\n=== MODERATION ACTIONS ==="
-curl -s "$BASE_URL/api/v1/moderation/actions/"
-curl -s "$BASE_URL/api/v1/moderation/actions/active/"
-curl -s "$BASE_URL/api/v1/moderation/actions/expired/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/actions/1/deactivate/"
-
-echo -e "\n=== BULK OPERATIONS ==="
-curl -s "$BASE_URL/api/v1/moderation/bulk-operations/"
-curl -s "$BASE_URL/api/v1/moderation/bulk-operations/running/"
-curl -s "$BASE_URL/api/v1/moderation/bulk-operations/1/"
-curl -s "$BASE_URL/api/v1/moderation/bulk-operations/1/logs/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/bulk-operations/1/cancel/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/bulk-operations/1/retry/"
-
-echo -e "\n=== USER MODERATION ==="
-curl -s "$BASE_URL/api/v1/moderation/users/1/"
-curl -s -X POST -H "Content-Type: application/json" "$BASE_URL/api/v1/moderation/users/1/moderate/"
-curl -s "$BASE_URL/api/v1/moderation/users/search/"
-curl -s "$BASE_URL/api/v1/moderation/users/stats/"
-
-echo -e "\n=== CLOUDFLARE IMAGES ==="
-curl -s "$BASE_URL/api/v1/cloudflare-images/"
-
-echo -e "\n=== ENVIRONMENT & SETTINGS ==="
-curl -s "$BASE_URL/env-settings/"
-
-echo -e "\n=== STATIC PAGES ==="
-curl -s "$BASE_URL/terms/"
-curl -s "$BASE_URL/privacy/"
-
-echo -e "\n=== Testing completed ==="
\ No newline at end of file
diff --git a/test_hybrid_endpoints.sh b/test_hybrid_endpoints.sh
deleted file mode 100755
index f8b42675..00000000
--- a/test_hybrid_endpoints.sh
+++ /dev/null
@@ -1,408 +0,0 @@
-#!/bin/bash
-
-# ThrillWiki Hybrid Filtering Endpoints Test Script
-# Tests the newly synchronized Parks and Rides hybrid filtering endpoints
-#
-# Usage: ./test_hybrid_endpoints.sh [BASE_URL]
-# Default BASE_URL: http://localhost:8000
-
-set -e
-
-# Configuration
-BASE_URL="${1:-http://localhost:8000}"
-VERBOSE=true
-
-# Colors for output
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-BLUE='\033[0;34m'
-YELLOW='\033[1;33m'
-PURPLE='\033[0;35m'
-CYAN='\033[0;36m'
-NC='\033[0m' # No Color
-
-# Helper functions
-print_header() {
- local title="$1"
- local level="${2:-1}"
-
- case $level in
- 1) echo -e "\n${BLUE}================================================================================${NC}"
- echo -e "${BLUE}$title${NC}"
- echo -e "${BLUE}================================================================================${NC}" ;;
- 2) echo -e "\n${CYAN}--------------------------------------------------------------------------------${NC}"
- echo -e "${CYAN}$title${NC}"
- echo -e "${CYAN}--------------------------------------------------------------------------------${NC}" ;;
- 3) echo -e "\n${YELLOW}$title${NC}"
- echo -e "${YELLOW}$(echo "$title" | sed 's/./~/g')${NC}" ;;
- esac
-}
-
-print_endpoint() {
- local method="$1"
- local url="$2"
- echo -e "\n${PURPLE}🔗 ENDPOINT:${NC} ${GREEN}$method${NC} $url"
-}
-
-print_description() {
- local desc="$1"
- echo -e "${CYAN}📋 DESCRIPTION:${NC} $desc"
-}
-
-make_request() {
- local method="$1"
- local url="$2"
- local description="$3"
-
- print_endpoint "$method" "$url"
- print_description "$description"
-
- echo -e "\n${YELLOW}📤 REQUEST:${NC}"
- echo "curl -X $method \\"
- echo " -H 'Accept: application/json' \\"
- echo " -H 'Content-Type: application/json' \\"
- echo " '$url'"
-
- echo -e "\n${YELLOW}📥 RESPONSE:${NC}"
-
- # Make the actual request
- response=$(curl -s -w "\n%{http_code}" -X "$method" \
- -H "Accept: application/json" \
- -H "Content-Type: application/json" \
- "$url")
-
- # Extract status code and body
- status_code=$(echo "$response" | tail -n1)
- body=$(echo "$response" | sed '$d')
-
- # Print status
- if [[ "$status_code" -ge 200 && "$status_code" -lt 300 ]]; then
- echo -e "${GREEN}✅ SUCCESS: HTTP $status_code${NC}"
- else
- echo -e "${RED}❌ ERROR: HTTP $status_code${NC}"
- fi
-
- # Pretty print JSON response
- if command -v jq >/dev/null 2>&1; then
- echo "$body" | jq '.'
- else
- echo "$body"
- fi
-
- # Extract and display key metrics
- if command -v jq >/dev/null 2>&1 && [[ "$status_code" -ge 200 && "$status_code" -lt 300 ]]; then
- echo -e "\n${CYAN}📊 RESPONSE SUMMARY:${NC}"
-
- # Total count
- total_count=$(echo "$body" | jq -r '.total_count // empty')
- if [[ -n "$total_count" ]]; then
- echo -e " • Total Count: ${GREEN}$total_count${NC}"
- fi
-
- # Strategy
- strategy=$(echo "$body" | jq -r '.strategy // empty')
- if [[ -n "$strategy" ]]; then
- if [[ "$strategy" == "client_side" ]]; then
- echo -e " • Strategy: ${GREEN}🖥️ $strategy${NC}"
- else
- echo -e " • Strategy: ${BLUE}🌐 $strategy${NC}"
- fi
- fi
-
- # Has more
- has_more=$(echo "$body" | jq -r '.has_more // empty')
- if [[ -n "$has_more" ]]; then
- if [[ "$has_more" == "true" ]]; then
- echo -e " • Has More: ${YELLOW}➡️ $has_more${NC}"
- else
- echo -e " • Has More: ${GREEN}🏁 $has_more${NC}"
- fi
- fi
-
- # Next offset
- next_offset=$(echo "$body" | jq -r '.next_offset // empty')
- if [[ -n "$next_offset" && "$next_offset" != "null" ]]; then
- echo -e " • Next Offset: ${CYAN}$next_offset${NC}"
- fi
-
- # Data counts
- parks_count=$(echo "$body" | jq -r '.parks | length // empty' 2>/dev/null)
- if [[ -n "$parks_count" ]]; then
- echo -e " • Parks Returned: ${GREEN}$parks_count${NC}"
- fi
-
- rides_count=$(echo "$body" | jq -r '.rides | length // empty' 2>/dev/null)
- if [[ -n "$rides_count" ]]; then
- echo -e " • Rides Returned: ${GREEN}$rides_count${NC}"
- fi
-
- # Filter metadata summary
- if echo "$body" | jq -e '.filter_metadata' >/dev/null 2>&1; then
- echo -e " • Filter Metadata: ${GREEN}✅ Available${NC}"
-
- # Count categorical options
- countries=$(echo "$body" | jq -r '.filter_metadata.categorical.countries | length // 0' 2>/dev/null)
- states=$(echo "$body" | jq -r '.filter_metadata.categorical.states | length // 0' 2>/dev/null)
- categories=$(echo "$body" | jq -r '.filter_metadata.categorical.categories | length // 0' 2>/dev/null)
-
- if [[ "$countries" -gt 0 ]]; then
- echo -e " - Countries: ${CYAN}$countries${NC}"
- fi
- if [[ "$states" -gt 0 ]]; then
- echo -e " - States: ${CYAN}$states${NC}"
- fi
- if [[ "$categories" -gt 0 ]]; then
- echo -e " - Categories: ${CYAN}$categories${NC}"
- fi
- fi
- fi
-
- echo -e "\n${PURPLE}$(printf '%.0s-' {1..80})${NC}"
-}
-
-# Main test execution
-main() {
- print_header "THRILLWIKI HYBRID FILTERING ENDPOINTS TEST SUITE" 1
- echo -e "Testing endpoints at: ${GREEN}$BASE_URL${NC}"
- echo -e "Timestamp: ${CYAN}$(date)${NC}"
-
- # Check if server is running
- echo -e "\n${YELLOW}🔍 Checking server availability...${NC}"
- if ! curl -s --connect-timeout 5 "$BASE_URL" >/dev/null; then
- echo -e "${RED}❌ Server not available at $BASE_URL${NC}"
- echo -e "${YELLOW}💡 Make sure to start the Django server first:${NC}"
- echo -e " cd backend && uv run manage.py runserver_plus"
- exit 1
- fi
- echo -e "${GREEN}✅ Server is running${NC}"
-
- # ========================================================================
- # PARKS HYBRID FILTERING TESTS
- # ========================================================================
-
- print_header "PARKS HYBRID FILTERING TESTS" 1
-
- # Test 1: Basic Parks Hybrid Filtering
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/" \
- "Basic hybrid filtering with no parameters - demonstrates automatic strategy selection"
-
- # Test 2: Parks with Search Filter
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?search=disney" \
- "Search for parks containing 'disney' - tests full-text search functionality"
-
- # Test 3: Parks with Status Filter
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?status=OPERATING,CLOSED_TEMP" \
- "Filter parks by multiple statuses - tests comma-separated list parameters"
-
- # Test 4: Parks with Geographic Filters
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?country=United%20States&state=Florida,California" \
- "Filter parks by country and multiple states - tests geographic filtering"
-
- # Test 5: Parks with Numeric Range Filters
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?opening_year_min=1990&opening_year_max=2020&rating_min=4.0" \
- "Filter parks by opening year range and minimum rating - tests numeric range filtering"
-
- # Test 6: Parks with Size and Ride Count Filters
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?size_min=100&ride_count_min=10&coaster_count_min=5" \
- "Filter parks by minimum size, ride count, and coaster count - tests park statistics filtering"
-
- # Test 7: Parks with Operator Filter
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?operator=disney,universal" \
- "Filter parks by operator slugs - tests company relationship filtering"
-
- # Test 8: Parks Progressive Loading (with offset)
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?offset=50" \
- "Progressive loading starting at offset 50 - tests server-side pagination"
-
- # Test 9: Parks Filter Metadata
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/filter-metadata/" \
- "Get comprehensive filter metadata for parks - provides all available filter options and ranges"
-
- # Test 10: Parks Scoped Filter Metadata
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/filter-metadata/?scoped=true&country=United%20States" \
- "Get filter metadata scoped to US parks - demonstrates dynamic metadata based on current filters"
-
- # ========================================================================
- # RIDES HYBRID FILTERING TESTS
- # ========================================================================
-
- print_header "RIDES HYBRID FILTERING TESTS" 1
-
- # Test 1: Basic Rides Hybrid Filtering
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/" \
- "Basic hybrid filtering with no parameters - demonstrates automatic strategy selection for rides"
-
- # Test 2: Rides with Search Filter
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?search=coaster" \
- "Search for rides containing 'coaster' - tests full-text search across ride names and descriptions"
-
- # Test 3: Rides with Category Filter
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?category=RC,DR" \
- "Filter rides by categories (Roller Coaster, Dark Ride) - tests ride category filtering"
-
- # Test 4: Rides with Status and Park Filters
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?status=OPERATING&park_slug=cedar-point" \
- "Filter operating rides at Cedar Point - tests status and park-specific filtering"
-
- # Test 5: Rides with Manufacturer and Designer Filters
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?manufacturer=bolliger-mabillard&designer=bolliger-mabillard" \
- "Filter rides by B&M as manufacturer and designer - tests company relationship filtering"
-
- # Test 6: Rides with Roller Coaster Specific Filters
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?roller_coaster_type=INVERTED,FLYING&track_material=STEEL&has_inversions=true" \
- "Filter inverted/flying steel coasters with inversions - tests roller coaster specific attributes"
-
- # Test 7: Rides with Height and Speed Filters
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?height_ft_min=200&speed_mph_min=70&inversions_min=4" \
- "Filter tall, fast coasters with multiple inversions - tests numeric performance filtering"
-
- # Test 8: Rides with Rating and Capacity Filters
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?rating_min=4.5&capacity_min=1000&opening_year_min=2000" \
- "Filter highly-rated, high-capacity modern rides - tests quality and operational metrics"
-
- # Test 9: Rides with Height Requirement Filters
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?height_requirement_min=48&height_requirement_max=54" \
- "Filter rides by height requirements (48-54 inches) - tests accessibility filtering"
-
- # Test 10: Rides Progressive Loading
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?offset=25&category=RC" \
- "Progressive loading of roller coasters starting at offset 25 - tests server-side pagination with filters"
-
- # Test 11: Rides Filter Metadata
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/filter-metadata/" \
- "Get comprehensive filter metadata for rides - provides all available filter options and ranges"
-
- # Test 12: Rides Scoped Filter Metadata
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/filter-metadata/?scoped=true&category=RC" \
- "Get filter metadata scoped to roller coasters - demonstrates dynamic metadata for specific categories"
-
- # ========================================================================
- # COMPLEX COMBINATION TESTS
- # ========================================================================
-
- print_header "COMPLEX COMBINATION TESTS" 1
-
- # Test 1: Parks with All Filter Types
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?search=theme&status=OPERATING&country=United%20States&opening_year_min=1980&rating_min=4.0&size_min=50&ride_count_min=20" \
- "Complex parks query combining search, status, geographic, temporal, rating, and size filters"
-
- # Test 2: Rides with All Filter Types
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?search=steel&category=RC&status=OPERATING&roller_coaster_type=SITDOWN&track_material=STEEL&height_ft_min=100&speed_mph_min=50&rating_min=4.0&has_inversions=false" \
- "Complex rides query combining search, category, status, coaster type, materials, performance, and rating filters"
-
- # ========================================================================
- # EDGE CASE TESTS
- # ========================================================================
-
- print_header "EDGE CASE TESTS" 1
-
- # Test 1: Empty Results
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?search=nonexistentpark12345" \
- "Search for non-existent park - tests empty result handling"
-
- # Test 2: Invalid Parameters
- make_request "GET" \
- "$BASE_URL/api/v1/rides/hybrid/?height_ft_min=invalid&rating_min=15" \
- "Invalid numeric parameters - tests parameter validation and error handling"
-
- # Test 3: Large Offset
- make_request "GET" \
- "$BASE_URL/api/v1/parks/hybrid/?offset=99999" \
- "Very large offset value - tests pagination boundary handling"
-
- # ========================================================================
- # PERFORMANCE COMPARISON TESTS
- # ========================================================================
-
- print_header "PERFORMANCE COMPARISON TESTS" 1
-
- echo -e "\n${CYAN}📊 Testing response times for different strategies...${NC}"
-
- # Time the requests
- echo -e "\n${YELLOW}⏱️ Timing Parks Hybrid Endpoint:${NC}"
- time curl -s -o /dev/null "$BASE_URL/api/v1/parks/hybrid/"
-
- echo -e "\n${YELLOW}⏱️ Timing Rides Hybrid Endpoint:${NC}"
- time curl -s -o /dev/null "$BASE_URL/api/v1/rides/hybrid/"
-
- echo -e "\n${YELLOW}⏱️ Timing Parks Filter Metadata:${NC}"
- time curl -s -o /dev/null "$BASE_URL/api/v1/parks/hybrid/filter-metadata/"
-
- echo -e "\n${YELLOW}⏱️ Timing Rides Filter Metadata:${NC}"
- time curl -s -o /dev/null "$BASE_URL/api/v1/rides/hybrid/filter-metadata/"
-
- # ========================================================================
- # SUMMARY
- # ========================================================================
-
- print_header "TEST SUITE SUMMARY" 1
-
- echo -e "${GREEN}✅ Test suite completed successfully!${NC}"
- echo -e "\n${CYAN}📋 ENDPOINTS TESTED:${NC}"
- echo -e " • Parks Hybrid Filtering: ${GREEN}/api/v1/parks/hybrid/${NC}"
- echo -e " • Parks Filter Metadata: ${GREEN}/api/v1/parks/hybrid/filter-metadata/${NC}"
- echo -e " • Rides Hybrid Filtering: ${GREEN}/api/v1/rides/hybrid/${NC}"
- echo -e " • Rides Filter Metadata: ${GREEN}/api/v1/rides/hybrid/filter-metadata/${NC}"
-
- echo -e "\n${CYAN}🔍 KEY FEATURES DEMONSTRATED:${NC}"
- echo -e " • Automatic strategy selection (client-side vs server-side)"
- echo -e " • Progressive loading for large datasets"
- echo -e " • Comprehensive filter options (17+ parameters per domain)"
- echo -e " • Dynamic filter metadata generation"
- echo -e " • Consistent response formats across domains"
- echo -e " • Full-text search capabilities"
- echo -e " • Numeric range filtering"
- echo -e " • Multi-value parameter support"
- echo -e " • Geographic and temporal filtering"
- echo -e " • Roller coaster specific filtering"
- echo -e " • Error handling and validation"
-
- echo -e "\n${YELLOW}💡 NEXT STEPS:${NC}"
- echo -e " • Integrate these endpoints into your frontend application"
- echo -e " • Use filter metadata to build dynamic filter interfaces"
- echo -e " • Implement progressive loading for better user experience"
- echo -e " • Monitor performance and adjust thresholds as needed"
-
- echo -e "\n${PURPLE}🎉 Happy filtering! 🎢${NC}"
-}
-
-# Check dependencies
-check_dependencies() {
- if ! command -v curl >/dev/null 2>&1; then
- echo -e "${RED}❌ curl is required but not installed${NC}"
- exit 1
- fi
-
- if ! command -v jq >/dev/null 2>&1; then
- echo -e "${YELLOW}⚠️ jq not found - JSON responses will not be pretty-printed${NC}"
- fi
-}
-
-# Script execution
-check_dependencies
-main "$@"
diff --git a/test_location_models.py b/test_location_models.py
deleted file mode 100644
index 83dfd36e..00000000
--- a/test_location_models.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/env python3
-"""
-Basic test script to verify RideLocation and CompanyHeadquarters models work correctly.
-"""
-from rides.models import Ride, RideLocation
-from parks.models import Company, CompanyHeadquarters
-import os
-import sys
-import django
-
-# Setup Django
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thrillwiki.settings")
-django.setup()
-
-
-def test_company_headquarters():
- """Test CompanyHeadquarters model functionality"""
- print("Testing CompanyHeadquarters...")
-
- # Try to use an existing company or skip this test if none exist
- existing_company = Company.objects.first()
- if not existing_company:
- print("⚠️ No existing companies found, skipping CompanyHeadquarters test")
- return None, None
-
- # Check if headquarters already exist
- try:
- headquarters = existing_company.headquarters
- print(f"✓ Found existing headquarters: {headquarters}")
- except CompanyHeadquarters.DoesNotExist:
- # Create headquarters for existing company
- headquarters = CompanyHeadquarters.objects.create(
- company=existing_company,
- city="Orlando",
- state_province="Florida",
- country="USA",
- street_address="123 Theme Park Blvd",
- postal_code="32801",
- )
- print(f"✓ Created new headquarters: {headquarters}")
-
- print(f"✓ Created headquarters: {headquarters}")
- print(f"✓ Location display: {headquarters.location_display}")
- print(f"✓ Formatted location: {headquarters.formatted_location}")
-
- return existing_company, headquarters
-
-
-def test_ride_location():
- """Test RideLocation model functionality"""
- print("\nTesting RideLocation...")
-
- # First, we need a ride - let's check if any exist
- if Ride.objects.exists():
- ride = Ride.objects.first()
- print(f"✓ Using existing ride: {ride.name}")
- else:
- print("! No rides found in database - skipping RideLocation test")
- return None, None
-
- # Create ride location
- ride_location = RideLocation.objects.create(
- ride=ride,
- park_area="Fantasyland",
- notes="General location information",
- entrance_notes="Queue entrance is to the left of the main attraction sign",
- accessibility_notes="Wheelchair accessible entrance available via side path",
- )
-
- print(f"✓ Created ride location: {ride_location}")
- print(f"✓ Has coordinates: {ride_location.has_coordinates}")
-
- # Test setting coordinates
- ride_location.set_coordinates(28.3772, -81.5707) # Disney World coordinates
- ride_location.save()
-
- print(f"✓ Set coordinates: {ride_location.coordinates}")
- print(f"✓ Latitude: {ride_location.latitude}")
- print(f"✓ Longitude: {ride_location.longitude}")
-
- return ride, ride_location
-
-
-def cleanup_test_data(company=None, headquarters=None, ride_location=None):
- """Clean up test data"""
- print("\nCleaning up test data...")
-
- if ride_location:
- ride_location.delete()
- print("✓ Deleted test ride location")
-
- if headquarters:
- headquarters.delete()
- print("✓ Deleted test headquarters")
-
- if company:
- company.delete()
- print("✓ Deleted test company")
-
-
-def main():
- """Run all tests"""
- print("=" * 50)
- print("Testing Location Models Implementation")
- print("=" * 50)
-
- try:
- # Test CompanyHeadquarters
- company, headquarters = test_company_headquarters()
-
- # Test RideLocation
- ride, ride_location = test_ride_location()
-
- print("\n" + "=" * 50)
- print("✅ ALL TESTS PASSED!")
- print(
- "✅ Both RideLocation and CompanyHeadquarters models are working correctly"
- )
- print("=" * 50)
-
- # Clean up
- cleanup_test_data(company, headquarters, ride_location)
-
- except Exception as e:
- print(f"\n❌ TEST FAILED: {e}")
- import traceback
-
- traceback.print_exc()
- return False
-
- return True
-
-
-if __name__ == "__main__":
- success = main()
- sys.exit(0 if success else 1)
diff --git a/test_manual_trigger.py b/test_manual_trigger.py
deleted file mode 100644
index 129f4c34..00000000
--- a/test_manual_trigger.py
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/usr/bin/env python3
-"""
-Test script for the manual trending content calculation trigger endpoint.
-"""
-
-import requests
-import json
-import time
-from datetime import datetime
-
-# Configuration
-BASE_URL = "http://localhost:8000"
-ADMIN_USERNAME = "admin"
-ADMIN_PASSWORD = "admin" # We'll need to check what the password is
-
-
-def login_and_get_token():
- """Login and get authentication token."""
- login_url = f"{BASE_URL}/api/v1/auth/login/"
-
- login_data = {
- "username": ADMIN_USERNAME,
- "password": ADMIN_PASSWORD
- }
-
- print(f"🔐 Attempting to login as {ADMIN_USERNAME}...")
- response = requests.post(login_url, json=login_data)
-
- if response.status_code == 200:
- data = response.json()
- token = data.get('token')
- print(f"✅ Login successful! Token: {token[:20]}...")
- return token
- else:
- print(f"❌ Login failed: {response.status_code}")
- print(f"Response: {response.text}")
- return None
-
-
-def test_trigger_endpoint(token):
- """Test the manual trigger endpoint."""
- trigger_url = f"{BASE_URL}/api/v1/trending/calculate/"
-
- headers = {
- "Authorization": f"Bearer {token}",
- "Content-Type": "application/json"
- }
-
- print(f"\n🚀 Testing manual trigger endpoint...")
- print(f"URL: {trigger_url}")
-
- response = requests.post(trigger_url, headers=headers)
-
- print(f"Status Code: {response.status_code}")
- print(f"Response Headers: {dict(response.headers)}")
-
- try:
- response_data = response.json()
- print(f"Response Body: {json.dumps(response_data, indent=2)}")
-
- if response.status_code == 202:
- print("✅ Manual trigger successful!")
- return response_data
- else:
- print(f"❌ Manual trigger failed with status {response.status_code}")
- return None
-
- except json.JSONDecodeError:
- print(f"❌ Invalid JSON response: {response.text}")
- return None
-
-
-def test_trending_endpoints():
- """Test the trending content endpoints to see the results."""
- print(f"\n📊 Testing trending content endpoints...")
-
- # Test trending content endpoint
- trending_url = f"{BASE_URL}/api/v1/trending/content/"
- print(f"Testing: {trending_url}")
-
- response = requests.get(trending_url)
- print(f"Trending Content Status: {response.status_code}")
-
- if response.status_code == 200:
- data = response.json()
- print(f"Trending Parks: {len(data.get('trending_parks', []))}")
- print(f"Trending Rides: {len(data.get('trending_rides', []))}")
-
- # Show first few trending items
- if data.get('trending_parks'):
- print(
- f"First trending park: {data['trending_parks'][0].get('name', 'Unknown')}")
- if data.get('trending_rides'):
- print(
- f"First trending ride: {data['trending_rides'][0].get('name', 'Unknown')}")
-
- # Test new content endpoint
- new_content_url = f"{BASE_URL}/api/v1/trending/new/"
- print(f"\nTesting: {new_content_url}")
-
- response = requests.get(new_content_url)
- print(f"New Content Status: {response.status_code}")
-
- if response.status_code == 200:
- data = response.json()
- print(f"Recently Added: {len(data.get('recently_added', []))}")
- print(f"Newly Opened: {len(data.get('newly_opened', []))}")
- print(f"Upcoming: {len(data.get('upcoming', []))}")
-
- # Show the newly_opened structure to verify our changes
- if data.get('newly_opened'):
- print(f"\n🎢 First newly opened item structure:")
- first_item = data['newly_opened'][0]
- print(f" Name: {first_item.get('name')}")
- # Should be park name, not location
- print(f" Park: {first_item.get('park')}")
- # Should be date_opened, not location
- print(f" Date Opened: {first_item.get('date_opened')}")
- print(f" Category: {first_item.get('category')}")
- print(f" Slug: {first_item.get('slug')}")
-
- # Verify location field is NOT present
- if 'location' in first_item:
- print(
- f" ❌ ERROR: 'location' field still present: {first_item['location']}")
- else:
- print(f" ✅ SUCCESS: 'location' field removed as requested")
-
-
-def test_unauthorized_access():
- """Test that non-admin users cannot access the trigger endpoint."""
- print(f"\n🔒 Testing unauthorized access...")
-
- trigger_url = f"{BASE_URL}/api/v1/trending/calculate/"
-
- # Test without authentication
- print("Testing without authentication...")
- response = requests.post(trigger_url)
- print(f"No auth status: {response.status_code}")
-
- # Test with invalid token
- print("Testing with invalid token...")
- headers = {"Authorization": "Bearer invalid_token_123"}
- response = requests.post(trigger_url, headers=headers)
- print(f"Invalid token status: {response.status_code}")
-
- if response.status_code in [401, 403]:
- print("✅ Unauthorized access properly blocked")
- else:
- print(f"❌ Unauthorized access not properly blocked: {response.status_code}")
-
-
-def main():
- """Main test function."""
- print("🧪 ThrillWiki Manual Trigger Endpoint Test")
- print("=" * 50)
-
- # First test unauthorized access
- test_unauthorized_access()
-
- # Try to login and get token
- token = login_and_get_token()
-
- if not token:
- print("❌ Cannot proceed without authentication token")
- return
-
- # Test the manual trigger endpoint
- trigger_result = test_trigger_endpoint(token)
-
- if trigger_result:
- print(f"\n⏳ Waiting 10 seconds for tasks to process...")
- time.sleep(10)
-
- # Test the trending endpoints to see results
- test_trending_endpoints()
-
- print(f"\n🏁 Test completed at {datetime.now()}")
-
-
-if __name__ == "__main__":
- main()
diff --git a/test_manufacturer_sync.py b/test_manufacturer_sync.py
deleted file mode 100644
index 8c69c253..00000000
--- a/test_manufacturer_sync.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/env python
-"""
-Test script to verify manufacturer syncing with ride models.
-"""
-import os
-import sys
-import django
-
-# Add the backend directory to the Python path
-sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'backend'))
-
-# Set up Django
-os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')
-django.setup()
-
-from apps.rides.models import Ride, RideModel, Company
-from apps.parks.models import Park
-
-def test_manufacturer_sync():
- """Test that ride manufacturer syncs with ride model manufacturer."""
-
- print("Testing manufacturer sync with ride models...")
-
- # Get a ride that has a ride_model
- ride = Ride.objects.select_related('ride_model', 'ride_model__manufacturer', 'manufacturer').first()
-
- if not ride:
- print("No rides found in database")
- return
-
- print(f"\nRide: {ride.name}")
- print(f"Park: {ride.park.name}")
-
- if ride.ride_model:
- print(f"Ride Model: {ride.ride_model.name}")
- print(f"Ride Model Manufacturer: {ride.ride_model.manufacturer.name if ride.ride_model.manufacturer else 'None'}")
- else:
- print("Ride Model: None")
-
- print(f"Ride Manufacturer: {ride.manufacturer.name if ride.manufacturer else 'None'}")
-
- # Check if they match
- if ride.ride_model and ride.ride_model.manufacturer:
- if ride.manufacturer == ride.ride_model.manufacturer:
- print("✅ Manufacturer is correctly synced with ride model")
- else:
- print("❌ Manufacturer is NOT synced with ride model")
- print("This should be fixed by the new save() method")
-
- # Test the fix by saving the ride
- print("\nTesting fix by re-saving the ride...")
- ride.save()
- ride.refresh_from_db()
-
- print(f"After save - Ride Manufacturer: {ride.manufacturer.name if ride.manufacturer else 'None'}")
-
- if ride.manufacturer == ride.ride_model.manufacturer:
- print("✅ Fix successful! Manufacturer is now synced")
- else:
- print("❌ Fix failed - manufacturer still not synced")
- else:
- print("⚠️ Cannot test sync - ride model has no manufacturer")
-
-if __name__ == "__main__":
- test_manufacturer_sync()
diff --git a/test_park_location.py b/test_park_location.py
deleted file mode 100644
index fcc2fb5c..00000000
--- a/test_park_location.py
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env python
-"""
-Test script for ParkLocation model functionality
-"""
-from parks.models import Park, ParkLocation, Company
-import os
-import django
-
-# Setup Django
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thrillwiki.settings")
-django.setup()
-
-
-def test_park_location():
- print("🧪 Testing ParkLocation Model Functionality")
- print("=" * 50)
-
- # Create a test company (operator)
- operator, created = Company.objects.get_or_create(
- name="Test Theme Parks Inc",
- defaults={"slug": "test-theme-parks-inc", "roles": ["OPERATOR"]},
- )
- print(f"✅ Created operator: {operator.name}")
-
- # Create a test park
- park, created = Park.objects.get_or_create(
- name="Test Magic Kingdom",
- defaults={
- "slug": "test-magic-kingdom",
- "description": "A test theme park for location testing",
- "operator": operator,
- },
- )
- print(f"✅ Created park: {park.name}")
-
- # Create a park location
- location, created = ParkLocation.objects.get_or_create(
- park=park,
- defaults={
- "street_address": "1313 Disneyland Dr",
- "city": "Anaheim",
- "state": "California",
- "country": "USA",
- "postal_code": "92802",
- "highway_exit": "I-5 Exit 110B",
- "parking_notes": "Large parking structure available",
- "seasonal_notes": "Open year-round",
- },
- )
- print(f"✅ Created location: {location}")
-
- # Test coordinate setting
- print("\n🔍 Testing coordinate functionality:")
- location.set_coordinates(33.8121, -117.9190) # Disneyland coordinates
- location.save()
-
- print(f" Latitude: {location.latitude}")
- print(f" Longitude: {location.longitude}")
- print(f" Coordinates: {location.coordinates}")
- print(f" Formatted Address: {location.formatted_address}")
-
- # Test Park model integration
- print("\n🔍 Testing Park model integration:")
- print(f" Park formatted location: {park.formatted_location}")
- print(f" Park coordinates: {park.coordinates}")
-
- # Create another location for distance testing
- operator2, created = Company.objects.get_or_create(
- name="Six Flags Entertainment",
- defaults={"slug": "six-flags-entertainment", "roles": ["OPERATOR"]},
- )
-
- park2, created = Park.objects.get_or_create(
- name="Six Flags Magic Mountain",
- defaults={
- "slug": "six-flags-magic-mountain",
- "description": "Another test theme park",
- "operator": operator2,
- },
- )
-
- location2, created = ParkLocation.objects.get_or_create(
- park=park2,
- defaults={"city": "Valencia", "state": "California", "country": "USA"},
- )
- # Six Flags Magic Mountain coordinates
- location2.set_coordinates(34.4244, -118.5971)
- location2.save()
-
- # Test distance calculation
- print("\n🔍 Testing distance calculation:")
- distance = location.distance_to(location2)
- if distance:
- print(f" Distance between parks: {distance:.2f} km")
- else:
- print(" ❌ Distance calculation failed")
-
- # Test spatial indexing
- print("\n🔍 Testing spatial queries:")
- try:
- from django.contrib.gis.measure import D
- from django.contrib.gis.geos import Point
-
- # Find parks within 100km of a point
- # Same as Disneyland
- search_point = Point(-117.9190, 33.8121, srid=4326)
- nearby_locations = ParkLocation.objects.filter(
- point__distance_lte=(search_point, D(km=100))
- )
- print(f" Found {nearby_locations.count()} parks within 100km")
- for loc in nearby_locations:
- print(f" - {loc.park.name} in {loc.city}, {loc.state}")
- except Exception as e:
- print(f" ⚠️ Spatial queries not fully functional: {e}")
-
- print("\n✅ ParkLocation model tests completed successfully!")
- return True
-
-
-if __name__ == "__main__":
- try:
- test_park_location()
- except Exception as e:
- print(f"❌ Test failed: {e}")
- import traceback
-
- traceback.print_exc()
diff --git a/test_public_endpoints.sh b/test_public_endpoints.sh
deleted file mode 100755
index b5fcb4c8..00000000
--- a/test_public_endpoints.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/bash
-
-# ThrillWiki Public API Endpoint Testing Script
-# Tests only endpoints that work without authentication
-# Base URL: http://127.0.0.1:8000
-
-BASE_URL="http://127.0.0.1:8000"
-
-echo "=== TESTING PUBLIC API ENDPOINTS ==="
-
-echo -e "\n=== HEALTH CHECKS ==="
-echo "GET /api/v1/health/"
-curl -s "$BASE_URL/api/v1/health/"
-echo -e "\n\nGET /api/v1/health/simple/"
-curl -s "$BASE_URL/api/v1/health/simple/"
-echo -e "\n\nGET /api/v1/health/performance/"
-curl -s "$BASE_URL/api/v1/health/performance/"
-
-echo -e "\n\n=== API DOCUMENTATION ==="
-echo "GET /api/schema/ (truncated)"
-curl -s "$BASE_URL/api/schema/" | head -20
-echo "... [truncated]"
-
-echo -e "\n\n=== PARKS API ==="
-echo "GET /api/v1/parks/"
-curl -s "$BASE_URL/api/v1/parks/"
-echo -e "\n\nGET /api/v1/parks/filter-options/"
-curl -s "$BASE_URL/api/v1/parks/filter-options/"
-
-echo -e "\n\n=== RIDES API ==="
-echo "GET /api/v1/rides/"
-curl -s "$BASE_URL/api/v1/rides/"
-echo -e "\n\nGET /api/v1/rides/filter-options/"
-curl -s "$BASE_URL/api/v1/rides/filter-options/"
-
-echo -e "\n\n=== STATISTICS ==="
-echo "GET /api/v1/stats/"
-curl -s "$BASE_URL/api/v1/stats/"
-
-echo -e "\n\n=== TRENDING & NEW CONTENT ==="
-echo "GET /api/v1/trending/"
-curl -s "$BASE_URL/api/v1/trending/"
-echo -e "\n\nGET /api/v1/new-content/"
-curl -s "$BASE_URL/api/v1/new-content/"
-
-echo -e "\n\n=== REVIEWS ==="
-echo "GET /api/v1/reviews/latest/"
-curl -s "$BASE_URL/api/v1/reviews/latest/"
-
-echo -e "\n\n=== MAPS ==="
-echo "GET /api/v1/maps/locations/"
-curl -s "$BASE_URL/api/v1/maps/locations/"
-echo -e "\n\nGET /api/v1/maps/stats/"
-curl -s "$BASE_URL/api/v1/maps/stats/"
-
-echo -e "\n\n=== CORE SEARCH & ENTITIES ==="
-echo "GET /api/v1/core/entities/suggestions/"
-curl -s "$BASE_URL/api/v1/core/entities/suggestions/"
-
-echo -e "\n\n=== RANKINGS ==="
-echo "GET /api/v1/rankings/"
-curl -s "$BASE_URL/api/v1/rankings/"
-
-echo -e "\n\n=== Testing completed ==="
\ No newline at end of file
diff --git a/test_roadtrip_service.py b/test_roadtrip_service.py
deleted file mode 100644
index 0917f334..00000000
--- a/test_roadtrip_service.py
+++ /dev/null
@@ -1,346 +0,0 @@
-"""
-Test script for the RoadTripService implementation.
-
-This script tests all functionality of the OSM Road Trip Service including:
-- Geocoding addresses
-- Route calculation
-- Park discovery along routes
-- Multi-park trip planning
-- Integration with existing Park models
-"""
-
-from django.core.cache import cache
-from parks.models import Park
-from parks.services.roadtrip import Coordinates
-from parks.services import RoadTripService
-import os
-import django
-
-# Setup Django
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thrillwiki.settings")
-django.setup()
-
-
-def test_geocoding():
- """Test geocoding functionality."""
- print("\n=== Testing Geocoding ===")
-
- service = RoadTripService()
-
- # Test various address formats
- test_addresses = [
- "Cedar Point, Sandusky, Ohio",
- "Magic Kingdom, Orlando, Florida",
- "Disneyland, Anaheim, California",
- "Six Flags Great Adventure, Jackson, New Jersey",
- "Invalid Address That Should Not Work 123456789",
- ]
-
- for address in test_addresses:
- print(f"\nGeocoding: {address}")
- coords = service.geocode_address(address)
- if coords:
- print(
- f" ✅ Success: {
- coords.latitude:.6f}, {
- coords.longitude:.6f}"
- )
- else:
- print(f" ❌ Failed")
-
- # Test cache functionality
- print(f"\nTesting cache...")
- coords1 = service.geocode_address("Cedar Point, Sandusky, Ohio")
- coords2 = service.geocode_address("Cedar Point, Sandusky, Ohio")
- if coords1 and coords2:
- print(f" ✅ Cache working: {coords1.latitude == coords2.latitude}")
-
-
-def test_route_calculation():
- """Test route calculation between coordinates."""
- print("\n=== Testing Route Calculation ===")
-
- service = RoadTripService()
-
- # Cedar Point to Magic Kingdom (long distance)
- cedar_point = Coordinates(41.4793, -82.6833)
- magic_kingdom = Coordinates(28.4177, -81.5812)
-
- print(f"Calculating route from Cedar Point to Magic Kingdom...")
- route = service.calculate_route(cedar_point, magic_kingdom)
-
- if route:
- print(f" ✅ Success:")
- print(f" Distance: {route.formatted_distance}")
- print(f" Duration: {route.formatted_duration}")
- print(f" Geometry: {'Yes' if route.geometry else 'No'}")
- else:
- print(f" ❌ Failed")
-
- # Test short distance (should use OSRM)
- disneyland = Coordinates(33.8121, -117.9190)
- knotts = Coordinates(33.8442, -118.0000)
-
- print(f"\nCalculating route from Disneyland to Knott's Berry Farm...")
- route = service.calculate_route(disneyland, knotts)
-
- if route:
- print(f" ✅ Success:")
- print(f" Distance: {route.formatted_distance}")
- print(f" Duration: {route.formatted_duration}")
- else:
- print(f" ❌ Failed")
-
-
-def test_park_integration():
- """Test integration with Park models."""
- print("\n=== Testing Park Integration ===")
-
- service = RoadTripService()
-
- # Get some parks from the database
- parks = Park.objects.select_related("location").all()[:5]
-
- if not parks:
- print(" ⚠️ No parks found in database")
- return
-
- print(f"Found {len(parks)} parks to test with:")
- for park in parks:
- print(f" - {park.name}")
- if hasattr(park, "location") and park.location:
- coords = park.coordinates
- if coords:
- print(f" 📍 {coords[0]:.4f}, {coords[1]:.4f}")
- else:
- print(f" 📍 No coordinates, will try to geocode...")
- success = service.geocode_park_if_needed(park)
- if success:
- coords = park.coordinates
- print(
- f" ✅ Geocoded to: {
- coords[0]:.4f}, {
- coords[1]:.4f}"
- )
- else:
- print(f" ❌ Geocoding failed")
- else:
- print(f" ❌ No location data")
-
-
-def test_nearby_parks():
- """Test finding nearby parks."""
- print("\n=== Testing Nearby Park Discovery ===")
-
- service = RoadTripService()
-
- # Get a park with location data
- parks_with_location = Park.objects.filter(
- location__point__isnull=False
- ).select_related("location")[:1]
-
- if not parks_with_location:
- print(" ⚠️ No parks with location data found")
- return
-
- center_park = parks_with_location[0]
- print(f"Finding parks within 200km of {center_park.name}...")
-
- nearby_parks = service.get_park_distances(center_park, radius_km=200)
-
- if nearby_parks:
- print(f" ✅ Found {len(nearby_parks)} nearby parks:")
- for result in nearby_parks[:5]: # Show first 5
- park = result["park"]
- print(
- f" {
- park.name}: {
- result['formatted_distance']}, {
- result['formatted_duration']}"
- )
- else:
- print(f" ❌ No nearby parks found")
-
-
-def test_route_park_discovery():
- """Test finding parks along a route."""
- print("\n=== Testing Parks Along Route ===")
-
- service = RoadTripService()
-
- # Get two parks with location data
- parks_with_location = Park.objects.filter(
- location__point__isnull=False
- ).select_related("location")[:2]
-
- if len(parks_with_location) < 2:
- print(" ⚠️ Need at least 2 parks with location data")
- return
-
- start_park = parks_with_location[0]
- end_park = parks_with_location[1]
-
- print(
- f"Finding parks along route from {
- start_park.name} to {
- end_park.name}..."
- )
-
- parks_along_route = service.find_parks_along_route(
- start_park, end_park, max_detour_km=100
- )
-
- if parks_along_route:
- print(f" ✅ Found {len(parks_along_route)} parks along route:")
- for park in parks_along_route[:3]: # Show first 3
- print(f" - {park.name}")
- else:
- print(f" ❌ No parks found along route")
-
-
-def test_multi_park_trip():
- """Test multi-park trip planning."""
- print("\n=== Testing Multi-Park Trip Planning ===")
-
- service = RoadTripService()
-
- # Get parks with location data
- parks_with_location = Park.objects.filter(
- location__point__isnull=False
- ).select_related("location")[:4]
-
- if len(parks_with_location) < 3:
- print(" ⚠️ Need at least 3 parks with location data")
- return
-
- parks_list = list(parks_with_location)
- print(f"Planning trip for {len(parks_list)} parks:")
- for park in parks_list:
- print(f" - {park.name}")
-
- trip = service.create_multi_park_trip(parks_list)
-
- if trip:
- print(f" ✅ Trip planned successfully:")
- print(f" Total Distance: {trip.formatted_total_distance}")
- print(f" Total Duration: {trip.formatted_total_duration}")
- print(f" Route:")
- for i, leg in enumerate(trip.legs, 1):
- print(f" {i}. {leg.from_park.name} → {leg.to_park.name}")
- print(
- f" {
- leg.route.formatted_distance}, {
- leg.route.formatted_duration}"
- )
- else:
- print(f" ❌ Trip planning failed")
-
-
-def test_error_handling():
- """Test error handling and edge cases."""
- print("\n=== Testing Error Handling ===")
-
- service = RoadTripService()
-
- # Test with invalid coordinates
- print("Testing invalid coordinates...")
- invalid_coords = Coordinates(999, 999)
- valid_coords = Coordinates(40.0, -80.0)
-
- route = service.calculate_route(invalid_coords, valid_coords)
- if route:
- print(
- f" ⚠️ Got route with invalid coords: {
- route.formatted_distance}"
- )
- else:
- print(f" ✅ Correctly handled invalid coordinates")
-
- # Test with empty address
- print("Testing empty address geocoding...")
- coords = service.geocode_address("")
- if coords:
- print(f" ⚠️ Got coordinates for empty address")
- else:
- print(f" ✅ Correctly handled empty address")
-
- # Test with None values
- print("Testing None coordinates...")
- route = service.calculate_route(None, valid_coords)
- if route:
- print(f" ⚠️ Got route with None coordinates")
- else:
- print(f" ✅ Correctly handled None coordinates")
-
-
-def test_rate_limiting():
- """Test rate limiting functionality."""
- print("\n=== Testing Rate Limiting ===")
-
- service = RoadTripService()
-
- print("Making multiple rapid requests to test rate limiting...")
- import time
-
- start_time = time.time()
-
- # Make 3 rapid geocoding requests
- addresses = [
- "Disney World, Orlando, FL",
- "Universal Studios, Orlando, FL",
- "SeaWorld, Orlando, FL",
- ]
-
- for address in addresses:
- coords = service.geocode_address(address)
- if coords:
- print(
- f" ✅ {address}: {
- coords.latitude:.4f}, {
- coords.longitude:.4f}"
- )
-
- elapsed = time.time() - start_time
- print(f" Total time for 3 requests: {elapsed:.2f} seconds")
-
- if elapsed >= 2.0: # Should take at least 2 seconds with 1 req/sec limit
- print(f" ✅ Rate limiting appears to be working")
- else:
- print(f" ⚠️ Requests may have been cached or rate limiting not working")
-
-
-def main():
- """Run all tests."""
- print("🚗 ThrillWiki Road Trip Service Test Suite")
- print("=" * 50)
-
- # Clear cache to ensure fresh tests
- cache.clear()
-
- try:
- test_geocoding()
- test_route_calculation()
- test_park_integration()
- test_nearby_parks()
- test_route_park_discovery()
- test_multi_park_trip()
- test_error_handling()
- test_rate_limiting()
-
- print("\n" + "=" * 50)
- print("🎉 Test suite completed!")
- print("\nNote: Some tests may show failures if:")
- print("- No park data exists in the database")
- print("- Network connectivity issues")
- print("- OSM API rate limits exceeded")
- print("- Parks don't have location data")
-
- except Exception as e:
- print(f"\n❌ Test suite failed with error: {e}")
- import traceback
-
- traceback.print_exc()
-
-
-if __name__ == "__main__":
- main()
diff --git a/test_unified_map_service.py b/test_unified_map_service.py
deleted file mode 100644
index cb3adb27..00000000
--- a/test_unified_map_service.py
+++ /dev/null
@@ -1,268 +0,0 @@
-#!/usr/bin/env python
-"""
-Test script for the unified map service.
-This script tests the map service with real location data.
-"""
-
-from core.services.data_structures import GeoBounds, MapFilters, LocationType
-from core.services.map_service import unified_map_service
-import os
-import sys
-import django
-
-# Setup Django environment
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thrillwiki.settings")
-django.setup()
-
-
-def test_basic_map_service():
- """Test basic map service functionality."""
- print("=" * 60)
- print("TESTING UNIFIED MAP SERVICE")
- print("=" * 60)
-
- try:
- # Test 1: Get all locations (no filters)
- print("\n1. Testing get_map_data() with no filters:")
- response = unified_map_service.get_map_data(zoom_level=10, cluster=False)
- print(f" Total locations found: {len(response.locations)}")
- print(f" Clusters: {len(response.clusters)}")
- print(f" Query time: {response.query_time_ms}ms")
- print(f" Cache hit: {response.cache_hit}")
-
- if response.locations:
- print(
- f" Sample location: {
- response.locations[0].name} ({
- response.locations[0].type.value})"
- )
-
- # Test 2: Get locations with bounds (Ohio area - Cedar Point region)
- print("\n2. Testing get_map_data() with bounds (Ohio):")
- ohio_bounds = GeoBounds(north=42.0, south=40.0, east=-80.5, west=-84.5)
- response = unified_map_service.get_map_data(
- bounds=ohio_bounds, zoom_level=8, cluster=False
- )
- print(f" Locations in Ohio bounds: {len(response.locations)}")
- print(f" Query time: {response.query_time_ms}ms")
-
- # Test 3: Test clustering
- print("\n3. Testing clustering functionality:")
- response = unified_map_service.get_map_data(
- bounds=ohio_bounds,
- zoom_level=6, # Lower zoom should trigger clustering
- cluster=True,
- )
- print(f" Locations (unclustered): {len(response.locations)}")
- print(f" Clusters: {len(response.clusters)}")
- print(f" Clustered: {response.clustered}")
-
- if response.clusters:
- cluster = response.clusters[0]
- print(
- f" Sample cluster: {
- cluster.count} points at {
- cluster.coordinates}"
- )
-
- # Test 4: Test filtering by type
- print("\n4. Testing location type filtering:")
- filters = MapFilters(location_types={LocationType.PARK})
- response = unified_map_service.get_map_data(
- filters=filters, zoom_level=10, cluster=False
- )
- print(f" Parks only: {len(response.locations)}")
-
- # Test 5: Test search functionality
- print("\n5. Testing search functionality:")
- results = unified_map_service.search_locations(query="Cedar Point", limit=5)
- print(f" Search results for 'Cedar Point': {len(results)}")
- if results:
- print(
- f" First result: {
- results[0].name} ({
- results[0].type.value})"
- )
-
- # Test 6: Test location detail retrieval
- print("\n6. Testing location detail retrieval:")
- if response.locations:
- location = response.locations[0]
- location_type, location_id = location.id.split("_", 1)
- detail = unified_map_service.get_location_details(
- location_type, int(location_id)
- )
- if detail:
- print(f" Retrieved details for: {detail.name}")
- print(f" Coordinates: {detail.coordinates}")
- print(f" Metadata keys: {list(detail.metadata.keys())}")
- else:
- print(" No details found")
-
- # Test 7: Test service statistics
- print("\n7. Testing service statistics:")
- stats = unified_map_service.get_service_stats()
- print(
- f" Cache hit rate: {
- stats['cache_performance']['hit_rate_percent']}%"
- )
- print(
- f" Supported location types: {
- stats['supported_location_types']}"
- )
- print(f" Max unclustered points: {stats['max_unclustered_points']}")
-
- print("\n" + "=" * 60)
- print("✅ ALL TESTS PASSED!")
- print("The unified map service is working correctly.")
- print("=" * 60)
-
- except Exception as e:
- print(f"\n❌ ERROR: {str(e)}")
- import traceback
-
- traceback.print_exc()
- return False
-
- return True
-
-
-def test_api_endpoints():
- """Test the API endpoints."""
- print("\n" + "=" * 60)
- print("TESTING API ENDPOINTS")
- print("=" * 60)
-
- try:
- from django.test import Client
-
- client = Client()
-
- # Test 1: Main locations endpoint
- print("\n1. Testing /api/map/locations/")
- response = client.get("/api/map/locations/")
- print(f" Status: {response.status_code}")
- if response.status_code == 200:
- data = response.json()
- print(f" Response status: {data.get('status')}")
- print(f" Locations: {len(data.get('data', {}).get('locations', []))}")
-
- # Test 2: Bounds endpoint
- print("\n2. Testing /api/map/bounds/")
- response = client.get("/api/map/bounds/?north=42&south=40&east=-80&west=-84")
- print(f" Status: {response.status_code}")
- if response.status_code == 200:
- data = response.json()
- print(
- f" Locations in bounds: {len(data.get('data', {}).get('locations', []))}"
- )
-
- # Test 3: Search endpoint
- print("\n3. Testing /api/map/search/")
- response = client.get("/api/map/search/?q=park")
- print(f" Status: {response.status_code}")
- if response.status_code == 200:
- data = response.json()
- print(
- f" Search results: {len(data.get('data', {}).get('locations', []))}"
- )
-
- # Test 4: Stats endpoint
- print("\n4. Testing /api/map/stats/")
- response = client.get("/api/map/stats/")
- print(f" Status: {response.status_code}")
- if response.status_code == 200:
- data = response.json()
- print(
- f" Service version: {
- data.get(
- 'data',
- {}).get('service_version')}"
- )
-
- print("\n✅ API ENDPOINTS WORKING!")
-
- except Exception as e:
- print(f"\n❌ API ERROR: {str(e)}")
- import traceback
-
- traceback.print_exc()
- return False
-
- return True
-
-
-def test_performance():
- """Test performance characteristics."""
- print("\n" + "=" * 60)
- print("TESTING PERFORMANCE")
- print("=" * 60)
-
- import time
-
- try:
- # Test response times
- times = []
- for i in range(5):
- start = time.time()
- unified_map_service.get_map_data(zoom_level=10, cluster=True)
- end = time.time()
- times.append((end - start) * 1000) # Convert to ms
-
- avg_time = sum(times) / len(times)
- print(f"\n Average response time: {avg_time:.2f}ms")
- print(f" Min time: {min(times):.2f}ms")
- print(f" Max time: {max(times):.2f}ms")
-
- # Test cache performance
- print(f"\n Testing cache performance:")
- start = time.time()
- response1 = unified_map_service.get_map_data(zoom_level=10, use_cache=True)
- time1 = time.time() - start
-
- start = time.time()
- response2 = unified_map_service.get_map_data(zoom_level=10, use_cache=True)
- time2 = time.time() - start
-
- print(
- f" First call: {
- time1 *
- 1000:.2f}ms (cache miss: {
- not response1.cache_hit})"
- )
- print(
- f" Second call: {
- time2 *
- 1000:.2f}ms (cache hit: {
- response2.cache_hit})"
- )
-
- if response2.cache_hit and time2 < time1:
- print(" ✅ Cache is working and providing performance benefit!")
-
- print("\n✅ PERFORMANCE TESTS COMPLETED!")
-
- except Exception as e:
- print(f"\n❌ PERFORMANCE ERROR: {str(e)}")
- import traceback
-
- traceback.print_exc()
- return False
-
- return True
-
-
-if __name__ == "__main__":
- print("Starting unified map service tests...")
-
- success = True
- success &= test_basic_map_service()
- success &= test_api_endpoints()
- success &= test_performance()
-
- if success:
- print("\n🎉 ALL TESTS COMPLETED SUCCESSFULLY!")
- print("The unified map service implementation is working correctly.")
- else:
- print("\n💥 SOME TESTS FAILED!")
- sys.exit(1)
diff --git a/uv.lock b/uv.lock
deleted file mode 100644
index 2c29131e..00000000
--- a/uv.lock
+++ /dev/null
@@ -1,2612 +0,0 @@
-version = 1
-revision = 2
-requires-python = ">=3.13"
-
-[[package]]
-name = "amqp"
-version = "5.3.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "vine" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/79/fc/ec94a357dfc6683d8c86f8b4cfa5416a4c36b28052ec8260c77aca96a443/amqp-5.3.1.tar.gz", hash = "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432", size = 129013, upload-time = "2024-11-12T19:55:44.051Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/26/99/fc813cd978842c26c82534010ea849eee9ab3a13ea2b74e95cb9c99e747b/amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2", size = 50944, upload-time = "2024-11-12T19:55:41.782Z" },
-]
-
-[[package]]
-name = "anyio"
-version = "4.10.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "idna" },
- { name = "sniffio" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" },
-]
-
-[[package]]
-name = "asgiref"
-version = "3.9.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142", size = 36870, upload-time = "2025-07-08T09:07:43.344Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c", size = 23790, upload-time = "2025-07-08T09:07:41.548Z" },
-]
-
-[[package]]
-name = "attrs"
-version = "25.3.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" },
-]
-
-[[package]]
-name = "autobahn"
-version = "24.4.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "cryptography" },
- { name = "hyperlink" },
- { name = "setuptools" },
- { name = "txaio" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/38/f2/8dffb3b709383ba5b47628b0cc4e43e8d12d59eecbddb62cfccac2e7cf6a/autobahn-24.4.2.tar.gz", hash = "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9", size = 482700, upload-time = "2024-08-02T09:26:48.241Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/13/ee/a6475f39ef6c6f41c33da6b193e0ffd2c6048f52e1698be6253c59301b72/autobahn-24.4.2-py2.py3-none-any.whl", hash = "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81", size = 666965, upload-time = "2024-08-02T09:26:44.274Z" },
-]
-
-[[package]]
-name = "autoflake"
-version = "2.3.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pyflakes" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/2a/cb/486f912d6171bc5748c311a2984a301f4e2d054833a1da78485866c71522/autoflake-2.3.1.tar.gz", hash = "sha256:c98b75dc5b0a86459c4f01a1d32ac7eb4338ec4317a4469515ff1e687ecd909e", size = 27642, upload-time = "2024-03-13T03:41:28.977Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a2/ee/3fd29bf416eb4f1c5579cf12bf393ae954099258abd7bde03c4f9716ef6b/autoflake-2.3.1-py3-none-any.whl", hash = "sha256:3ae7495db9084b7b32818b4140e6dc4fc280b712fb414f5b8fe57b0a8e85a840", size = 32483, upload-time = "2024-03-13T03:41:26.969Z" },
-]
-
-[[package]]
-name = "automat"
-version = "25.4.16"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e3/0f/d40bbe294bbf004d436a8bcbcfaadca8b5140d39ad0ad3d73d1a8ba15f14/automat-25.4.16.tar.gz", hash = "sha256:0017591a5477066e90d26b0e696ddc143baafd87b588cfac8100bc6be9634de0", size = 129977, upload-time = "2025-04-16T20:12:16.002Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/02/ff/1175b0b7371e46244032d43a56862d0af455823b5280a50c63d99cc50f18/automat-25.4.16-py3-none-any.whl", hash = "sha256:04e9bce696a8d5671ee698005af6e5a9fa15354140a87f4870744604dcdd3ba1", size = 42842, upload-time = "2025-04-16T20:12:14.447Z" },
-]
-
-[[package]]
-name = "autopep8"
-version = "2.3.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pycodestyle" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/50/d8/30873d2b7b57dee9263e53d142da044c4600a46f2d28374b3e38b023df16/autopep8-2.3.2.tar.gz", hash = "sha256:89440a4f969197b69a995e4ce0661b031f455a9f776d2c5ba3dbd83466931758", size = 92210, upload-time = "2025-01-14T14:46:18.454Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl", hash = "sha256:ce8ad498672c845a0c3de2629c15b635ec2b05ef8177a6e7c91c74f3e9b51128", size = 45807, upload-time = "2025-01-14T14:46:15.466Z" },
-]
-
-[[package]]
-name = "billiard"
-version = "4.2.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/7c/58/1546c970afcd2a2428b1bfafecf2371d8951cc34b46701bea73f4280989e/billiard-4.2.1.tar.gz", hash = "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f", size = 155031, upload-time = "2024-09-21T13:40:22.491Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/30/da/43b15f28fe5f9e027b41c539abc5469052e9d48fd75f8ff094ba2a0ae767/billiard-4.2.1-py3-none-any.whl", hash = "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb", size = 86766, upload-time = "2024-09-21T13:40:20.188Z" },
-]
-
-[[package]]
-name = "black"
-version = "25.9.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
- { name = "mypy-extensions" },
- { name = "packaging" },
- { name = "pathspec" },
- { name = "platformdirs" },
- { name = "pytokens" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/4b/43/20b5c90612d7bdb2bdbcceeb53d588acca3bb8f0e4c5d5c751a2c8fdd55a/black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619", size = 648393, upload-time = "2025-09-19T00:27:37.758Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/48/99/3acfea65f5e79f45472c45f87ec13037b506522719cd9d4ac86484ff51ac/black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175", size = 1742165, upload-time = "2025-09-19T00:34:10.402Z" },
- { url = "https://files.pythonhosted.org/packages/3a/18/799285282c8236a79f25d590f0222dbd6850e14b060dfaa3e720241fd772/black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f", size = 1581259, upload-time = "2025-09-19T00:32:49.685Z" },
- { url = "https://files.pythonhosted.org/packages/f1/ce/883ec4b6303acdeca93ee06b7622f1fa383c6b3765294824165d49b1a86b/black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831", size = 1655583, upload-time = "2025-09-19T00:30:44.505Z" },
- { url = "https://files.pythonhosted.org/packages/21/17/5c253aa80a0639ccc427a5c7144534b661505ae2b5a10b77ebe13fa25334/black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357", size = 1343428, upload-time = "2025-09-19T00:32:13.839Z" },
- { url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae", size = 203363, upload-time = "2025-09-19T00:27:35.724Z" },
-]
-
-[[package]]
-name = "blinker"
-version = "1.9.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" },
-]
-
-[[package]]
-name = "build"
-version = "1.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "colorama", marker = "os_name == 'nt'" },
- { name = "packaging" },
- { name = "pyproject-hooks" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/25/1c/23e33405a7c9eac261dff640926b8b5adaed6a6eb3e1767d441ed611d0c0/build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397", size = 48544, upload-time = "2025-08-01T21:27:09.268Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4", size = 23382, upload-time = "2025-08-01T21:27:07.844Z" },
-]
-
-[[package]]
-name = "cachecontrol"
-version = "0.14.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "msgpack" },
- { name = "requests" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/58/3a/0cbeb04ea57d2493f3ec5a069a117ab467f85e4a10017c6d854ddcbff104/cachecontrol-0.14.3.tar.gz", hash = "sha256:73e7efec4b06b20d9267b441c1f733664f989fb8688391b670ca812d70795d11", size = 28985, upload-time = "2025-04-30T16:45:06.135Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/81/4c/800b0607b00b3fd20f1087f80ab53d6b4d005515b0f773e4831e37cfa83f/cachecontrol-0.14.3-py3-none-any.whl", hash = "sha256:b35e44a3113f17d2a31c1e6b27b9de6d4405f84ae51baa8c1d3cc5b633010cae", size = 21802, upload-time = "2025-04-30T16:45:03.863Z" },
-]
-
-[package.optional-dependencies]
-filecache = [
- { name = "filelock" },
-]
-
-[[package]]
-name = "celery"
-version = "5.5.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "billiard" },
- { name = "click" },
- { name = "click-didyoumean" },
- { name = "click-plugins" },
- { name = "click-repl" },
- { name = "kombu" },
- { name = "python-dateutil" },
- { name = "vine" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/bb/7d/6c289f407d219ba36d8b384b42489ebdd0c84ce9c413875a8aae0c85f35b/celery-5.5.3.tar.gz", hash = "sha256:6c972ae7968c2b5281227f01c3a3f984037d21c5129d07bf3550cc2afc6b10a5", size = 1667144, upload-time = "2025-06-01T11:08:12.563Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c9/af/0dcccc7fdcdf170f9a1585e5e96b6fb0ba1749ef6be8c89a6202284759bd/celery-5.5.3-py3-none-any.whl", hash = "sha256:0b5761a07057acee94694464ca482416b959568904c9dfa41ce8413a7d65d525", size = 438775, upload-time = "2025-06-01T11:08:09.94Z" },
-]
-
-[[package]]
-name = "certifi"
-version = "2025.8.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" },
-]
-
-[[package]]
-name = "cffi"
-version = "2.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pycparser", marker = "implementation_name != 'PyPy'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
- { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
- { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
- { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
- { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
- { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" },
- { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
- { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
- { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
- { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
- { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
- { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
- { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
- { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
- { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
- { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
- { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
- { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
- { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
- { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
- { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
- { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
- { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
- { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
- { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
- { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
- { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
- { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
- { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
- { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
- { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
- { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
- { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
- { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
-]
-
-[[package]]
-name = "channels"
-version = "4.3.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asgiref" },
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/12/a0/46450fcf9e56af18a6b0440ba49db6635419bb7bc84142c35f4143b1a66c/channels-4.3.1.tar.gz", hash = "sha256:97413ffd674542db08e16a9ef09cd86ec0113e5f8125fbd33cf0854adcf27cdb", size = 26896, upload-time = "2025-08-01T13:25:19.952Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/89/1c/eae1c2a8c195760376e7f65d0bdcc3e966695d29cfbe5c54841ce5c71408/channels-4.3.1-py3-none-any.whl", hash = "sha256:b091d4b26f91d807de3e84aead7ba785314f27eaf5bac31dd51b1c956b883859", size = 31286, upload-time = "2025-08-01T13:25:18.845Z" },
-]
-
-[[package]]
-name = "channels-redis"
-version = "4.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asgiref" },
- { name = "channels" },
- { name = "msgpack" },
- { name = "redis" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/ab/69/fd3407ad407a80e72ca53850eb7a4c306273e67d5bbb71a86d0e6d088439/channels_redis-4.3.0.tar.gz", hash = "sha256:740ee7b54f0e28cf2264a940a24453d3f00526a96931f911fcb69228ef245dd2", size = 31440, upload-time = "2025-07-22T13:48:46.087Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/df/fe/b7224a401ad227b263e5ba84753ffb5a88df048f3b15efd2797903543ce4/channels_redis-4.3.0-py3-none-any.whl", hash = "sha256:48f3e902ae2d5fef7080215524f3b4a1d3cea4e304150678f867a1a822c0d9f5", size = 20641, upload-time = "2025-07-22T13:48:44.545Z" },
-]
-
-[[package]]
-name = "charset-normalizer"
-version = "3.4.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" },
- { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" },
- { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" },
- { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" },
- { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" },
- { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" },
- { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" },
- { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" },
- { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" },
- { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" },
- { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" },
- { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" },
- { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" },
- { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" },
- { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" },
- { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" },
- { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" },
- { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" },
- { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" },
- { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" },
- { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" },
- { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" },
- { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" },
-]
-
-[[package]]
-name = "cleo"
-version = "2.1.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "crashtest" },
- { name = "rapidfuzz" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/3c/30/f7960ed7041b158301c46774f87620352d50a9028d111b4211187af13783/cleo-2.1.0.tar.gz", hash = "sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523", size = 79957, upload-time = "2023-10-30T18:54:12.057Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2d/f5/6bbead8b880620e5a99e0e4bb9e22e67cca16ff48d54105302a3e7821096/cleo-2.1.0-py3-none-any.whl", hash = "sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e", size = 78711, upload-time = "2023-10-30T18:54:08.557Z" },
-]
-
-[[package]]
-name = "click"
-version = "8.2.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "colorama", marker = "sys_platform == 'win32'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" },
-]
-
-[[package]]
-name = "click-didyoumean"
-version = "0.3.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/30/ce/217289b77c590ea1e7c24242d9ddd6e249e52c795ff10fac2c50062c48cb/click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463", size = 3089, upload-time = "2024-03-24T08:22:07.499Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1b/5b/974430b5ffdb7a4f1941d13d83c64a0395114503cc357c6b9ae4ce5047ed/click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c", size = 3631, upload-time = "2024-03-24T08:22:06.356Z" },
-]
-
-[[package]]
-name = "click-plugins"
-version = "1.1.1.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/c3/a4/34847b59150da33690a36da3681d6bbc2ec14ee9a846bc30a6746e5984e4/click_plugins-1.1.1.2.tar.gz", hash = "sha256:d7af3984a99d243c131aa1a828331e7630f4a88a9741fd05c927b204bcf92261", size = 8343, upload-time = "2025-06-25T00:47:37.555Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3d/9a/2abecb28ae875e39c8cad711eb1186d8d14eab564705325e77e4e6ab9ae5/click_plugins-1.1.1.2-py2.py3-none-any.whl", hash = "sha256:008d65743833ffc1f5417bf0e78e8d2c23aab04d9745ba817bd3e71b0feb6aa6", size = 11051, upload-time = "2025-06-25T00:47:36.731Z" },
-]
-
-[[package]]
-name = "click-repl"
-version = "0.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
- { name = "prompt-toolkit" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/cb/a2/57f4ac79838cfae6912f997b4d1a64a858fb0c86d7fcaae6f7b58d267fca/click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9", size = 10449, upload-time = "2023-06-15T12:43:51.141Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/52/40/9d857001228658f0d59e97ebd4c346fe73e138c6de1bce61dc568a57c7f8/click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812", size = 10289, upload-time = "2023-06-15T12:43:48.626Z" },
-]
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
-]
-
-[[package]]
-name = "constantly"
-version = "23.10.4"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/4d/6f/cb2a94494ff74aa9528a36c5b1422756330a75a8367bf20bd63171fc324d/constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd", size = 13300, upload-time = "2023-10-28T23:18:24.316Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b8/40/c199d095151addf69efdb4b9ca3a4f20f70e20508d6222bffb9b76f58573/constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9", size = 13547, upload-time = "2023-10-28T23:18:23.038Z" },
-]
-
-[[package]]
-name = "coverage"
-version = "7.10.6"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/14/70/025b179c993f019105b79575ac6edb5e084fb0f0e63f15cdebef4e454fb5/coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90", size = 823736, upload-time = "2025-08-29T15:35:16.668Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/bd/e7/917e5953ea29a28c1057729c1d5af9084ab6d9c66217523fd0e10f14d8f6/coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6", size = 217351, upload-time = "2025-08-29T15:33:45.438Z" },
- { url = "https://files.pythonhosted.org/packages/eb/86/2e161b93a4f11d0ea93f9bebb6a53f113d5d6e416d7561ca41bb0a29996b/coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80", size = 217600, upload-time = "2025-08-29T15:33:47.269Z" },
- { url = "https://files.pythonhosted.org/packages/0e/66/d03348fdd8df262b3a7fb4ee5727e6e4936e39e2f3a842e803196946f200/coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003", size = 248600, upload-time = "2025-08-29T15:33:48.953Z" },
- { url = "https://files.pythonhosted.org/packages/73/dd/508420fb47d09d904d962f123221bc249f64b5e56aa93d5f5f7603be475f/coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27", size = 251206, upload-time = "2025-08-29T15:33:50.697Z" },
- { url = "https://files.pythonhosted.org/packages/e9/1f/9020135734184f439da85c70ea78194c2730e56c2d18aee6e8ff1719d50d/coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4", size = 252478, upload-time = "2025-08-29T15:33:52.303Z" },
- { url = "https://files.pythonhosted.org/packages/a4/a4/3d228f3942bb5a2051fde28c136eea23a761177dc4ff4ef54533164ce255/coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d", size = 250637, upload-time = "2025-08-29T15:33:53.67Z" },
- { url = "https://files.pythonhosted.org/packages/36/e3/293dce8cdb9a83de971637afc59b7190faad60603b40e32635cbd15fbf61/coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc", size = 248529, upload-time = "2025-08-29T15:33:55.022Z" },
- { url = "https://files.pythonhosted.org/packages/90/26/64eecfa214e80dd1d101e420cab2901827de0e49631d666543d0e53cf597/coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc", size = 250143, upload-time = "2025-08-29T15:33:56.386Z" },
- { url = "https://files.pythonhosted.org/packages/3e/70/bd80588338f65ea5b0d97e424b820fb4068b9cfb9597fbd91963086e004b/coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e", size = 219770, upload-time = "2025-08-29T15:33:58.063Z" },
- { url = "https://files.pythonhosted.org/packages/a7/14/0b831122305abcc1060c008f6c97bbdc0a913ab47d65070a01dc50293c2b/coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32", size = 220566, upload-time = "2025-08-29T15:33:59.766Z" },
- { url = "https://files.pythonhosted.org/packages/83/c6/81a83778c1f83f1a4a168ed6673eeedc205afb562d8500175292ca64b94e/coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2", size = 219195, upload-time = "2025-08-29T15:34:01.191Z" },
- { url = "https://files.pythonhosted.org/packages/d7/1c/ccccf4bf116f9517275fa85047495515add43e41dfe8e0bef6e333c6b344/coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b", size = 218059, upload-time = "2025-08-29T15:34:02.91Z" },
- { url = "https://files.pythonhosted.org/packages/92/97/8a3ceff833d27c7492af4f39d5da6761e9ff624831db9e9f25b3886ddbca/coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393", size = 218287, upload-time = "2025-08-29T15:34:05.106Z" },
- { url = "https://files.pythonhosted.org/packages/92/d8/50b4a32580cf41ff0423777a2791aaf3269ab60c840b62009aec12d3970d/coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27", size = 259625, upload-time = "2025-08-29T15:34:06.575Z" },
- { url = "https://files.pythonhosted.org/packages/7e/7e/6a7df5a6fb440a0179d94a348eb6616ed4745e7df26bf2a02bc4db72c421/coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df", size = 261801, upload-time = "2025-08-29T15:34:08.006Z" },
- { url = "https://files.pythonhosted.org/packages/3a/4c/a270a414f4ed5d196b9d3d67922968e768cd971d1b251e1b4f75e9362f75/coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb", size = 264027, upload-time = "2025-08-29T15:34:09.806Z" },
- { url = "https://files.pythonhosted.org/packages/9c/8b/3210d663d594926c12f373c5370bf1e7c5c3a427519a8afa65b561b9a55c/coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282", size = 261576, upload-time = "2025-08-29T15:34:11.585Z" },
- { url = "https://files.pythonhosted.org/packages/72/d0/e1961eff67e9e1dba3fc5eb7a4caf726b35a5b03776892da8d79ec895775/coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4", size = 259341, upload-time = "2025-08-29T15:34:13.159Z" },
- { url = "https://files.pythonhosted.org/packages/3a/06/d6478d152cd189b33eac691cba27a40704990ba95de49771285f34a5861e/coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21", size = 260468, upload-time = "2025-08-29T15:34:14.571Z" },
- { url = "https://files.pythonhosted.org/packages/ed/73/737440247c914a332f0b47f7598535b29965bf305e19bbc22d4c39615d2b/coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0", size = 220429, upload-time = "2025-08-29T15:34:16.394Z" },
- { url = "https://files.pythonhosted.org/packages/bd/76/b92d3214740f2357ef4a27c75a526eb6c28f79c402e9f20a922c295c05e2/coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5", size = 221493, upload-time = "2025-08-29T15:34:17.835Z" },
- { url = "https://files.pythonhosted.org/packages/fc/8e/6dcb29c599c8a1f654ec6cb68d76644fe635513af16e932d2d4ad1e5ac6e/coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b", size = 219757, upload-time = "2025-08-29T15:34:19.248Z" },
- { url = "https://files.pythonhosted.org/packages/d3/aa/76cf0b5ec00619ef208da4689281d48b57f2c7fde883d14bf9441b74d59f/coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e", size = 217331, upload-time = "2025-08-29T15:34:20.846Z" },
- { url = "https://files.pythonhosted.org/packages/65/91/8e41b8c7c505d398d7730206f3cbb4a875a35ca1041efc518051bfce0f6b/coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb", size = 217607, upload-time = "2025-08-29T15:34:22.433Z" },
- { url = "https://files.pythonhosted.org/packages/87/7f/f718e732a423d442e6616580a951b8d1ec3575ea48bcd0e2228386805e79/coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034", size = 248663, upload-time = "2025-08-29T15:34:24.425Z" },
- { url = "https://files.pythonhosted.org/packages/e6/52/c1106120e6d801ac03e12b5285e971e758e925b6f82ee9b86db3aa10045d/coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1", size = 251197, upload-time = "2025-08-29T15:34:25.906Z" },
- { url = "https://files.pythonhosted.org/packages/3d/ec/3a8645b1bb40e36acde9c0609f08942852a4af91a937fe2c129a38f2d3f5/coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a", size = 252551, upload-time = "2025-08-29T15:34:27.337Z" },
- { url = "https://files.pythonhosted.org/packages/a1/70/09ecb68eeb1155b28a1d16525fd3a9b65fbe75337311a99830df935d62b6/coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb", size = 250553, upload-time = "2025-08-29T15:34:29.065Z" },
- { url = "https://files.pythonhosted.org/packages/c6/80/47df374b893fa812e953b5bc93dcb1427a7b3d7a1a7d2db33043d17f74b9/coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d", size = 248486, upload-time = "2025-08-29T15:34:30.897Z" },
- { url = "https://files.pythonhosted.org/packages/4a/65/9f98640979ecee1b0d1a7164b589de720ddf8100d1747d9bbdb84be0c0fb/coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747", size = 249981, upload-time = "2025-08-29T15:34:32.365Z" },
- { url = "https://files.pythonhosted.org/packages/1f/55/eeb6603371e6629037f47bd25bef300387257ed53a3c5fdb159b7ac8c651/coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5", size = 220054, upload-time = "2025-08-29T15:34:34.124Z" },
- { url = "https://files.pythonhosted.org/packages/15/d1/a0912b7611bc35412e919a2cd59ae98e7ea3b475e562668040a43fb27897/coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713", size = 220851, upload-time = "2025-08-29T15:34:35.651Z" },
- { url = "https://files.pythonhosted.org/packages/ef/2d/11880bb8ef80a45338e0b3e0725e4c2d73ffbb4822c29d987078224fd6a5/coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32", size = 219429, upload-time = "2025-08-29T15:34:37.16Z" },
- { url = "https://files.pythonhosted.org/packages/83/c0/1f00caad775c03a700146f55536ecd097a881ff08d310a58b353a1421be0/coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65", size = 218080, upload-time = "2025-08-29T15:34:38.919Z" },
- { url = "https://files.pythonhosted.org/packages/a9/c4/b1c5d2bd7cc412cbeb035e257fd06ed4e3e139ac871d16a07434e145d18d/coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6", size = 218293, upload-time = "2025-08-29T15:34:40.425Z" },
- { url = "https://files.pythonhosted.org/packages/3f/07/4468d37c94724bf6ec354e4ec2f205fda194343e3e85fd2e59cec57e6a54/coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0", size = 259800, upload-time = "2025-08-29T15:34:41.996Z" },
- { url = "https://files.pythonhosted.org/packages/82/d8/f8fb351be5fee31690cd8da768fd62f1cfab33c31d9f7baba6cd8960f6b8/coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e", size = 261965, upload-time = "2025-08-29T15:34:43.61Z" },
- { url = "https://files.pythonhosted.org/packages/e8/70/65d4d7cfc75c5c6eb2fed3ee5cdf420fd8ae09c4808723a89a81d5b1b9c3/coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5", size = 264220, upload-time = "2025-08-29T15:34:45.387Z" },
- { url = "https://files.pythonhosted.org/packages/98/3c/069df106d19024324cde10e4ec379fe2fb978017d25e97ebee23002fbadf/coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7", size = 261660, upload-time = "2025-08-29T15:34:47.288Z" },
- { url = "https://files.pythonhosted.org/packages/fc/8a/2974d53904080c5dc91af798b3a54a4ccb99a45595cc0dcec6eb9616a57d/coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5", size = 259417, upload-time = "2025-08-29T15:34:48.779Z" },
- { url = "https://files.pythonhosted.org/packages/30/38/9616a6b49c686394b318974d7f6e08f38b8af2270ce7488e879888d1e5db/coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0", size = 260567, upload-time = "2025-08-29T15:34:50.718Z" },
- { url = "https://files.pythonhosted.org/packages/76/16/3ed2d6312b371a8cf804abf4e14895b70e4c3491c6e53536d63fd0958a8d/coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7", size = 220831, upload-time = "2025-08-29T15:34:52.653Z" },
- { url = "https://files.pythonhosted.org/packages/d5/e5/d38d0cb830abede2adb8b147770d2a3d0e7fecc7228245b9b1ae6c24930a/coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930", size = 221950, upload-time = "2025-08-29T15:34:54.212Z" },
- { url = "https://files.pythonhosted.org/packages/f4/51/e48e550f6279349895b0ffcd6d2a690e3131ba3a7f4eafccc141966d4dea/coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b", size = 219969, upload-time = "2025-08-29T15:34:55.83Z" },
- { url = "https://files.pythonhosted.org/packages/44/0c/50db5379b615854b5cf89146f8f5bd1d5a9693d7f3a987e269693521c404/coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3", size = 208986, upload-time = "2025-08-29T15:35:14.506Z" },
-]
-
-[[package]]
-name = "crashtest"
-version = "0.4.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6e/5d/d79f51058e75948d6c9e7a3d679080a47be61c84d3cc8f71ee31255eb22b/crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce", size = 4708, upload-time = "2022-11-02T21:15:13.722Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b0/5c/3ba7d12e7a79566f97b8f954400926d7b6eb33bcdccc1315a857f200f1f1/crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5", size = 7558, upload-time = "2022-11-02T21:15:12.437Z" },
-]
-
-[[package]]
-name = "cron-descriptor"
-version = "2.0.6"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/7c/31/0b21d1599656b2ffa6043e51ca01041cd1c0f6dacf5a3e2b620ed120e7d8/cron_descriptor-2.0.6.tar.gz", hash = "sha256:e39d2848e1d8913cfb6e3452e701b5eec662ee18bea8cc5aa53ee1a7bb217157", size = 49456, upload-time = "2025-09-03T16:30:22.434Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/21/cc/361326a54ad92e2e12845ad15e335a4e14b8953665007fb514d3393dfb0f/cron_descriptor-2.0.6-py3-none-any.whl", hash = "sha256:3a1c0d837c0e5a32e415f821b36cf758eb92d510e6beff8fbfe4fa16573d93d6", size = 74446, upload-time = "2025-09-03T16:30:21.397Z" },
-]
-
-[[package]]
-name = "cryptography"
-version = "46.0.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a9/62/e3664e6ffd7743e1694b244dde70b43a394f6f7fbcacf7014a8ff5197c73/cryptography-46.0.1.tar.gz", hash = "sha256:ed570874e88f213437f5cf758f9ef26cbfc3f336d889b1e592ee11283bb8d1c7", size = 749198, upload-time = "2025-09-17T00:10:35.797Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/4c/8c/44ee01267ec01e26e43ebfdae3f120ec2312aa72fa4c0507ebe41a26739f/cryptography-46.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:1cd6d50c1a8b79af1a6f703709d8973845f677c8e97b1268f5ff323d38ce8475", size = 7285044, upload-time = "2025-09-17T00:08:36.807Z" },
- { url = "https://files.pythonhosted.org/packages/22/59/9ae689a25047e0601adfcb159ec4f83c0b4149fdb5c3030cc94cd218141d/cryptography-46.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0ff483716be32690c14636e54a1f6e2e1b7bf8e22ca50b989f88fa1b2d287080", size = 4308182, upload-time = "2025-09-17T00:08:39.388Z" },
- { url = "https://files.pythonhosted.org/packages/c4/ee/ca6cc9df7118f2fcd142c76b1da0f14340d77518c05b1ebfbbabca6b9e7d/cryptography-46.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9873bf7c1f2a6330bdfe8621e7ce64b725784f9f0c3a6a55c3047af5849f920e", size = 4572393, upload-time = "2025-09-17T00:08:41.663Z" },
- { url = "https://files.pythonhosted.org/packages/7f/a3/0f5296f63815d8e985922b05c31f77ce44787b3127a67c0b7f70f115c45f/cryptography-46.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0dfb7c88d4462a0cfdd0d87a3c245a7bc3feb59de101f6ff88194f740f72eda6", size = 4308400, upload-time = "2025-09-17T00:08:43.559Z" },
- { url = "https://files.pythonhosted.org/packages/5d/8c/74fcda3e4e01be1d32775d5b4dd841acaac3c1b8fa4d0774c7ac8d52463d/cryptography-46.0.1-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e22801b61613ebdebf7deb18b507919e107547a1d39a3b57f5f855032dd7cfb8", size = 4015786, upload-time = "2025-09-17T00:08:45.758Z" },
- { url = "https://files.pythonhosted.org/packages/dc/b8/85d23287baeef273b0834481a3dd55bbed3a53587e3b8d9f0898235b8f91/cryptography-46.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:757af4f6341ce7a1e47c326ca2a81f41d236070217e5fbbad61bbfe299d55d28", size = 4982606, upload-time = "2025-09-17T00:08:47.602Z" },
- { url = "https://files.pythonhosted.org/packages/e5/d3/de61ad5b52433b389afca0bc70f02a7a1f074651221f599ce368da0fe437/cryptography-46.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f7a24ea78de345cfa7f6a8d3bde8b242c7fac27f2bd78fa23474ca38dfaeeab9", size = 4604234, upload-time = "2025-09-17T00:08:49.879Z" },
- { url = "https://files.pythonhosted.org/packages/dc/1f/dbd4d6570d84748439237a7478d124ee0134bf166ad129267b7ed8ea6d22/cryptography-46.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e8776dac9e660c22241b6587fae51a67b4b0147daa4d176b172c3ff768ad736", size = 4307669, upload-time = "2025-09-17T00:08:52.321Z" },
- { url = "https://files.pythonhosted.org/packages/ec/fd/ca0a14ce7f0bfe92fa727aacaf2217eb25eb7e4ed513b14d8e03b26e63ed/cryptography-46.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9f40642a140c0c8649987027867242b801486865277cbabc8c6059ddef16dc8b", size = 4947579, upload-time = "2025-09-17T00:08:54.697Z" },
- { url = "https://files.pythonhosted.org/packages/89/6b/09c30543bb93401f6f88fce556b3bdbb21e55ae14912c04b7bf355f5f96c/cryptography-46.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:449ef2b321bec7d97ef2c944173275ebdab78f3abdd005400cc409e27cd159ab", size = 4603669, upload-time = "2025-09-17T00:08:57.16Z" },
- { url = "https://files.pythonhosted.org/packages/23/9a/38cb01cb09ce0adceda9fc627c9cf98eb890fc8d50cacbe79b011df20f8a/cryptography-46.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2dd339ba3345b908fa3141ddba4025568fa6fd398eabce3ef72a29ac2d73ad75", size = 4435828, upload-time = "2025-09-17T00:08:59.606Z" },
- { url = "https://files.pythonhosted.org/packages/0f/53/435b5c36a78d06ae0bef96d666209b0ecd8f8181bfe4dda46536705df59e/cryptography-46.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7411c910fb2a412053cf33cfad0153ee20d27e256c6c3f14d7d7d1d9fec59fd5", size = 4709553, upload-time = "2025-09-17T00:09:01.832Z" },
- { url = "https://files.pythonhosted.org/packages/f5/c4/0da6e55595d9b9cd3b6eb5dc22f3a07ded7f116a3ea72629cab595abb804/cryptography-46.0.1-cp311-abi3-win32.whl", hash = "sha256:cbb8e769d4cac884bb28e3ff620ef1001b75588a5c83c9c9f1fdc9afbe7f29b0", size = 3058327, upload-time = "2025-09-17T00:09:03.726Z" },
- { url = "https://files.pythonhosted.org/packages/95/0f/cd29a35e0d6e78a0ee61793564c8cff0929c38391cb0de27627bdc7525aa/cryptography-46.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:92e8cfe8bd7dd86eac0a677499894862cd5cc2fd74de917daa881d00871ac8e7", size = 3523893, upload-time = "2025-09-17T00:09:06.272Z" },
- { url = "https://files.pythonhosted.org/packages/f2/dd/eea390f3e78432bc3d2f53952375f8b37cb4d37783e626faa6a51e751719/cryptography-46.0.1-cp311-abi3-win_arm64.whl", hash = "sha256:db5597a4c7353b2e5fb05a8e6cb74b56a4658a2b7bf3cb6b1821ae7e7fd6eaa0", size = 2932145, upload-time = "2025-09-17T00:09:08.568Z" },
- { url = "https://files.pythonhosted.org/packages/0a/fb/c73588561afcd5e24b089952bd210b14676c0c5bf1213376350ae111945c/cryptography-46.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:4c49eda9a23019e11d32a0eb51a27b3e7ddedde91e099c0ac6373e3aacc0d2ee", size = 7193928, upload-time = "2025-09-17T00:09:10.595Z" },
- { url = "https://files.pythonhosted.org/packages/26/34/0ff0bb2d2c79f25a2a63109f3b76b9108a906dd2a2eb5c1d460b9938adbb/cryptography-46.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9babb7818fdd71394e576cf26c5452df77a355eac1a27ddfa24096665a27f8fd", size = 4293515, upload-time = "2025-09-17T00:09:12.861Z" },
- { url = "https://files.pythonhosted.org/packages/df/b7/d4f848aee24ecd1be01db6c42c4a270069a4f02a105d9c57e143daf6cf0f/cryptography-46.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9f2c4cc63be3ef43c0221861177cee5d14b505cd4d4599a89e2cd273c4d3542a", size = 4545619, upload-time = "2025-09-17T00:09:15.397Z" },
- { url = "https://files.pythonhosted.org/packages/44/a5/42fedefc754fd1901e2d95a69815ea4ec8a9eed31f4c4361fcab80288661/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:41c281a74df173876da1dc9a9b6953d387f06e3d3ed9284e3baae3ab3f40883a", size = 4299160, upload-time = "2025-09-17T00:09:17.155Z" },
- { url = "https://files.pythonhosted.org/packages/86/a1/cd21174f56e769c831fbbd6399a1b7519b0ff6280acec1b826d7b072640c/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0a17377fa52563d730248ba1f68185461fff36e8bc75d8787a7dd2e20a802b7a", size = 3994491, upload-time = "2025-09-17T00:09:18.971Z" },
- { url = "https://files.pythonhosted.org/packages/8d/2f/a8cbfa1c029987ddc746fd966711d4fa71efc891d37fbe9f030fe5ab4eec/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:0d1922d9280e08cde90b518a10cd66831f632960a8d08cb3418922d83fce6f12", size = 4960157, upload-time = "2025-09-17T00:09:20.923Z" },
- { url = "https://files.pythonhosted.org/packages/67/ae/63a84e6789e0d5a2502edf06b552bcb0fa9ff16147265d5c44a211942abe/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:af84e8e99f1a82cea149e253014ea9dc89f75b82c87bb6c7242203186f465129", size = 4577263, upload-time = "2025-09-17T00:09:23.356Z" },
- { url = "https://files.pythonhosted.org/packages/ef/8f/1b9fa8e92bd9cbcb3b7e1e593a5232f2c1e6f9bd72b919c1a6b37d315f92/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ef648d2c690703501714588b2ba640facd50fd16548133b11b2859e8655a69da", size = 4298703, upload-time = "2025-09-17T00:09:25.566Z" },
- { url = "https://files.pythonhosted.org/packages/c3/af/bb95db070e73fea3fae31d8a69ac1463d89d1c084220f549b00dd01094a8/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:e94eb5fa32a8a9f9bf991f424f002913e3dd7c699ef552db9b14ba6a76a6313b", size = 4926363, upload-time = "2025-09-17T00:09:27.451Z" },
- { url = "https://files.pythonhosted.org/packages/f5/3b/d8fb17ffeb3a83157a1cc0aa5c60691d062aceecba09c2e5e77ebfc1870c/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:534b96c0831855e29fc3b069b085fd185aa5353033631a585d5cd4dd5d40d657", size = 4576958, upload-time = "2025-09-17T00:09:29.924Z" },
- { url = "https://files.pythonhosted.org/packages/d9/46/86bc3a05c10c8aa88c8ae7e953a8b4e407c57823ed201dbcba55c4d655f4/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9b55038b5c6c47559aa33626d8ecd092f354e23de3c6975e4bb205df128a2a0", size = 4422507, upload-time = "2025-09-17T00:09:32.222Z" },
- { url = "https://files.pythonhosted.org/packages/a8/4e/387e5a21dfd2b4198e74968a541cfd6128f66f8ec94ed971776e15091ac3/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ec13b7105117dbc9afd023300fb9954d72ca855c274fe563e72428ece10191c0", size = 4683964, upload-time = "2025-09-17T00:09:34.118Z" },
- { url = "https://files.pythonhosted.org/packages/25/a3/f9f5907b166adb8f26762071474b38bbfcf89858a5282f032899075a38a1/cryptography-46.0.1-cp314-cp314t-win32.whl", hash = "sha256:504e464944f2c003a0785b81668fe23c06f3b037e9cb9f68a7c672246319f277", size = 3029705, upload-time = "2025-09-17T00:09:36.381Z" },
- { url = "https://files.pythonhosted.org/packages/12/66/4d3a4f1850db2e71c2b1628d14b70b5e4c1684a1bd462f7fffb93c041c38/cryptography-46.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c52fded6383f7e20eaf70a60aeddd796b3677c3ad2922c801be330db62778e05", size = 3502175, upload-time = "2025-09-17T00:09:38.261Z" },
- { url = "https://files.pythonhosted.org/packages/52/c7/9f10ad91435ef7d0d99a0b93c4360bea3df18050ff5b9038c489c31ac2f5/cryptography-46.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:9495d78f52c804b5ec8878b5b8c7873aa8e63db9cd9ee387ff2db3fffe4df784", size = 2912354, upload-time = "2025-09-17T00:09:40.078Z" },
- { url = "https://files.pythonhosted.org/packages/98/e5/fbd632385542a3311915976f88e0dfcf09e62a3fc0aff86fb6762162a24d/cryptography-46.0.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d84c40bdb8674c29fa192373498b6cb1e84f882889d21a471b45d1f868d8d44b", size = 7255677, upload-time = "2025-09-17T00:09:42.407Z" },
- { url = "https://files.pythonhosted.org/packages/56/3e/13ce6eab9ad6eba1b15a7bd476f005a4c1b3f299f4c2f32b22408b0edccf/cryptography-46.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ed64e5083fa806709e74fc5ea067dfef9090e5b7a2320a49be3c9df3583a2d8", size = 4301110, upload-time = "2025-09-17T00:09:45.614Z" },
- { url = "https://files.pythonhosted.org/packages/a2/67/65dc233c1ddd688073cf7b136b06ff4b84bf517ba5529607c9d79720fc67/cryptography-46.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:341fb7a26bc9d6093c1b124b9f13acc283d2d51da440b98b55ab3f79f2522ead", size = 4562369, upload-time = "2025-09-17T00:09:47.601Z" },
- { url = "https://files.pythonhosted.org/packages/17/db/d64ae4c6f4e98c3dac5bf35dd4d103f4c7c345703e43560113e5e8e31b2b/cryptography-46.0.1-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6ef1488967e729948d424d09c94753d0167ce59afba8d0f6c07a22b629c557b2", size = 4302126, upload-time = "2025-09-17T00:09:49.335Z" },
- { url = "https://files.pythonhosted.org/packages/3d/19/5f1eea17d4805ebdc2e685b7b02800c4f63f3dd46cfa8d4c18373fea46c8/cryptography-46.0.1-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7823bc7cdf0b747ecfb096d004cc41573c2f5c7e3a29861603a2871b43d3ef32", size = 4009431, upload-time = "2025-09-17T00:09:51.239Z" },
- { url = "https://files.pythonhosted.org/packages/81/b5/229ba6088fe7abccbfe4c5edb96c7a5ad547fac5fdd0d40aa6ea540b2985/cryptography-46.0.1-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:f736ab8036796f5a119ff8211deda416f8c15ce03776db704a7a4e17381cb2ef", size = 4980739, upload-time = "2025-09-17T00:09:54.181Z" },
- { url = "https://files.pythonhosted.org/packages/3a/9c/50aa38907b201e74bc43c572f9603fa82b58e831bd13c245613a23cff736/cryptography-46.0.1-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e46710a240a41d594953012213ea8ca398cd2448fbc5d0f1be8160b5511104a0", size = 4592289, upload-time = "2025-09-17T00:09:56.731Z" },
- { url = "https://files.pythonhosted.org/packages/5a/33/229858f8a5bb22f82468bb285e9f4c44a31978d5f5830bb4ea1cf8a4e454/cryptography-46.0.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:84ef1f145de5aee82ea2447224dc23f065ff4cc5791bb3b506615957a6ba8128", size = 4301815, upload-time = "2025-09-17T00:09:58.548Z" },
- { url = "https://files.pythonhosted.org/packages/52/cb/b76b2c87fbd6ed4a231884bea3ce073406ba8e2dae9defad910d33cbf408/cryptography-46.0.1-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9394c7d5a7565ac5f7d9ba38b2617448eba384d7b107b262d63890079fad77ca", size = 4943251, upload-time = "2025-09-17T00:10:00.475Z" },
- { url = "https://files.pythonhosted.org/packages/94/0f/f66125ecf88e4cb5b8017ff43f3a87ede2d064cb54a1c5893f9da9d65093/cryptography-46.0.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ed957044e368ed295257ae3d212b95456bd9756df490e1ac4538857f67531fcc", size = 4591247, upload-time = "2025-09-17T00:10:02.874Z" },
- { url = "https://files.pythonhosted.org/packages/f6/22/9f3134ae436b63b463cfdf0ff506a0570da6873adb4bf8c19b8a5b4bac64/cryptography-46.0.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f7de12fa0eee6234de9a9ce0ffcfa6ce97361db7a50b09b65c63ac58e5f22fc7", size = 4428534, upload-time = "2025-09-17T00:10:04.994Z" },
- { url = "https://files.pythonhosted.org/packages/89/39/e6042bcb2638650b0005c752c38ea830cbfbcbb1830e4d64d530000aa8dc/cryptography-46.0.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7fab1187b6c6b2f11a326f33b036f7168f5b996aedd0c059f9738915e4e8f53a", size = 4699541, upload-time = "2025-09-17T00:10:06.925Z" },
- { url = "https://files.pythonhosted.org/packages/68/46/753d457492d15458c7b5a653fc9a84a1c9c7a83af6ebdc94c3fc373ca6e8/cryptography-46.0.1-cp38-abi3-win32.whl", hash = "sha256:45f790934ac1018adeba46a0f7289b2b8fe76ba774a88c7f1922213a56c98bc1", size = 3043779, upload-time = "2025-09-17T00:10:08.951Z" },
- { url = "https://files.pythonhosted.org/packages/2f/50/b6f3b540c2f6ee712feeb5fa780bb11fad76634e71334718568e7695cb55/cryptography-46.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:7176a5ab56fac98d706921f6416a05e5aff7df0e4b91516f450f8627cda22af3", size = 3517226, upload-time = "2025-09-17T00:10:10.769Z" },
- { url = "https://files.pythonhosted.org/packages/ff/e8/77d17d00981cdd27cc493e81e1749a0b8bbfb843780dbd841e30d7f50743/cryptography-46.0.1-cp38-abi3-win_arm64.whl", hash = "sha256:efc9e51c3e595267ff84adf56e9b357db89ab2279d7e375ffcaf8f678606f3d9", size = 2923149, upload-time = "2025-09-17T00:10:13.236Z" },
-]
-
-[[package]]
-name = "daphne"
-version = "4.2.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asgiref" },
- { name = "autobahn" },
- { name = "twisted", extra = ["tls"] },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/cd/9d/322b605fdc03b963cf2d33943321c8f4405e8d82e698bf49d1eed1ca40c4/daphne-4.2.1.tar.gz", hash = "sha256:5f898e700a1fda7addf1541d7c328606415e96a7bd768405f0463c312fcb31b3", size = 45600, upload-time = "2025-07-02T12:57:04.935Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/01/34/6171ab34715ed210bcd6c2b38839cc792993cff4fe2493f50bc92b0086a0/daphne-4.2.1-py3-none-any.whl", hash = "sha256:881e96b387b95b35ad85acd855f229d7f5b79073d6649089c8a33f661885e055", size = 29015, upload-time = "2025-07-02T12:57:03.793Z" },
-]
-
-[[package]]
-name = "distlib"
-version = "0.4.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
-]
-
-[[package]]
-name = "dj-database-url"
-version = "3.0.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/75/05/2ec51009f4ce424877dbd8ad95868faec0c3494ed0ff1635f9ab53d9e0ee/dj_database_url-3.0.1.tar.gz", hash = "sha256:8994961efb888fc6bf8c41550870c91f6f7691ca751888ebaa71442b7f84eff8", size = 12556, upload-time = "2025-07-02T09:40:11.424Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/aa/5e/86a43c6fdaa41c12d58e4ff3ebbfd6b71a7cb0360a08614e3754ef2e9afb/dj_database_url-3.0.1-py3-none-any.whl", hash = "sha256:43950018e1eeea486bf11136384aec0fe55b29fe6fd8a44553231b85661d9383", size = 8808, upload-time = "2025-07-02T09:40:26.326Z" },
-]
-
-[[package]]
-name = "dj-rest-auth"
-version = "7.0.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "djangorestframework" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/b7/19/00150c8bedf7b6d4c44ecf7c2be9e58ae2203b42741ca734152d34f549f1/dj-rest-auth-7.0.1.tar.gz", hash = "sha256:3f8c744cbcf05355ff4bcbef0c8a63645da38e29a0fdef3c3332d4aced52fb90", size = 220541, upload-time = "2025-01-04T23:37:38.688Z" }
-
-[[package]]
-name = "django"
-version = "5.2.6"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asgiref" },
- { name = "sqlparse" },
- { name = "tzdata", marker = "sys_platform == 'win32'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/4c/8c/2a21594337250a171d45dda926caa96309d5136becd1f48017247f9cdea0/django-5.2.6.tar.gz", hash = "sha256:da5e00372763193d73cecbf71084a3848458cecf4cee36b9a1e8d318d114a87b", size = 10858861, upload-time = "2025-09-03T13:04:03.23Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/f5/af/6593f6d21404e842007b40fdeb81e73c20b6649b82d020bb0801b270174c/django-5.2.6-py3-none-any.whl", hash = "sha256:60549579b1174a304b77e24a93d8d9fafe6b6c03ac16311f3e25918ea5a20058", size = 8303111, upload-time = "2025-09-03T13:03:47.808Z" },
-]
-
-[[package]]
-name = "django-allauth"
-version = "65.11.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asgiref" },
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/b7/19/3671e67b5fcc744c0d9380b0bb6120b7226bc9944bd9affb029b2d510d53/django_allauth-65.11.2.tar.gz", hash = "sha256:7b7e771d3384d0e247d0d6aef31b0cb589f92305b7e975e70056a513525906e7", size = 1916225, upload-time = "2025-09-09T18:37:19.55Z" }
-
-[[package]]
-name = "django-celery-beat"
-version = "2.8.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "celery" },
- { name = "cron-descriptor" },
- { name = "django" },
- { name = "django-timezone-field" },
- { name = "python-crontab" },
- { name = "tzdata" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/aa/11/0c8b412869b4fda72828572068312b10aafe7ccef7b41af3633af31f9d4b/django_celery_beat-2.8.1.tar.gz", hash = "sha256:dfad0201c0ac50c91a34700ef8fa0a10ee098cc7f3375fe5debed79f2204f80a", size = 175802, upload-time = "2025-05-13T06:58:29.246Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/61/e5/3a0167044773dee989b498e9a851fc1663bea9ab879f1179f7b8a827ac10/django_celery_beat-2.8.1-py3-none-any.whl", hash = "sha256:da2b1c6939495c05a551717509d6e3b79444e114a027f7b77bf3727c2a39d171", size = 104833, upload-time = "2025-05-13T06:58:27.309Z" },
-]
-
-[[package]]
-name = "django-celery-results"
-version = "2.6.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "celery" },
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a6/b5/9966c28e31014c228305e09d48b19b35522a8f941fe5af5f81f40dc8fa80/django_celery_results-2.6.0.tar.gz", hash = "sha256:9abcd836ae6b61063779244d8887a88fe80bbfaba143df36d3cb07034671277c", size = 83985, upload-time = "2025-04-10T08:23:52.677Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2c/da/70f0f3c5364735344c4bc89e53413bcaae95b4fc1de4e98a7a3b9fb70c88/django_celery_results-2.6.0-py3-none-any.whl", hash = "sha256:b9ccdca2695b98c7cbbb8dea742311ba9a92773d71d7b4944a676e69a7df1c73", size = 38351, upload-time = "2025-04-10T08:23:49.965Z" },
-]
-
-[[package]]
-name = "django-cleanup"
-version = "9.0.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/4b/01/b15a8de8b9ec75ea157ec58f86411894ca1182305fabaee31193076e7f62/django_cleanup-9.0.0.tar.gz", hash = "sha256:bb9fb560aaf62959c81e31fa40885c36bbd5854d5aa21b90df2c7e4ba633531e", size = 17917, upload-time = "2024-09-18T21:58:06.089Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/87/d7/a83dc87c2383e125da29948f7bccf5b30126c087a5a831316482407a960f/django_cleanup-9.0.0-py3-none-any.whl", hash = "sha256:19f8b0e830233f9f0f683b17181f414672a0f48afe3ea3cc80ba47ae40ad880c", size = 10726, upload-time = "2024-09-18T21:58:04.626Z" },
-]
-
-[[package]]
-name = "django-cloudflareimages-toolkit"
-version = "1.0.7"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "djangorestframework" },
- { name = "pillow" },
- { name = "requests" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/5a/e0/f19f5f155c8166e0d2e4df18bdcd8cd18ecf64f6d68c4d9d8ace2158514f/django_cloudflareimages_toolkit-1.0.7.tar.gz", hash = "sha256:620d45cb62f9a4dc290e5afe4d3c7e582345d36111bc0770a06d6ce9fc2528d6", size = 136576, upload-time = "2025-08-30T21:26:39.248Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c5/55/25c9d3af623cc9a635c0083ca922471a24f99d5b4ad7d2f2e554df5bb279/django_cloudflareimages_toolkit-1.0.7-py3-none-any.whl", hash = "sha256:5f0ecf12bfa462c19e5fd8936947ad646130f228ddb8e137f3639feb80085372", size = 44062, upload-time = "2025-08-30T21:26:37.616Z" },
-]
-
-[[package]]
-name = "django-cors-headers"
-version = "4.9.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asgiref" },
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/21/39/55822b15b7ec87410f34cd16ce04065ff390e50f9e29f31d6d116fc80456/django_cors_headers-4.9.0.tar.gz", hash = "sha256:fe5d7cb59fdc2c8c646ce84b727ac2bca8912a247e6e68e1fb507372178e59e8", size = 21458, upload-time = "2025-09-18T10:40:52.326Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/30/d8/19ed1e47badf477d17fb177c1c19b5a21da0fd2d9f093f23be3fb86c5fab/django_cors_headers-4.9.0-py3-none-any.whl", hash = "sha256:15c7f20727f90044dcee2216a9fd7303741a864865f0c3657e28b7056f61b449", size = 12809, upload-time = "2025-09-18T10:40:50.843Z" },
-]
-
-[[package]]
-name = "django-cotton"
-version = "2.1.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/c3/99/36e318ebd1ace3fc874541a02e7e4149def8e21aab85aceb7bb01e17607b/django_cotton-2.1.3.tar.gz", hash = "sha256:737f9c088549d7febbf78532856ddf1270799675a4bc9fa191a5db0e195a9c13", size = 23432, upload-time = "2025-06-30T17:31:29.29Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ad/ec/5e5318af0304962be43e3b912aef024d8ac08c0f9a9dfcc4f0cd55d0e74e/django_cotton-2.1.3-py3-none-any.whl", hash = "sha256:f33658d05a8f5ecf7448bdf1089e2ad27d2ce42e59c752216129701d7d153c89", size = 22214, upload-time = "2025-06-30T17:31:28.093Z" },
-]
-
-[[package]]
-name = "django-debug-toolbar"
-version = "6.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "sqlparse" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/c5/d5/5fc90234532088aeec5faa48d5b09951cc7eab6626030ed427d3bd8cd9bc/django_debug_toolbar-6.0.0.tar.gz", hash = "sha256:6eb9fa6f4a5884bf04004700ffb5a44043f1fff38784447fc52c1633448c8c14", size = 305331, upload-time = "2025-07-25T13:11:48.68Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/05/b5/4724a8c18fcc5b09dca7b7a0e70c34208317bb110075ad12484d6588ae91/django_debug_toolbar-6.0.0-py3-none-any.whl", hash = "sha256:0cf2cac5c307b77d6e143c914e5c6592df53ffe34642d93929e5ef095ae56841", size = 266967, upload-time = "2025-07-25T13:11:47.265Z" },
-]
-
-[[package]]
-name = "django-environ"
-version = "0.12.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d6/04/65d2521842c42f4716225f20d8443a50804920606aec018188bbee30a6b0/django_environ-0.12.0.tar.gz", hash = "sha256:227dc891453dd5bde769c3449cf4a74b6f2ee8f7ab2361c93a07068f4179041a", size = 56804, upload-time = "2025-01-13T17:03:37.74Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/83/b3/0a3bec4ecbfee960f39b1842c2f91e4754251e0a6ed443db9fe3f666ba8f/django_environ-0.12.0-py2.py3-none-any.whl", hash = "sha256:92fb346a158abda07ffe6eb23135ce92843af06ecf8753f43adf9d2366dcc0ca", size = 19957, upload-time = "2025-01-13T17:03:32.918Z" },
-]
-
-[[package]]
-name = "django-extensions"
-version = "4.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/6d/b3/ed0f54ed706ec0b54fd251cc0364a249c6cd6c6ec97f04dc34be5e929eac/django_extensions-4.1.tar.gz", hash = "sha256:7b70a4d28e9b840f44694e3f7feb54f55d495f8b3fa6c5c0e5e12bcb2aa3cdeb", size = 283078, upload-time = "2025-04-11T01:15:39.617Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/64/96/d967ca440d6a8e3861120f51985d8e5aec79b9a8bdda16041206adfe7adc/django_extensions-4.1-py3-none-any.whl", hash = "sha256:0699a7af28f2523bf8db309a80278519362cd4b6e1fd0a8cd4bf063e1e023336", size = 232980, upload-time = "2025-04-11T01:15:37.701Z" },
-]
-
-[[package]]
-name = "django-filter"
-version = "25.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/b5/40/c702a6fe8cccac9bf426b55724ebdf57d10a132bae80a17691d0cf0b9bac/django_filter-25.1.tar.gz", hash = "sha256:1ec9eef48fa8da1c0ac9b411744b16c3f4c31176c867886e4c48da369c407153", size = 143021, upload-time = "2025-02-14T16:30:53.238Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/07/a6/70dcd68537c434ba7cb9277d403c5c829caf04f35baf5eb9458be251e382/django_filter-25.1-py3-none-any.whl", hash = "sha256:4fa48677cf5857b9b1347fed23e355ea792464e0fe07244d1fdfb8a806215b80", size = 94114, upload-time = "2025-02-14T16:30:50.435Z" },
-]
-
-[[package]]
-name = "django-forwardemail"
-version = "1.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "requests" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/f5/a1/07011849d802f85422ce36473e4f4255cffc0b12219cb72217f616b787cf/django_forwardemail-1.0.0.tar.gz", hash = "sha256:7cb453a78446f04ba079bcfe5937f34edf1170e33a4378febf31a2561174f3a0", size = 17535, upload-time = "2025-08-30T12:54:34.762Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/4c/a1/fe9d53398de7f80be8e1a85cb64eb9562056638494b4a79a524e9f3e031e/django_forwardemail-1.0.0-py3-none-any.whl", hash = "sha256:29debe5747122c2a29f52682347f72e8caba38bf874f279c36aa49d855e6afc6", size = 16438, upload-time = "2025-08-30T12:54:33.31Z" },
-]
-
-[[package]]
-name = "django-health-check"
-version = "3.20.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/1e/a5/5c33c7dc834df3351f9acf448e8fec97b096db32c94265885a1062841199/django_health_check-3.20.0.tar.gz", hash = "sha256:cd69ac5facf73fe7241d9492d939b57bd20e24f46c4edea91e6a900bf22c2d8e", size = 20641, upload-time = "2025-06-16T09:22:35.015Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e1/7f/49ba63f078015b0a52e09651b94ba16b41154ac7079c83153edd14e15ca0/django_health_check-3.20.0-py3-none-any.whl", hash = "sha256:bcb2b8f36f463cead0564a028345c5b17e2a2d18e9cc88ecd611b13a26521926", size = 31788, upload-time = "2025-06-16T09:22:32.069Z" },
-]
-
-[[package]]
-name = "django-htmx"
-version = "1.25.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asgiref" },
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/24/9c/47e6db512c0361a53e912ab946c07c7aff874260d7223dc75cf6b1d16b65/django_htmx-1.25.0.tar.gz", hash = "sha256:18ba6977a2636adcbb74ce63d75538be9958d4bdbe18f54dff57fdb6372a7c11", size = 65081, upload-time = "2025-09-18T11:10:24.941Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/0a/d1/5078af1f88cc1d304fdc667066b5c34e07832c48fea837e466069328d377/django_htmx-1.25.0-py3-none-any.whl", hash = "sha256:b7f8a744b7540dc2ac40b04e0d3eee49b148baba60c467f1e868815d79315289", size = 62022, upload-time = "2025-09-18T11:10:22.387Z" },
-]
-
-[[package]]
-name = "django-htmx-autocomplete"
-version = "1.0.12"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/57/49/cf424cc1a343aca94daf4e2ca510df9f9b19c56de000bb2722143caa1dbd/django_htmx_autocomplete-1.0.12.tar.gz", hash = "sha256:f70faaf7d162fd80376e9e07742fb175ca378e9f6fb1ab8bfb524b61453a86cb", size = 42470, upload-time = "2025-08-20T20:38:21.75Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/eb/1d/0fdb8429d12a2df117a552899e0faebb8dfc9ce901360de30dfbded4218a/django_htmx_autocomplete-1.0.12-py3-none-any.whl", hash = "sha256:2c256b566244863235e4a7b7106da803711df505d415636c97c3c1a848788fc1", size = 53354, upload-time = "2025-08-20T20:38:20.455Z" },
-]
-
-[[package]]
-name = "django-oauth-toolkit"
-version = "3.0.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "jwcrypto" },
- { name = "oauthlib" },
- { name = "requests" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/fa/d3/d7628a7a4899bf5aafc9c1ec121c507470b37a247f7628acae6e0f78e0d6/django_oauth_toolkit-3.0.1.tar.gz", hash = "sha256:7200e4a9fb229b145a6d808cbf0423b6d69a87f68557437733eec3c0cf71db02", size = 99816, upload-time = "2024-09-07T14:07:57.124Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7d/40/e556bc19ba65356fe5f0e48ca01c50e81f7c630042fa7411b6ab428ecf68/django_oauth_toolkit-3.0.1-py3-none-any.whl", hash = "sha256:3ef00b062a284f2031b0732b32dc899e3bbf0eac221bbb1cffcb50b8932e55ed", size = 77299, upload-time = "2024-09-07T14:08:43.225Z" },
-]
-
-[[package]]
-name = "django-pghistory"
-version = "3.8.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "django-pgtrigger" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/17/17/a04ddbbeebc5a6c3df14bbd7a3eb9cc135c6fca733bdbd88d37cf8dc2203/django_pghistory-3.8.2.tar.gz", hash = "sha256:28c2fa37a64c53509b6f2a3ec05e23e852bed06843af67dcac1a652aa9f6c86e", size = 32276, upload-time = "2025-09-13T02:39:48.829Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1d/f3/16027a7ebf6c96bff1a44bfaed55d370faf2f1506e34112e0ecdf018599a/django_pghistory-3.8.2-py3-none-any.whl", hash = "sha256:565bcaa486b4d7b33c98a6313293eda591d1fac1e757f166f110dd91b3c73fb3", size = 39623, upload-time = "2025-09-13T02:39:47.966Z" },
-]
-
-[[package]]
-name = "django-pgtrigger"
-version = "4.15.4"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/65/e1/47af2eb011017edf107be1d09f204ad4568021b2549380646d8da23238f6/django_pgtrigger-4.15.4.tar.gz", hash = "sha256:3dfef7dd8faca0af3602818075f28da1d540193af63a77bb848f56f532a968e4", size = 32791, upload-time = "2025-08-17T02:30:40.038Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/dd/9c/deb7c7089ecef9912eff15a2cb1ac32a5ae695969473a84eee1f1fa7171d/django_pgtrigger-4.15.4-py3-none-any.whl", hash = "sha256:6e1732c85bccbf22b183ca13b410d6908f3eaaeaf6103a3c62c236b0ae6a9072", size = 36148, upload-time = "2025-08-17T02:30:38.847Z" },
-]
-
-[[package]]
-name = "django-redis"
-version = "6.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "redis" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/08/53/dbcfa1e528e0d6c39947092625b2c89274b5d88f14d357cee53c4d6dbbd4/django_redis-6.0.0.tar.gz", hash = "sha256:2d9cb12a20424a4c4dde082c6122f486628bae2d9c2bee4c0126a4de7fda00dd", size = 56904, upload-time = "2025-06-17T18:15:46.376Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7e/79/055dfcc508cfe9f439d9f453741188d633efa9eab90fc78a67b0ab50b137/django_redis-6.0.0-py3-none-any.whl", hash = "sha256:20bf0063a8abee567eb5f77f375143c32810c8700c0674ced34737f8de4e36c0", size = 33687, upload-time = "2025-06-17T18:15:34.165Z" },
-]
-
-[[package]]
-name = "django-silk"
-version = "5.4.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "gprof2dot" },
- { name = "sqlparse" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/c5/13/ef9344e4ed6ab6ed0f15d7743e9509545e95f3336ac9bbef4b39aefbabeb/django_silk-5.4.3.tar.gz", hash = "sha256:bedb17c8fd9c029a7746cb947864f5c9ea943ae33d6a9581e60f67c45e4490ad", size = 4495552, upload-time = "2025-09-09T07:13:30.229Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ec/97/bc1f1d0f922144a3807ad15531b93ba474c7538d6f006e98bf8ab77a2f82/django_silk-5.4.3-py3-none-any.whl", hash = "sha256:f7920ae91a34716654296140b2cbf449e9798237a0c6eb7cf2cd79c2cfb39321", size = 1944434, upload-time = "2025-09-09T07:13:50.846Z" },
-]
-
-[[package]]
-name = "django-simple-history"
-version = "3.10.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/16/2b/8d43eed1f9de32e890e0f5780e6d623a5a7e645e0e77a515edd427029f3c/django_simple_history-3.10.1.tar.gz", hash = "sha256:040f0c2286bed730312aa15f0acee9e7e6f839c4bcd721693251aa7ec5b65d95", size = 233649, upload-time = "2025-06-20T20:22:32.722Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/01/c3/d4ba265feb7b8bad3cf0730a3a8d82bb40d14551f8c53c88895ec06fa51c/django_simple_history-3.10.1-py3-none-any.whl", hash = "sha256:e12c27abfcd7e801a9d274d94542549ce8c617b0b384ae69afb161b56cd02ba4", size = 78611, upload-time = "2025-06-20T20:22:30.878Z" },
-]
-
-[[package]]
-name = "django-stubs"
-version = "5.2.5"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "django-stubs-ext" },
- { name = "types-pyyaml" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/e1/8e/286150f593481c33f54d14efb58d72178f159d57d31043529d38bbc98e2f/django_stubs-5.2.5.tar.gz", hash = "sha256:fc78384e28d8c5292d60983075a5934f644f7c304c25ae2793fc57aa66d5018b", size = 247794, upload-time = "2025-09-12T19:29:49.636Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2f/02/cdbf7652ef2c9a7a1fed7c279484b7f3806f15b1bb34aec9fef8e8cfacbf/django_stubs-5.2.5-py3-none-any.whl", hash = "sha256:223c1a3324cd4873b7629dec6e9adbe224a94508284c1926b25fddff7a92252b", size = 490196, upload-time = "2025-09-12T19:29:47.954Z" },
-]
-
-[[package]]
-name = "django-stubs-ext"
-version = "5.2.5"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/16/94/c9b8f4c47084a0fa666da9066c36771098101932688adf2c17a40fab79c2/django_stubs_ext-5.2.5.tar.gz", hash = "sha256:ecc628df29d36cede638567c4e33ff485dd7a99f1552ad0cece8c60e9c3a8872", size = 6489, upload-time = "2025-09-12T19:29:06.008Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e0/fe/a85a105fddffadb4a8d50e500caeee87d836b679d51a19d52dfa0cc6c660/django_stubs_ext-5.2.5-py3-none-any.whl", hash = "sha256:9b4b8ac9d32f7e6c304fd05477f8688fae6ed57f6a0f9f4d074f9e55b5a3da14", size = 9310, upload-time = "2025-09-12T19:29:04.62Z" },
-]
-
-[[package]]
-name = "django-tailwind-cli"
-version = "4.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "django-typer" },
- { name = "requests" },
- { name = "semver" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/7d/14/319efb2f43b635382cee74e80da7ab383c69e98cf6ef35c00a754454931e/django_tailwind_cli-4.3.0.tar.gz", hash = "sha256:20da555409eccaeb3c38837b33186b6523f44cb88c80136de3bac3b593253331", size = 101182, upload-time = "2025-07-12T20:33:02.061Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/12/1a/1c15852b3002929ed08992aeaaea703c43a43345dc19a09fd457593f52a6/django_tailwind_cli-4.3.0-py3-none-any.whl", hash = "sha256:0ff7d7374a390e63cba77894a13de2bf8721320a5bad97361cb14e160cc824b5", size = 29704, upload-time = "2025-07-12T20:33:00.242Z" },
-]
-
-[[package]]
-name = "django-timezone-field"
-version = "7.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/ba/5b/0dbe271fef3c2274b83dbcb1b19fa3dacf1f7e542382819294644e78ea8b/django_timezone_field-7.1.tar.gz", hash = "sha256:b3ef409d88a2718b566fabe10ea996f2838bc72b22d3a2900c0aa905c761380c", size = 13727, upload-time = "2025-01-11T17:49:54.486Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ec/09/7a808392a751a24ffa62bec00e3085a9c1a151d728c323a5bab229ea0e58/django_timezone_field-7.1-py3-none-any.whl", hash = "sha256:93914713ed882f5bccda080eda388f7006349f25930b6122e9b07bf8db49c4b4", size = 13177, upload-time = "2025-01-11T17:49:52.142Z" },
-]
-
-[[package]]
-name = "django-typer"
-version = "3.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
- { name = "django" },
- { name = "shellingham" },
- { name = "typer-slim" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/b9/e4/e4a12f82f7cd0b0dfec64763c9647472d5cd086c66698d6f051a28fddbee/django_typer-3.3.0.tar.gz", hash = "sha256:7edd5669f2df3e3bc5613386f4f5f8f957567bd8da8907e81e22dc81fffcf7cd", size = 3074870, upload-time = "2025-09-03T04:58:29.328Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2c/33/3a5a0f50ec114ccbeba4bad1fa1eed951f77b196da78aa8be8a0a10ea98e/django_typer-3.3.0-py3-none-any.whl", hash = "sha256:56fa4a254f0ffe227e7815a1818126f72dcc2aa5cea520bc16c02d9f6f54b394", size = 295776, upload-time = "2025-09-03T04:58:27.49Z" },
-]
-
-[[package]]
-name = "django-webpack-loader"
-version = "3.2.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/64/e3/7c824814222d8411e5b2a72f4650e0181893bafa8324c33a5f77dd41db42/django_webpack_loader-3.2.1.tar.gz", hash = "sha256:d4bfaca9a640f087e7feeeb2ca6afd3d0a644bce3925b3d430448989c1673774", size = 17855, upload-time = "2025-06-16T12:33:24.353Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/79/dc/216df230d008495613b6fa3fe6f5f38c99c8516e81acda8cbe73a3c0f14c/django_webpack_loader-3.2.1-py2.py3-none-any.whl", hash = "sha256:b7e505bcdf7af8f75433f13d54010e0a95c61a8b80890a700a598602656e09bf", size = 20806, upload-time = "2025-06-16T12:33:22.672Z" },
-]
-
-[[package]]
-name = "django-widget-tweaks"
-version = "1.5.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a5/fe/26eb92fba83844e71bbec0ced7fc2e843e5990020e3cc676925204031654/django-widget-tweaks-1.5.0.tar.gz", hash = "sha256:1c2180681ebb994e922c754804c7ffebbe1245014777ac47897a81f57cc629c7", size = 14767, upload-time = "2023-08-25T15:29:12.778Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/46/6a/6cb6deb5c38b785c77c3ba66f53051eada49205979c407323eb666930915/django_widget_tweaks-1.5.0-py3-none-any.whl", hash = "sha256:a41b7b2f05bd44d673d11ebd6c09a96f1d013ee98121cb98c384fe84e33b881e", size = 8960, upload-time = "2023-08-25T15:29:05.644Z" },
-]
-
-[[package]]
-name = "djangorestframework"
-version = "3.16.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/8a/95/5376fe618646fde6899b3cdc85fd959716bb67542e273a76a80d9f326f27/djangorestframework-3.16.1.tar.gz", hash = "sha256:166809528b1aced0a17dc66c24492af18049f2c9420dbd0be29422029cfc3ff7", size = 1089735, upload-time = "2025-08-06T17:50:53.251Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b0/ce/bf8b9d3f415be4ac5588545b5fcdbbb841977db1c1d923f7568eeabe1689/djangorestframework-3.16.1-py3-none-any.whl", hash = "sha256:33a59f47fb9c85ede792cbf88bde71893bcda0667bc573f784649521f1102cec", size = 1080442, upload-time = "2025-08-06T17:50:50.667Z" },
-]
-
-[[package]]
-name = "djangorestframework-simplejwt"
-version = "5.5.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "djangorestframework" },
- { name = "pyjwt" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a8/27/2874a325c11112066139769f7794afae238a07ce6adf96259f08fd37a9d7/djangorestframework_simplejwt-5.5.1.tar.gz", hash = "sha256:e72c5572f51d7803021288e2057afcbd03f17fe11d484096f40a460abc76e87f", size = 101265, upload-time = "2025-07-21T16:52:25.026Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/60/94/fdfb7b2f0b16cd3ed4d4171c55c1c07a2d1e3b106c5978c8ad0c15b4a48b/djangorestframework_simplejwt-5.5.1-py3-none-any.whl", hash = "sha256:2c30f3707053d384e9f315d11c2daccfcb548d4faa453111ca19a542b732e469", size = 107674, upload-time = "2025-07-21T16:52:07.493Z" },
-]
-
-[[package]]
-name = "drf-spectacular"
-version = "0.28.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "django" },
- { name = "djangorestframework" },
- { name = "inflection" },
- { name = "jsonschema" },
- { name = "pyyaml" },
- { name = "uritemplate" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/da/b9/741056455aed00fa51a1df41fad5ad27c8e0d433b6bf490d4e60e2808bc6/drf_spectacular-0.28.0.tar.gz", hash = "sha256:2c778a47a40ab2f5078a7c42e82baba07397bb35b074ae4680721b2805943061", size = 237849, upload-time = "2024-11-30T08:49:02.355Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/fb/66/c2929871393b1515c3767a670ff7d980a6882964a31a4ca2680b30d7212a/drf_spectacular-0.28.0-py3-none-any.whl", hash = "sha256:856e7edf1056e49a4245e87a61e8da4baff46c83dbc25be1da2df77f354c7cb4", size = 103928, upload-time = "2024-11-30T08:48:57.288Z" },
-]
-
-[[package]]
-name = "dulwich"
-version = "0.24.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "urllib3" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/2b/f3/13a3425ddf04bd31f1caf3f4fa8de2352700c454cb0536ce3f4dbdc57a81/dulwich-0.24.1.tar.gz", hash = "sha256:e19fd864f10f02bb834bb86167d92dcca1c228451b04458761fc13dabd447758", size = 806136, upload-time = "2025-08-01T10:26:46.887Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5e/a5/3f4760169fea1b90df7aea88172699807af6f4f667c878de6a9ee554170f/dulwich-0.24.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a11ec69fc6604228804ddfc32c85b22bc627eca4cf4ff3f27dbe822e6f29477", size = 1080923, upload-time = "2025-08-01T10:26:28.011Z" },
- { url = "https://files.pythonhosted.org/packages/71/d9/7aadd6318aed6f0e1242fa63bd61d80142716d13ea4e307c8b19fc61c9ae/dulwich-0.24.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a9800df7238b586b4c38c00432776781bc889cf02d756dcfb8dc0ecb8fc47a33", size = 1159246, upload-time = "2025-08-01T10:26:29.487Z" },
- { url = "https://files.pythonhosted.org/packages/90/5d/df4256fe009c714e0392817df4fdc1748a901523504f58796d675fce755f/dulwich-0.24.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3baab4a01aff890e2e6551ccbd33eb2a44173c897f0f027ad3aeab0fb057ec44", size = 1163646, upload-time = "2025-08-01T10:26:31.279Z" },
- { url = "https://files.pythonhosted.org/packages/8d/fe/850115d6fa7ad03756e20466ad5b72be54d1b59c1ff7d2b3c13bc4de965f/dulwich-0.24.1-cp313-cp313-win32.whl", hash = "sha256:b39689aa4d143ba1fb0a687a4eb93d2e630d2c8f940aaa6c6911e9c8dca16e6a", size = 762612, upload-time = "2025-08-01T10:26:33.223Z" },
- { url = "https://files.pythonhosted.org/packages/47/7f/f79940e0773efda2ed0e666a0ca0ae7c734fdce4f04b5b60bc5ed268b7cb/dulwich-0.24.1-cp313-cp313-win_amd64.whl", hash = "sha256:8fca9b863b939b52c5f759d292499f0d21a7bf7f8cbb9fdeb8cdd9511c5bc973", size = 779168, upload-time = "2025-08-01T10:26:35.303Z" },
- { url = "https://files.pythonhosted.org/packages/c9/bc/a2557d1b0afa5bf1e140f42f8cbca1783e43d7fa17665859c63060957952/dulwich-0.24.1-py3-none-any.whl", hash = "sha256:57cc0dc5a21059698ffa4ed9a7272f1040ec48535193df84b0ee6b16bf615676", size = 440765, upload-time = "2025-08-01T10:26:45.415Z" },
-]
-
-[[package]]
-name = "factory-boy"
-version = "3.3.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "faker" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/ba/98/75cacae9945f67cfe323829fc2ac451f64517a8a330b572a06a323997065/factory_boy-3.3.3.tar.gz", hash = "sha256:866862d226128dfac7f2b4160287e899daf54f2612778327dd03d0e2cb1e3d03", size = 164146, upload-time = "2025-02-03T09:49:04.433Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/27/8d/2bc5f5546ff2ccb3f7de06742853483ab75bf74f36a92254702f8baecc79/factory_boy-3.3.3-py2.py3-none-any.whl", hash = "sha256:1c39e3289f7e667c4285433f305f8d506efc2fe9c73aaea4151ebd5cdea394fc", size = 37036, upload-time = "2025-02-03T09:49:01.659Z" },
-]
-
-[[package]]
-name = "faker"
-version = "37.8.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "tzdata" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/3a/da/1336008d39e5d4076dddb4e0f3a52ada41429274bf558a3cc28030d324a3/faker-37.8.0.tar.gz", hash = "sha256:090bb5abbec2b30949a95ce1ba6b20d1d0ed222883d63483a0d4be4a970d6fb8", size = 1912113, upload-time = "2025-09-15T20:24:13.592Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/f5/11/02ebebb09ff2104b690457cb7bc6ed700c9e0ce88cf581486bb0a5d3c88b/faker-37.8.0-py3-none-any.whl", hash = "sha256:b08233118824423b5fc239f7dd51f145e7018082b4164f8da6a9994e1f1ae793", size = 1953940, upload-time = "2025-09-15T20:24:11.482Z" },
-]
-
-[[package]]
-name = "fastjsonschema"
-version = "2.21.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" },
-]
-
-[[package]]
-name = "filelock"
-version = "3.19.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" },
-]
-
-[[package]]
-name = "findpython"
-version = "0.7.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "packaging" },
- { name = "platformdirs" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/1a/17/5a72566eecc9cbc1609459befe9f7dc65e101b66519a79999cc48044993c/findpython-0.7.0.tar.gz", hash = "sha256:8b31647c76352779a3c1a0806699b68e6a7bdc0b5c2ddd9af2a07a0d40c673dc", size = 18858, upload-time = "2025-07-02T09:22:24.977Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/70/e5/00c2aec929c3068eb6b18d4da4a13a12fd6de040a50c78bbc3c222aebdca/findpython-0.7.0-py3-none-any.whl", hash = "sha256:f53cfcc29536f5b83c962cf922bba8ff6d6a3c2a05fda6a45aa58a47d005d8fc", size = 21955, upload-time = "2025-07-02T09:22:23.753Z" },
-]
-
-[[package]]
-name = "flake8"
-version = "7.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "mccabe" },
- { name = "pycodestyle" },
- { name = "pyflakes" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", size = 48326, upload-time = "2025-06-20T19:31:35.838Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" },
-]
-
-[[package]]
-name = "gprof2dot"
-version = "2025.4.14"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/bb/fd/cad13fa1f7a463a607176432c4affa33ea162f02f58cc36de1d40d3e6b48/gprof2dot-2025.4.14.tar.gz", hash = "sha256:35743e2d2ca027bf48fa7cba37021aaf4a27beeae1ae8e05a50b55f1f921a6ce", size = 39536, upload-time = "2025-04-14T07:21:45.76Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/71/ed/89d760cb25279109b89eb52975a7b5479700d3114a2421ce735bfb2e7513/gprof2dot-2025.4.14-py3-none-any.whl", hash = "sha256:0742e4c0b4409a5e8777e739388a11e1ed3750be86895655312ea7c20bd0090e", size = 37555, upload-time = "2025-04-14T07:21:43.319Z" },
-]
-
-[[package]]
-name = "greenlet"
-version = "3.2.4"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" },
- { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" },
- { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" },
- { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" },
- { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" },
- { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" },
- { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" },
- { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" },
- { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" },
- { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" },
- { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" },
- { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" },
- { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" },
- { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" },
- { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" },
- { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" },
-]
-
-[[package]]
-name = "h11"
-version = "0.16.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
-]
-
-[[package]]
-name = "httpcore"
-version = "1.0.9"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "certifi" },
- { name = "h11" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
-]
-
-[[package]]
-name = "httpx"
-version = "0.28.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "anyio" },
- { name = "certifi" },
- { name = "httpcore" },
- { name = "idna" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
-]
-
-[[package]]
-name = "hyperlink"
-version = "21.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "idna" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/3a/51/1947bd81d75af87e3bb9e34593a4cf118115a8feb451ce7a69044ef1412e/hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b", size = 140743, upload-time = "2021-01-08T05:51:20.972Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638, upload-time = "2021-01-08T05:51:22.906Z" },
-]
-
-[[package]]
-name = "idna"
-version = "3.10"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
-]
-
-[[package]]
-name = "incremental"
-version = "24.7.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "setuptools" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/27/87/156b374ff6578062965afe30cc57627d35234369b3336cf244b240c8d8e6/incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9", size = 28157, upload-time = "2024-07-29T20:03:55.441Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/0d/38/221e5b2ae676a3938c2c1919131410c342b6efc2baffeda395dd66eeca8f/incremental-24.7.2-py3-none-any.whl", hash = "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe", size = 20516, upload-time = "2024-07-29T20:03:53.677Z" },
-]
-
-[[package]]
-name = "inflection"
-version = "0.5.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091, upload-time = "2020-08-22T08:16:29.139Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454, upload-time = "2020-08-22T08:16:27.816Z" },
-]
-
-[[package]]
-name = "iniconfig"
-version = "2.1.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
-]
-
-[[package]]
-name = "installer"
-version = "0.7.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/05/18/ceeb4e3ab3aa54495775775b38ae42b10a92f42ce42dfa44da684289b8c8/installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631", size = 474349, upload-time = "2023-03-17T20:39:38.871Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", size = 453838, upload-time = "2023-03-17T20:39:36.219Z" },
-]
-
-[[package]]
-name = "jaraco-classes"
-version = "3.4.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "more-itertools" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" },
-]
-
-[[package]]
-name = "jaraco-context"
-version = "6.0.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" },
-]
-
-[[package]]
-name = "jaraco-functools"
-version = "4.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "more-itertools" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/f7/ed/1aa2d585304ec07262e1a83a9889880701079dde796ac7b1d1826f40c63d/jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294", size = 19755, upload-time = "2025-08-18T20:05:09.91Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b4/09/726f168acad366b11e420df31bf1c702a54d373a83f968d94141a8c3fde0/jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8", size = 10408, upload-time = "2025-08-18T20:05:08.69Z" },
-]
-
-[[package]]
-name = "jeepney"
-version = "0.9.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" },
-]
-
-[[package]]
-name = "jsonschema"
-version = "4.25.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "attrs" },
- { name = "jsonschema-specifications" },
- { name = "referencing" },
- { name = "rpds-py" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" },
-]
-
-[[package]]
-name = "jsonschema-specifications"
-version = "2025.9.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "referencing" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" },
-]
-
-[[package]]
-name = "jwcrypto"
-version = "1.5.6"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "cryptography" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/e1/db/870e5d5fb311b0bcf049630b5ba3abca2d339fd5e13ba175b4c13b456d08/jwcrypto-1.5.6.tar.gz", hash = "sha256:771a87762a0c081ae6166958a954f80848820b2ab066937dc8b8379d65b1b039", size = 87168, upload-time = "2024-03-06T19:58:31.831Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/cd/58/4a1880ea64032185e9ae9f63940c9327c6952d5584ea544a8f66972f2fda/jwcrypto-1.5.6-py3-none-any.whl", hash = "sha256:150d2b0ebbdb8f40b77f543fb44ffd2baeff48788be71f67f03566692fd55789", size = 92520, upload-time = "2024-03-06T19:58:29.765Z" },
-]
-
-[[package]]
-name = "keyring"
-version = "25.6.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "jaraco-classes" },
- { name = "jaraco-context" },
- { name = "jaraco-functools" },
- { name = "jeepney", marker = "sys_platform == 'linux'" },
- { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" },
- { name = "secretstorage", marker = "sys_platform == 'linux'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/70/09/d904a6e96f76ff214be59e7aa6ef7190008f52a0ab6689760a98de0bf37d/keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", size = 62750, upload-time = "2024-12-25T15:26:45.782Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085, upload-time = "2024-12-25T15:26:44.377Z" },
-]
-
-[[package]]
-name = "kombu"
-version = "5.5.4"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "amqp" },
- { name = "packaging" },
- { name = "tzdata" },
- { name = "vine" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/0f/d3/5ff936d8319ac86b9c409f1501b07c426e6ad41966fedace9ef1b966e23f/kombu-5.5.4.tar.gz", hash = "sha256:886600168275ebeada93b888e831352fe578168342f0d1d5833d88ba0d847363", size = 461992, upload-time = "2025-06-01T10:19:22.281Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ef/70/a07dcf4f62598c8ad579df241af55ced65bed76e42e45d3c368a6d82dbc1/kombu-5.5.4-py3-none-any.whl", hash = "sha256:a12ed0557c238897d8e518f1d1fdf84bd1516c5e305af2dacd85c2015115feb8", size = 210034, upload-time = "2025-06-01T10:19:20.436Z" },
-]
-
-[[package]]
-name = "markupsafe"
-version = "3.0.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" },
- { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" },
- { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" },
- { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" },
- { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" },
- { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" },
- { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" },
- { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" },
- { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" },
- { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" },
- { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" },
- { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" },
- { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" },
- { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" },
- { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" },
- { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" },
- { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" },
- { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" },
- { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" },
- { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" },
-]
-
-[[package]]
-name = "mccabe"
-version = "0.7.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" },
-]
-
-[[package]]
-name = "more-itertools"
-version = "10.8.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" },
-]
-
-[[package]]
-name = "msgpack"
-version = "1.1.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/45/b1/ea4f68038a18c77c9467400d166d74c4ffa536f34761f7983a104357e614/msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd", size = 173555, upload-time = "2025-06-13T06:52:51.324Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a1/38/561f01cf3577430b59b340b51329803d3a5bf6a45864a55f4ef308ac11e3/msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0", size = 81677, upload-time = "2025-06-13T06:52:16.64Z" },
- { url = "https://files.pythonhosted.org/packages/09/48/54a89579ea36b6ae0ee001cba8c61f776451fad3c9306cd80f5b5c55be87/msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9", size = 78603, upload-time = "2025-06-13T06:52:17.843Z" },
- { url = "https://files.pythonhosted.org/packages/a0/60/daba2699b308e95ae792cdc2ef092a38eb5ee422f9d2fbd4101526d8a210/msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8", size = 420504, upload-time = "2025-06-13T06:52:18.982Z" },
- { url = "https://files.pythonhosted.org/packages/20/22/2ebae7ae43cd8f2debc35c631172ddf14e2a87ffcc04cf43ff9df9fff0d3/msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a", size = 423749, upload-time = "2025-06-13T06:52:20.211Z" },
- { url = "https://files.pythonhosted.org/packages/40/1b/54c08dd5452427e1179a40b4b607e37e2664bca1c790c60c442c8e972e47/msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac", size = 404458, upload-time = "2025-06-13T06:52:21.429Z" },
- { url = "https://files.pythonhosted.org/packages/2e/60/6bb17e9ffb080616a51f09928fdd5cac1353c9becc6c4a8abd4e57269a16/msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b", size = 405976, upload-time = "2025-06-13T06:52:22.995Z" },
- { url = "https://files.pythonhosted.org/packages/ee/97/88983e266572e8707c1f4b99c8fd04f9eb97b43f2db40e3172d87d8642db/msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7", size = 408607, upload-time = "2025-06-13T06:52:24.152Z" },
- { url = "https://files.pythonhosted.org/packages/bc/66/36c78af2efaffcc15a5a61ae0df53a1d025f2680122e2a9eb8442fed3ae4/msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5", size = 424172, upload-time = "2025-06-13T06:52:25.704Z" },
- { url = "https://files.pythonhosted.org/packages/8c/87/a75eb622b555708fe0427fab96056d39d4c9892b0c784b3a721088c7ee37/msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323", size = 65347, upload-time = "2025-06-13T06:52:26.846Z" },
- { url = "https://files.pythonhosted.org/packages/ca/91/7dc28d5e2a11a5ad804cf2b7f7a5fcb1eb5a4966d66a5d2b41aee6376543/msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69", size = 72341, upload-time = "2025-06-13T06:52:27.835Z" },
-]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.1.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
-]
-
-[[package]]
-name = "nodeenv"
-version = "1.9.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" },
-]
-
-[[package]]
-name = "nplusone"
-version = "1.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "blinker" },
- { name = "six" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/26/da/663f551cdda166eaf75a564f64d022c6eb03c710ba83c3fb0f4ac664ebde/nplusone-1.0.0.tar.gz", hash = "sha256:1726c0a10c0aa7eabb04e24db2882ff97b6b7ee29d729a8d97dcbd12ef5a5651", size = 13501, upload-time = "2018-05-21T03:40:25.01Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/13/6b/9721ba7c68036316bd8aeb596b397253590c87d7045c9d6fc82b7364eff4/nplusone-1.0.0-py2.py3-none-any.whl", hash = "sha256:96b1e6e29e6af3e71b67d0cc012a5ec8c97c6a2f5399f4ba41a2bbe0e253a9ac", size = 15920, upload-time = "2018-05-21T03:40:23.69Z" },
-]
-
-[[package]]
-name = "oauthlib"
-version = "3.3.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" },
-]
-
-[[package]]
-name = "packaging"
-version = "25.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
-]
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
-]
-
-[[package]]
-name = "pbs-installer"
-version = "2025.9.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/5e/c6/c2ee535a5ad13171fcad702afbce38f421b4432e6d547944d1f526a88ad7/pbs_installer-2025.9.2.tar.gz", hash = "sha256:0da1d59bb5c4d8cfb5aee29ac2a37b37d651a45ab5ede19d1331df9a92464b5d", size = 59187, upload-time = "2025-09-02T22:02:37.903Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/65/2a/1222033f49493bba3f515ab927417ac6ffe237a8144739492009185375c6/pbs_installer-2025.9.2-py3-none-any.whl", hash = "sha256:659a5399278c810761c1e7bc54095f38af11a5b593ce8d45c41a3a9d6759d8f1", size = 60885, upload-time = "2025-09-02T22:02:36.368Z" },
-]
-
-[package.optional-dependencies]
-download = [
- { name = "httpx" },
-]
-install = [
- { name = "zstandard" },
-]
-
-[[package]]
-name = "piexif"
-version = "1.1.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/fa/84/a3f25cec7d0922bf60be8000c9739d28d24b6896717f44cc4cfb843b1487/piexif-1.1.3.zip", hash = "sha256:83cb35c606bf3a1ea1a8f0a25cb42cf17e24353fd82e87ae3884e74a302a5f1b", size = 1011134, upload-time = "2019-07-01T15:29:23.045Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2c/d8/6f63147dd73373d051c5eb049ecd841207f898f50a5a1d4378594178f6cf/piexif-1.1.3-py2.py3-none-any.whl", hash = "sha256:3bc435d171720150b81b15d27e05e54b8abbde7b4242cddd81ef160d283108b6", size = 20691, upload-time = "2019-07-01T15:43:20.907Z" },
-]
-
-[[package]]
-name = "pillow"
-version = "11.3.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" },
- { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" },
- { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" },
- { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" },
- { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" },
- { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" },
- { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" },
- { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" },
- { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" },
- { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" },
- { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" },
- { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" },
- { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" },
- { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" },
- { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" },
- { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" },
- { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" },
- { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" },
- { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" },
- { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" },
- { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" },
- { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" },
- { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" },
- { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" },
- { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" },
- { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" },
- { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" },
- { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" },
- { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" },
- { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" },
- { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" },
- { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" },
- { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" },
- { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" },
- { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" },
- { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" },
- { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" },
- { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" },
- { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" },
- { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" },
- { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" },
- { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" },
- { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" },
- { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" },
- { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" },
- { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" },
- { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" },
-]
-
-[[package]]
-name = "pkginfo"
-version = "1.12.1.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/24/03/e26bf3d6453b7fda5bd2b84029a426553bb373d6277ef6b5ac8863421f87/pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b", size = 451828, upload-time = "2025-02-19T15:27:37.188Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/fa/3d/f4f2ba829efb54b6cd2d91349c7463316a9cc55a43fc980447416c88540f/pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343", size = 32717, upload-time = "2025-02-19T15:27:33.071Z" },
-]
-
-[[package]]
-name = "platformdirs"
-version = "4.4.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" },
-]
-
-[[package]]
-name = "playwright"
-version = "1.55.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "greenlet" },
- { name = "pyee" },
-]
-wheels = [
- { url = "https://files.pythonhosted.org/packages/80/3a/c81ff76df266c62e24f19718df9c168f49af93cabdbc4608ae29656a9986/playwright-1.55.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:d7da108a95001e412effca4f7610de79da1637ccdf670b1ae3fdc08b9694c034", size = 40428109, upload-time = "2025-08-28T15:46:20.357Z" },
- { url = "https://files.pythonhosted.org/packages/cf/f5/bdb61553b20e907196a38d864602a9b4a461660c3a111c67a35179b636fa/playwright-1.55.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8290cf27a5d542e2682ac274da423941f879d07b001f6575a5a3a257b1d4ba1c", size = 38687254, upload-time = "2025-08-28T15:46:23.925Z" },
- { url = "https://files.pythonhosted.org/packages/4a/64/48b2837ef396487807e5ab53c76465747e34c7143fac4a084ef349c293a8/playwright-1.55.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:25b0d6b3fd991c315cca33c802cf617d52980108ab8431e3e1d37b5de755c10e", size = 40428108, upload-time = "2025-08-28T15:46:27.119Z" },
- { url = "https://files.pythonhosted.org/packages/08/33/858312628aa16a6de97839adc2ca28031ebc5391f96b6fb8fdf1fcb15d6c/playwright-1.55.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c6d4d8f6f8c66c483b0835569c7f0caa03230820af8e500c181c93509c92d831", size = 45905643, upload-time = "2025-08-28T15:46:30.312Z" },
- { url = "https://files.pythonhosted.org/packages/83/83/b8d06a5b5721931aa6d5916b83168e28bd891f38ff56fe92af7bdee9860f/playwright-1.55.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29a0777c4ce1273acf90c87e4ae2fe0130182100d99bcd2ae5bf486093044838", size = 45296647, upload-time = "2025-08-28T15:46:33.221Z" },
- { url = "https://files.pythonhosted.org/packages/06/2e/9db64518aebcb3d6ef6cd6d4d01da741aff912c3f0314dadb61226c6a96a/playwright-1.55.0-py3-none-win32.whl", hash = "sha256:29e6d1558ad9d5b5c19cbec0a72f6a2e35e6353cd9f262e22148685b86759f90", size = 35476046, upload-time = "2025-08-28T15:46:36.184Z" },
- { url = "https://files.pythonhosted.org/packages/46/4f/9ba607fa94bb9cee3d4beb1c7b32c16efbfc9d69d5037fa85d10cafc618b/playwright-1.55.0-py3-none-win_amd64.whl", hash = "sha256:7eb5956473ca1951abb51537e6a0da55257bb2e25fc37c2b75af094a5c93736c", size = 35476048, upload-time = "2025-08-28T15:46:38.867Z" },
- { url = "https://files.pythonhosted.org/packages/21/98/5ca173c8ec906abde26c28e1ecb34887343fd71cc4136261b90036841323/playwright-1.55.0-py3-none-win_arm64.whl", hash = "sha256:012dc89ccdcbd774cdde8aeee14c08e0dd52ddb9135bf10e9db040527386bd76", size = 31225543, upload-time = "2025-08-28T15:46:41.613Z" },
-]
-
-[[package]]
-name = "pluggy"
-version = "1.6.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
-]
-
-[[package]]
-name = "poetry"
-version = "2.2.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "build" },
- { name = "cachecontrol", extra = ["filecache"] },
- { name = "cleo" },
- { name = "dulwich" },
- { name = "fastjsonschema" },
- { name = "findpython" },
- { name = "installer" },
- { name = "keyring" },
- { name = "packaging" },
- { name = "pbs-installer", extra = ["download", "install"] },
- { name = "pkginfo" },
- { name = "platformdirs" },
- { name = "poetry-core" },
- { name = "pyproject-hooks" },
- { name = "requests" },
- { name = "requests-toolbelt" },
- { name = "shellingham" },
- { name = "tomlkit" },
- { name = "trove-classifiers" },
- { name = "virtualenv" },
- { name = "xattr", marker = "sys_platform == 'darwin'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/57/a6/28b83bb81911dc5b2a6a2be4006cceb29b0915b2f62d2e44192e315c2456/poetry-2.2.0.tar.gz", hash = "sha256:c6bc7e9d2d5aad4f6818cc5eef1f85fcfb7ee49a1aab3b4ff66d0c6874e74769", size = 3441561, upload-time = "2025-09-14T11:45:31.018Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d7/79/8e1ab13d3c31565a035853b93c75f7f84c38df4fb4ff74fabba2200bc483/poetry-2.2.0-py3-none-any.whl", hash = "sha256:1eb2dde482c0fee65c3b5be85a2cd0ad7c8be05c42041d8555ab89436c433c5f", size = 281550, upload-time = "2025-09-14T11:45:29.267Z" },
-]
-
-[[package]]
-name = "poetry-core"
-version = "2.2.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6c/73/8cc4cdc3992d9e03a749dd0ef7438093042a1ed197df8fcfc9dc9502ef0b/poetry_core-2.2.0.tar.gz", hash = "sha256:b4033b71b99717a942030e074fec7e3082e5fde7a8ed10f02cd2413bdf940b1f", size = 378727, upload-time = "2025-09-14T09:39:27.439Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/72/48/6e61a09d02dcd25a4bb1727269c60ad9daa00fef92c643e1ed8cb59a2c84/poetry_core-2.2.0-py3-none-any.whl", hash = "sha256:0edea81d07e88cbd407369eef753c722da8ff1338f554788dc04636e756318fc", size = 338592, upload-time = "2025-09-14T09:39:25.871Z" },
-]
-
-[[package]]
-name = "prompt-toolkit"
-version = "3.0.52"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "wcwidth" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" },
-]
-
-[[package]]
-name = "psutil"
-version = "7.1.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b3/31/4723d756b59344b643542936e37a31d1d3204bcdc42a7daa8ee9eb06fb50/psutil-7.1.0.tar.gz", hash = "sha256:655708b3c069387c8b77b072fc429a57d0e214221d01c0a772df7dfedcb3bcd2", size = 497660, upload-time = "2025-09-17T20:14:52.902Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/46/62/ce4051019ee20ce0ed74432dd73a5bb087a6704284a470bb8adff69a0932/psutil-7.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76168cef4397494250e9f4e73eb3752b146de1dd950040b29186d0cce1d5ca13", size = 245242, upload-time = "2025-09-17T20:14:56.126Z" },
- { url = "https://files.pythonhosted.org/packages/38/61/f76959fba841bf5b61123fbf4b650886dc4094c6858008b5bf73d9057216/psutil-7.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:5d007560c8c372efdff9e4579c2846d71de737e4605f611437255e81efcca2c5", size = 246682, upload-time = "2025-09-17T20:14:58.25Z" },
- { url = "https://files.pythonhosted.org/packages/88/7a/37c99d2e77ec30d63398ffa6a660450b8a62517cabe44b3e9bae97696e8d/psutil-7.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e4454970b32472ce7deaa45d045b34d3648ce478e26a04c7e858a0a6e75ff3", size = 287994, upload-time = "2025-09-17T20:14:59.901Z" },
- { url = "https://files.pythonhosted.org/packages/9d/de/04c8c61232f7244aa0a4b9a9fbd63a89d5aeaf94b2fc9d1d16e2faa5cbb0/psutil-7.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70e113920d51e89f212dd7be06219a9b88014e63a4cec69b684c327bc474e3", size = 291163, upload-time = "2025-09-17T20:15:01.481Z" },
- { url = "https://files.pythonhosted.org/packages/f4/58/c4f976234bf6d4737bc8c02a81192f045c307b72cf39c9e5c5a2d78927f6/psutil-7.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d4a113425c037300de3ac8b331637293da9be9713855c4fc9d2d97436d7259d", size = 293625, upload-time = "2025-09-17T20:15:04.492Z" },
- { url = "https://files.pythonhosted.org/packages/79/87/157c8e7959ec39ced1b11cc93c730c4fb7f9d408569a6c59dbd92ceb35db/psutil-7.1.0-cp37-abi3-win32.whl", hash = "sha256:09ad740870c8d219ed8daae0ad3b726d3bf9a028a198e7f3080f6a1888b99bca", size = 244812, upload-time = "2025-09-17T20:15:07.462Z" },
- { url = "https://files.pythonhosted.org/packages/bf/e9/b44c4f697276a7a95b8e94d0e320a7bf7f3318521b23de69035540b39838/psutil-7.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:57f5e987c36d3146c0dd2528cd42151cf96cd359b9d67cfff836995cc5df9a3d", size = 247965, upload-time = "2025-09-17T20:15:09.673Z" },
- { url = "https://files.pythonhosted.org/packages/26/65/1070a6e3c036f39142c2820c4b52e9243246fcfc3f96239ac84472ba361e/psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07", size = 244971, upload-time = "2025-09-17T20:15:12.262Z" },
-]
-
-[[package]]
-name = "psycopg2-binary"
-version = "2.9.10"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload-time = "2024-10-16T11:24:58.126Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload-time = "2024-10-16T11:21:42.841Z" },
- { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload-time = "2024-10-16T11:21:51.989Z" },
- { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload-time = "2024-10-16T11:21:57.584Z" },
- { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload-time = "2024-10-16T11:22:02.005Z" },
- { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload-time = "2024-10-16T11:22:06.412Z" },
- { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload-time = "2024-10-16T11:22:11.583Z" },
- { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload-time = "2024-10-16T11:22:16.406Z" },
- { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload-time = "2024-10-16T11:22:21.366Z" },
- { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload-time = "2024-10-16T11:22:25.684Z" },
- { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload-time = "2024-10-16T11:22:30.562Z" },
- { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload-time = "2025-01-04T20:09:19.234Z" },
-]
-
-[[package]]
-name = "pyasn1"
-version = "0.6.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" },
-]
-
-[[package]]
-name = "pyasn1-modules"
-version = "0.4.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pyasn1" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" },
-]
-
-[[package]]
-name = "pycodestyle"
-version = "2.14.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" },
-]
-
-[[package]]
-name = "pycountry"
-version = "24.6.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/76/57/c389fa68c50590881a75b7883eeb3dc15e9e73a0fdc001cdd45c13290c92/pycountry-24.6.1.tar.gz", hash = "sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221", size = 6043910, upload-time = "2024-06-01T04:12:15.05Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b1/ec/1fb891d8a2660716aadb2143235481d15ed1cbfe3ad669194690b0604492/pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f", size = 6335189, upload-time = "2024-06-01T04:11:49.711Z" },
-]
-
-[[package]]
-name = "pycparser"
-version = "2.23"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" },
-]
-
-[[package]]
-name = "pyee"
-version = "13.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/95/03/1fd98d5841cd7964a27d729ccf2199602fe05eb7a405c1462eb7277945ed/pyee-13.0.0.tar.gz", hash = "sha256:b391e3c5a434d1f5118a25615001dbc8f669cf410ab67d04c4d4e07c55481c37", size = 31250, upload-time = "2025-03-17T18:53:15.955Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/9b/4d/b9add7c84060d4c1906abe9a7e5359f2a60f7a9a4f67268b2766673427d8/pyee-13.0.0-py3-none-any.whl", hash = "sha256:48195a3cddb3b1515ce0695ed76036b5ccc2ef3a9f963ff9f77aec0139845498", size = 15730, upload-time = "2025-03-17T18:53:14.532Z" },
-]
-
-[[package]]
-name = "pyflakes"
-version = "3.4.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", size = 64669, upload-time = "2025-06-20T18:45:27.834Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" },
-]
-
-[[package]]
-name = "pygments"
-version = "2.19.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
-]
-
-[[package]]
-name = "pyjwt"
-version = "2.10.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" },
-]
-
-[[package]]
-name = "pyopenssl"
-version = "25.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "cryptography" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/80/be/97b83a464498a79103036bc74d1038df4a7ef0e402cfaf4d5e113fb14759/pyopenssl-25.3.0.tar.gz", hash = "sha256:c981cb0a3fd84e8602d7afc209522773b94c1c2446a3c710a75b06fe1beae329", size = 184073, upload-time = "2025-09-17T00:32:21.037Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/81/ef2b1dfd1862567d573a4fdbc9f969067621764fbb74338496840a1d2977/pyopenssl-25.3.0-py3-none-any.whl", hash = "sha256:1fda6fc034d5e3d179d39e59c1895c9faeaf40a79de5fc4cbbfbe0d36f4a77b6", size = 57268, upload-time = "2025-09-17T00:32:19.474Z" },
-]
-
-[[package]]
-name = "pyproject-hooks"
-version = "1.2.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" },
-]
-
-[[package]]
-name = "pyright"
-version = "1.1.405"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "nodeenv" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/fb/6c/ba4bbee22e76af700ea593a1d8701e3225080956753bee9750dcc25e2649/pyright-1.1.405.tar.gz", hash = "sha256:5c2a30e1037af27eb463a1cc0b9f6d65fec48478ccf092c1ac28385a15c55763", size = 4068319, upload-time = "2025-09-04T03:37:06.776Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d5/1a/524f832e1ff1962a22a1accc775ca7b143ba2e9f5924bb6749dce566784a/pyright-1.1.405-py3-none-any.whl", hash = "sha256:a2cb13700b5508ce8e5d4546034cb7ea4aedb60215c6c33f56cec7f53996035a", size = 5905038, upload-time = "2025-09-04T03:37:04.913Z" },
-]
-
-[[package]]
-name = "pytest"
-version = "8.4.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "colorama", marker = "sys_platform == 'win32'" },
- { name = "iniconfig" },
- { name = "packaging" },
- { name = "pluggy" },
- { name = "pygments" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
-]
-
-[[package]]
-name = "pytest-base-url"
-version = "2.1.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pytest" },
- { name = "requests" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/ae/1a/b64ac368de6b993135cb70ca4e5d958a5c268094a3a2a4cac6f0021b6c4f/pytest_base_url-2.1.0.tar.gz", hash = "sha256:02748589a54f9e63fcbe62301d6b0496da0d10231b753e950c63e03aee745d45", size = 6702, upload-time = "2024-01-31T22:43:00.81Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl", hash = "sha256:3ad15611778764d451927b2a53240c1a7a591b521ea44cebfe45849d2d2812e6", size = 5302, upload-time = "2024-01-31T22:42:58.897Z" },
-]
-
-[[package]]
-name = "pytest-django"
-version = "4.11.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pytest" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/b1/fb/55d580352db26eb3d59ad50c64321ddfe228d3d8ac107db05387a2fadf3a/pytest_django-4.11.1.tar.gz", hash = "sha256:a949141a1ee103cb0e7a20f1451d355f83f5e4a5d07bdd4dcfdd1fd0ff227991", size = 86202, upload-time = "2025-04-03T18:56:09.338Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/be/ac/bd0608d229ec808e51a21044f3f2f27b9a37e7a0ebaca7247882e67876af/pytest_django-4.11.1-py3-none-any.whl", hash = "sha256:1b63773f648aa3d8541000c26929c1ea63934be1cfa674c76436966d73fe6a10", size = 25281, upload-time = "2025-04-03T18:56:07.678Z" },
-]
-
-[[package]]
-name = "pytest-playwright"
-version = "0.7.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "playwright" },
- { name = "pytest" },
- { name = "pytest-base-url" },
- { name = "python-slugify" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a0/1e/9771990bad2b59d37728c4b6f28c234b3badbb2494bd72d54a6e2a988e23/pytest_playwright-0.7.1.tar.gz", hash = "sha256:94b551b2677ecdc16284fcd6a4f0045eafda47a60e74410f3fe4d8260e12cabf", size = 16769, upload-time = "2025-09-08T08:10:53.765Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/dd/59/373da90ce6a1a46ca6a449bf16cea11a3c6e269814eb60e7668526350b95/pytest_playwright-0.7.1-py3-none-any.whl", hash = "sha256:fcc46510fb75f8eba6df3bc8e84e4e902483d92be98075f20b9d160651a36d90", size = 16754, upload-time = "2025-09-08T08:10:55.92Z" },
-]
-
-[[package]]
-name = "python-crontab"
-version = "3.3.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/99/7f/c54fb7e70b59844526aa4ae321e927a167678660ab51dda979955eafb89a/python_crontab-3.3.0.tar.gz", hash = "sha256:007c8aee68dddf3e04ec4dce0fac124b93bd68be7470fc95d2a9617a15de291b", size = 57626, upload-time = "2025-07-13T20:05:35.535Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/47/42/bb4afa5b088f64092036221843fc989b7db9d9d302494c1f8b024ee78a46/python_crontab-3.3.0-py3-none-any.whl", hash = "sha256:739a778b1a771379b75654e53fd4df58e5c63a9279a63b5dfe44c0fcc3ee7884", size = 27533, upload-time = "2025-07-13T20:05:34.266Z" },
-]
-
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "six" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
-]
-
-[[package]]
-name = "python-decouple"
-version = "3.8"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e1/97/373dcd5844ec0ea5893e13c39a2c67e7537987ad8de3842fe078db4582fa/python-decouple-3.8.tar.gz", hash = "sha256:ba6e2657d4f376ecc46f77a3a615e058d93ba5e465c01bbe57289bfb7cce680f", size = 9612, upload-time = "2023-03-01T19:38:38.143Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a2/d4/9193206c4563ec771faf2ccf54815ca7918529fe81f6adb22ee6d0e06622/python_decouple-3.8-py3-none-any.whl", hash = "sha256:d0d45340815b25f4de59c974b855bb38d03151d81b037d9e3f463b0c9f8cbd66", size = 9947, upload-time = "2023-03-01T19:38:36.015Z" },
-]
-
-[[package]]
-name = "python-dotenv"
-version = "1.1.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" },
-]
-
-[[package]]
-name = "python-json-logger"
-version = "3.0.0"
-source = { url = "https://github.com/nhairs/python-json-logger/releases/download/v3.0.0/python_json_logger-3.0.0-py3-none-any.whl" }
-wheels = [
- { url = "https://github.com/nhairs/python-json-logger/releases/download/v3.0.0/python_json_logger-3.0.0-py3-none-any.whl", hash = "sha256:45c59c69d4a4e398b37e77c6b6f0f1663c829516a5063ff4c2bc0ba314b1f6f7" },
-]
-
-[package.metadata]
-requires-dist = [
- { name = "black", marker = "extra == 'lint'" },
- { name = "mypy", marker = "extra == 'lint'" },
- { name = "pylint", marker = "extra == 'lint'" },
- { name = "pytest", marker = "extra == 'test'" },
- { name = "validate-pyproject", extras = ["all"], marker = "extra == 'lint'" },
-]
-provides-extras = ["lint", "test"]
-
-[[package]]
-name = "python-slugify"
-version = "8.0.4"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "text-unidecode" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" },
-]
-
-[[package]]
-name = "pytokens"
-version = "0.1.10"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/30/5f/e959a442435e24f6fb5a01aec6c657079ceaca1b3baf18561c3728d681da/pytokens-0.1.10.tar.gz", hash = "sha256:c9a4bfa0be1d26aebce03e6884ba454e842f186a59ea43a6d3b25af58223c044", size = 12171, upload-time = "2025-02-19T14:51:22.001Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/60/e5/63bed382f6a7a5ba70e7e132b8b7b8abbcf4888ffa6be4877698dcfbed7d/pytokens-0.1.10-py3-none-any.whl", hash = "sha256:db7b72284e480e69fb085d9f251f66b3d2df8b7166059261258ff35f50fb711b", size = 12046, upload-time = "2025-02-19T14:51:18.694Z" },
-]
-
-[[package]]
-name = "pytoolconfig"
-version = "1.3.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "packaging" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/18/dc/abf70d2c2bcac20e8c71a7cdf6d44e4ddba4edf65acb179248d554d743db/pytoolconfig-1.3.1.tar.gz", hash = "sha256:51e6bd1a6f108238ae6aab6a65e5eed5e75d456be1c2bf29b04e5c1e7d7adbae", size = 16655, upload-time = "2024-01-11T16:25:11.914Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/92/44/da239917f5711ca7105f7d7f9e2765716dd883b241529beafc0f28504725/pytoolconfig-1.3.1-py3-none-any.whl", hash = "sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b", size = 17022, upload-time = "2024-01-11T16:25:10.589Z" },
-]
-
-[package.optional-dependencies]
-global = [
- { name = "platformdirs" },
-]
-
-[[package]]
-name = "pywin32-ctypes"
-version = "0.2.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" },
-]
-
-[[package]]
-name = "pyyaml"
-version = "6.0.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" },
- { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" },
- { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" },
- { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" },
- { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" },
- { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" },
- { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" },
- { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" },
- { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
-]
-
-[[package]]
-name = "rapidfuzz"
-version = "3.14.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ed/fc/a98b616db9a42dcdda7c78c76bdfdf6fe290ac4c5ffbb186f73ec981ad5b/rapidfuzz-3.14.1.tar.gz", hash = "sha256:b02850e7f7152bd1edff27e9d584505b84968cacedee7a734ec4050c655a803c", size = 57869570, upload-time = "2025-09-08T21:08:15.922Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/0d/f2/0024cc8eead108c4c29337abe133d72ddf3406ce9bbfbcfc110414a7ea07/rapidfuzz-3.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8d69f470d63ee824132ecd80b1974e1d15dd9df5193916901d7860cef081a260", size = 1926515, upload-time = "2025-09-08T21:06:39.834Z" },
- { url = "https://files.pythonhosted.org/packages/12/ae/6cb211f8930bea20fa989b23f31ee7f92940caaf24e3e510d242a1b28de4/rapidfuzz-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6f571d20152fc4833b7b5e781b36d5e4f31f3b5a596a3d53cf66a1bd4436b4f4", size = 1388431, upload-time = "2025-09-08T21:06:41.73Z" },
- { url = "https://files.pythonhosted.org/packages/39/88/bfec24da0607c39e5841ced5594ea1b907d20f83adf0e3ee87fa454a425b/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61d77e09b2b6bc38228f53b9ea7972a00722a14a6048be9a3672fb5cb08bad3a", size = 1375664, upload-time = "2025-09-08T21:06:43.737Z" },
- { url = "https://files.pythonhosted.org/packages/f4/43/9f282ba539e404bdd7052c7371d3aaaa1a9417979d2a1d8332670c7f385a/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b41d95ef86a6295d353dc3bb6c80550665ba2c3bef3a9feab46074d12a9af8f", size = 1668113, upload-time = "2025-09-08T21:06:45.758Z" },
- { url = "https://files.pythonhosted.org/packages/7f/2f/0b3153053b1acca90969eb0867922ac8515b1a8a48706a3215c2db60e87c/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0591df2e856ad583644b40a2b99fb522f93543c65e64b771241dda6d1cfdc96b", size = 2212875, upload-time = "2025-09-08T21:06:47.447Z" },
- { url = "https://files.pythonhosted.org/packages/f8/9b/623001dddc518afaa08ed1fbbfc4005c8692b7a32b0f08b20c506f17a770/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f277801f55b2f3923ef2de51ab94689a0671a4524bf7b611de979f308a54cd6f", size = 3161181, upload-time = "2025-09-08T21:06:49.179Z" },
- { url = "https://files.pythonhosted.org/packages/ce/b7/d8404ed5ad56eb74463e5ebf0a14f0019d7eb0e65e0323f709fe72e0884c/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:893fdfd4f66ebb67f33da89eb1bd1674b7b30442fdee84db87f6cb9074bf0ce9", size = 1225495, upload-time = "2025-09-08T21:06:51.056Z" },
- { url = "https://files.pythonhosted.org/packages/2c/6c/b96af62bc7615d821e3f6b47563c265fd7379d7236dfbc1cbbcce8beb1d2/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fe2651258c1f1afa9b66f44bf82f639d5f83034f9804877a1bbbae2120539ad1", size = 2396294, upload-time = "2025-09-08T21:06:53.063Z" },
- { url = "https://files.pythonhosted.org/packages/7f/b7/c60c9d22a7debed8b8b751f506a4cece5c22c0b05e47a819d6b47bc8c14e/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ace21f7a78519d8e889b1240489cd021c5355c496cb151b479b741a4c27f0a25", size = 2529629, upload-time = "2025-09-08T21:06:55.188Z" },
- { url = "https://files.pythonhosted.org/packages/25/94/a9ec7ccb28381f14de696ffd51c321974762f137679df986f5375d35264f/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cb5acf24590bc5e57027283b015950d713f9e4d155fda5cfa71adef3b3a84502", size = 2782960, upload-time = "2025-09-08T21:06:57.339Z" },
- { url = "https://files.pythonhosted.org/packages/68/80/04e5276d223060eca45250dbf79ea39940c0be8b3083661d58d57572c2c5/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:67ea46fa8cc78174bad09d66b9a4b98d3068e85de677e3c71ed931a1de28171f", size = 3298427, upload-time = "2025-09-08T21:06:59.319Z" },
- { url = "https://files.pythonhosted.org/packages/4a/63/24759b2a751562630b244e68ccaaf7a7525c720588fcc77c964146355aee/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:44e741d785de57d1a7bae03599c1cbc7335d0b060a35e60c44c382566e22782e", size = 4267736, upload-time = "2025-09-08T21:07:01.31Z" },
- { url = "https://files.pythonhosted.org/packages/18/a4/73f1b1f7f44d55f40ffbffe85e529eb9d7e7f7b2ffc0931760eadd163995/rapidfuzz-3.14.1-cp313-cp313-win32.whl", hash = "sha256:b1fe6001baa9fa36bcb565e24e88830718f6c90896b91ceffcb48881e3adddbc", size = 1710515, upload-time = "2025-09-08T21:07:03.16Z" },
- { url = "https://files.pythonhosted.org/packages/6a/8b/a8fe5a6ee4d06fd413aaa9a7e0a23a8630c4b18501509d053646d18c2aa7/rapidfuzz-3.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:83b8cc6336709fa5db0579189bfd125df280a554af544b2dc1c7da9cdad7e44d", size = 1540081, upload-time = "2025-09-08T21:07:05.401Z" },
- { url = "https://files.pythonhosted.org/packages/ac/fe/4b0ac16c118a2367d85450b45251ee5362661e9118a1cef88aae1765ffff/rapidfuzz-3.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:cf75769662eadf5f9bd24e865c19e5ca7718e879273dce4e7b3b5824c4da0eb4", size = 812725, upload-time = "2025-09-08T21:07:07.148Z" },
- { url = "https://files.pythonhosted.org/packages/e2/cb/1ad9a76d974d153783f8e0be8dbe60ec46488fac6e519db804e299e0da06/rapidfuzz-3.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d937dbeda71c921ef6537c6d41a84f1b8112f107589c9977059de57a1d726dd6", size = 1945173, upload-time = "2025-09-08T21:07:08.893Z" },
- { url = "https://files.pythonhosted.org/packages/d9/61/959ed7460941d8a81cbf6552b9c45564778a36cf5e5aa872558b30fc02b2/rapidfuzz-3.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a2d80cc1a4fcc7e259ed4f505e70b36433a63fa251f1bb69ff279fe376c5efd", size = 1413949, upload-time = "2025-09-08T21:07:11.033Z" },
- { url = "https://files.pythonhosted.org/packages/7b/a0/f46fca44457ca1f25f23cc1f06867454fc3c3be118cd10b552b0ab3e58a2/rapidfuzz-3.14.1-cp313-cp313t-win32.whl", hash = "sha256:40875e0c06f1a388f1cab3885744f847b557e0b1642dfc31ff02039f9f0823ef", size = 1760666, upload-time = "2025-09-08T21:07:12.884Z" },
- { url = "https://files.pythonhosted.org/packages/9b/d0/7a5d9c04446f8b66882b0fae45b36a838cf4d31439b5d1ab48a9d17c8e57/rapidfuzz-3.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:876dc0c15552f3d704d7fb8d61bdffc872ff63bedf683568d6faad32e51bbce8", size = 1579760, upload-time = "2025-09-08T21:07:14.718Z" },
- { url = "https://files.pythonhosted.org/packages/4e/aa/2c03ae112320d0746f2c869cae68c413f3fe3b6403358556f2b747559723/rapidfuzz-3.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:61458e83b0b3e2abc3391d0953c47d6325e506ba44d6a25c869c4401b3bc222c", size = 832088, upload-time = "2025-09-08T21:07:17.03Z" },
- { url = "https://files.pythonhosted.org/packages/d6/36/53debca45fbe693bd6181fb05b6a2fd561c87669edb82ec0d7c1961a43f0/rapidfuzz-3.14.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e84d9a844dc2e4d5c4cabd14c096374ead006583304333c14a6fbde51f612a44", size = 1926336, upload-time = "2025-09-08T21:07:18.809Z" },
- { url = "https://files.pythonhosted.org/packages/ae/32/b874f48609665fcfeaf16cbaeb2bbc210deef2b88e996c51cfc36c3eb7c3/rapidfuzz-3.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:40301b93b99350edcd02dbb22e37ca5f2a75d0db822e9b3c522da451a93d6f27", size = 1389653, upload-time = "2025-09-08T21:07:20.667Z" },
- { url = "https://files.pythonhosted.org/packages/97/25/f6c5a1ff4ec11edadacb270e70b8415f51fa2f0d5730c2c552b81651fbe3/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fedd5097a44808dddf341466866e5c57a18a19a336565b4ff50aa8f09eb528f6", size = 1380911, upload-time = "2025-09-08T21:07:22.584Z" },
- { url = "https://files.pythonhosted.org/packages/d8/f3/d322202ef8fab463759b51ebfaa33228100510c82e6153bd7a922e150270/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e3e61c9e80d8c26709d8aa5c51fdd25139c81a4ab463895f8a567f8347b0548", size = 1673515, upload-time = "2025-09-08T21:07:24.417Z" },
- { url = "https://files.pythonhosted.org/packages/8d/b9/6b2a97f4c6be96cac3749f32301b8cdf751ce5617b1c8934c96586a0662b/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da011a373722fac6e64687297a1d17dc8461b82cb12c437845d5a5b161bc24b9", size = 2219394, upload-time = "2025-09-08T21:07:26.402Z" },
- { url = "https://files.pythonhosted.org/packages/11/bf/afb76adffe4406e6250f14ce48e60a7eb05d4624945bd3c044cfda575fbc/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5967d571243cfb9ad3710e6e628ab68c421a237b76e24a67ac22ee0ff12784d6", size = 3163582, upload-time = "2025-09-08T21:07:28.878Z" },
- { url = "https://files.pythonhosted.org/packages/42/34/e6405227560f61e956cb4c5de653b0f874751c5ada658d3532d6c1df328e/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:474f416cbb9099676de54aa41944c154ba8d25033ee460f87bb23e54af6d01c9", size = 1221116, upload-time = "2025-09-08T21:07:30.8Z" },
- { url = "https://files.pythonhosted.org/packages/55/e6/5b757e2e18de384b11d1daf59608453f0baf5d5d8d1c43e1a964af4dc19a/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ae2d57464b59297f727c4e201ea99ec7b13935f1f056c753e8103da3f2fc2404", size = 2402670, upload-time = "2025-09-08T21:07:32.702Z" },
- { url = "https://files.pythonhosted.org/packages/43/c4/d753a415fe54531aa882e288db5ed77daaa72e05c1a39e1cbac00d23024f/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:57047493a1f62f11354c7143c380b02f1b355c52733e6b03adb1cb0fe8fb8816", size = 2521659, upload-time = "2025-09-08T21:07:35.218Z" },
- { url = "https://files.pythonhosted.org/packages/cd/28/d4e7fe1515430db98f42deb794c7586a026d302fe70f0216b638d89cf10f/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4acc20776f225ee37d69517a237c090b9fa7e0836a0b8bc58868e9168ba6ef6f", size = 2788552, upload-time = "2025-09-08T21:07:37.188Z" },
- { url = "https://files.pythonhosted.org/packages/4f/00/eab05473af7a2cafb4f3994bc6bf408126b8eec99a569aac6254ac757db4/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4373f914ff524ee0146919dea96a40a8200ab157e5a15e777a74a769f73d8a4a", size = 3306261, upload-time = "2025-09-08T21:07:39.624Z" },
- { url = "https://files.pythonhosted.org/packages/d1/31/2feb8dfcfcff6508230cd2ccfdde7a8bf988c6fda142fe9ce5d3eb15704d/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:37017b84953927807847016620d61251fe236bd4bcb25e27b6133d955bb9cafb", size = 4269522, upload-time = "2025-09-08T21:07:41.663Z" },
- { url = "https://files.pythonhosted.org/packages/a3/99/250538d73c8fbab60597c3d131a11ef2a634d38b44296ca11922794491ac/rapidfuzz-3.14.1-cp314-cp314-win32.whl", hash = "sha256:c8d1dd1146539e093b84d0805e8951475644af794ace81d957ca612e3eb31598", size = 1745018, upload-time = "2025-09-08T21:07:44.313Z" },
- { url = "https://files.pythonhosted.org/packages/c5/15/d50839d20ad0743aded25b08a98ffb872f4bfda4e310bac6c111fcf6ea1f/rapidfuzz-3.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:f51c7571295ea97387bac4f048d73cecce51222be78ed808263b45c79c40a440", size = 1587666, upload-time = "2025-09-08T21:07:46.917Z" },
- { url = "https://files.pythonhosted.org/packages/a3/ff/d73fec989213fb6f0b6f15ee4bbdf2d88b0686197951a06b036111cd1c7d/rapidfuzz-3.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:01eab10ec90912d7d28b3f08f6c91adbaf93458a53f849ff70776ecd70dd7a7a", size = 835780, upload-time = "2025-09-08T21:07:49.256Z" },
- { url = "https://files.pythonhosted.org/packages/b7/e7/f0a242687143cebd33a1fb165226b73bd9496d47c5acfad93de820a18fa8/rapidfuzz-3.14.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:60879fcae2f7618403c4c746a9a3eec89327d73148fb6e89a933b78442ff0669", size = 1945182, upload-time = "2025-09-08T21:07:51.84Z" },
- { url = "https://files.pythonhosted.org/packages/96/29/ca8a3f8525e3d0e7ab49cb927b5fb4a54855f794c9ecd0a0b60a6c96a05f/rapidfuzz-3.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f94d61e44db3fc95a74006a394257af90fa6e826c900a501d749979ff495d702", size = 1413946, upload-time = "2025-09-08T21:07:53.702Z" },
- { url = "https://files.pythonhosted.org/packages/b5/ef/6fd10aa028db19c05b4ac7fe77f5613e4719377f630c709d89d7a538eea2/rapidfuzz-3.14.1-cp314-cp314t-win32.whl", hash = "sha256:93b6294a3ffab32a9b5f9b5ca048fa0474998e7e8bb0f2d2b5e819c64cb71ec7", size = 1795851, upload-time = "2025-09-08T21:07:55.76Z" },
- { url = "https://files.pythonhosted.org/packages/e4/30/acd29ebd906a50f9e0f27d5f82a48cf5e8854637b21489bd81a2459985cf/rapidfuzz-3.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6cb56b695421538fdbe2c0c85888b991d833b8637d2f2b41faa79cea7234c000", size = 1626748, upload-time = "2025-09-08T21:07:58.166Z" },
- { url = "https://files.pythonhosted.org/packages/c1/f4/dfc7b8c46b1044a47f7ca55deceb5965985cff3193906cb32913121e6652/rapidfuzz-3.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7cd312c380d3ce9d35c3ec9726b75eee9da50e8a38e89e229a03db2262d3d96b", size = 853771, upload-time = "2025-09-08T21:08:00.816Z" },
-]
-
-[[package]]
-name = "redis"
-version = "6.4.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0d/d6/e8b92798a5bd67d659d51a18170e91c16ac3b59738d91894651ee255ed49/redis-6.4.0.tar.gz", hash = "sha256:b01bc7282b8444e28ec36b261df5375183bb47a07eb9c603f284e89cbc5ef010", size = 4647399, upload-time = "2025-08-07T08:10:11.441Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e8/02/89e2ed7e85db6c93dfa9e8f691c5087df4e3551ab39081a4d7c6d1f90e05/redis-6.4.0-py3-none-any.whl", hash = "sha256:f0544fa9604264e9464cdf4814e7d4830f74b165d52f2a330a760a88dd248b7f", size = 279847, upload-time = "2025-08-07T08:10:09.84Z" },
-]
-
-[[package]]
-name = "referencing"
-version = "0.36.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "attrs" },
- { name = "rpds-py" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" },
-]
-
-[[package]]
-name = "requests"
-version = "2.32.5"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "certifi" },
- { name = "charset-normalizer" },
- { name = "idna" },
- { name = "urllib3" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
-]
-
-[[package]]
-name = "requests-toolbelt"
-version = "1.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "requests" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" },
-]
-
-[[package]]
-name = "rope"
-version = "1.14.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pytoolconfig", extra = ["global"] },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/74/3a/85e60d154f26ecdc1d47a63ac58bd9f32a5a9f3f771f6672197f02a00ade/rope-1.14.0.tar.gz", hash = "sha256:8803e3b667315044f6270b0c69a10c0679f9f322ed8efe6245a93ceb7658da69", size = 296801, upload-time = "2025-07-12T17:46:07.786Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/75/35/130469d1901da2b3a5a377539b4ffcd8a5c983f1c9e3ba5ffdd8d71ae314/rope-1.14.0-py3-none-any.whl", hash = "sha256:00a7ea8c0c376fc0b053b2f2f8ef3bfb8b50fecf1ebf3eb80e4f8bd7f1941918", size = 207143, upload-time = "2025-07-12T17:46:05.928Z" },
-]
-
-[[package]]
-name = "rpds-py"
-version = "0.27.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" },
- { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" },
- { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" },
- { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" },
- { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" },
- { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" },
- { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" },
- { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" },
- { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" },
- { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" },
- { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" },
- { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" },
- { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" },
- { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" },
- { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" },
- { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" },
- { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" },
- { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" },
- { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" },
- { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" },
- { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" },
- { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" },
- { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" },
- { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" },
- { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" },
- { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" },
- { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" },
- { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" },
- { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" },
- { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" },
- { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" },
- { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" },
- { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" },
- { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" },
- { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" },
- { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" },
- { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" },
- { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" },
- { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" },
- { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" },
- { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" },
- { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" },
- { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" },
- { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" },
- { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" },
- { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" },
- { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" },
- { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" },
- { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" },
- { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" },
- { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" },
- { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" },
- { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" },
- { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" },
- { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" },
- { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" },
- { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" },
- { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" },
-]
-
-[[package]]
-name = "ruff"
-version = "0.13.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ab/33/c8e89216845615d14d2d42ba2bee404e7206a8db782f33400754f3799f05/ruff-0.13.1.tar.gz", hash = "sha256:88074c3849087f153d4bb22e92243ad4c1b366d7055f98726bc19aa08dc12d51", size = 5397987, upload-time = "2025-09-18T19:52:44.33Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/f3/41/ca37e340938f45cfb8557a97a5c347e718ef34702546b174e5300dbb1f28/ruff-0.13.1-py3-none-linux_armv6l.whl", hash = "sha256:b2abff595cc3cbfa55e509d89439b5a09a6ee3c252d92020bd2de240836cf45b", size = 12304308, upload-time = "2025-09-18T19:51:56.253Z" },
- { url = "https://files.pythonhosted.org/packages/ff/84/ba378ef4129415066c3e1c80d84e539a0d52feb250685091f874804f28af/ruff-0.13.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4ee9f4249bf7f8bb3984c41bfaf6a658162cdb1b22e3103eabc7dd1dc5579334", size = 12937258, upload-time = "2025-09-18T19:52:00.184Z" },
- { url = "https://files.pythonhosted.org/packages/8d/b6/ec5e4559ae0ad955515c176910d6d7c93edcbc0ed1a3195a41179c58431d/ruff-0.13.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5c5da4af5f6418c07d75e6f3224e08147441f5d1eac2e6ce10dcce5e616a3bae", size = 12214554, upload-time = "2025-09-18T19:52:02.753Z" },
- { url = "https://files.pythonhosted.org/packages/70/d6/cb3e3b4f03b9b0c4d4d8f06126d34b3394f6b4d764912fe80a1300696ef6/ruff-0.13.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80524f84a01355a59a93cef98d804e2137639823bcee2931f5028e71134a954e", size = 12448181, upload-time = "2025-09-18T19:52:05.279Z" },
- { url = "https://files.pythonhosted.org/packages/d2/ea/bf60cb46d7ade706a246cd3fb99e4cfe854efa3dfbe530d049c684da24ff/ruff-0.13.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff7f5ce8d7988767dd46a148192a14d0f48d1baea733f055d9064875c7d50389", size = 12104599, upload-time = "2025-09-18T19:52:07.497Z" },
- { url = "https://files.pythonhosted.org/packages/2d/3e/05f72f4c3d3a69e65d55a13e1dd1ade76c106d8546e7e54501d31f1dc54a/ruff-0.13.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c55d84715061f8b05469cdc9a446aa6c7294cd4bd55e86a89e572dba14374f8c", size = 13791178, upload-time = "2025-09-18T19:52:10.189Z" },
- { url = "https://files.pythonhosted.org/packages/81/e7/01b1fc403dd45d6cfe600725270ecc6a8f8a48a55bc6521ad820ed3ceaf8/ruff-0.13.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ac57fed932d90fa1624c946dc67a0a3388d65a7edc7d2d8e4ca7bddaa789b3b0", size = 14814474, upload-time = "2025-09-18T19:52:12.866Z" },
- { url = "https://files.pythonhosted.org/packages/fa/92/d9e183d4ed6185a8df2ce9faa3f22e80e95b5f88d9cc3d86a6d94331da3f/ruff-0.13.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c366a71d5b4f41f86a008694f7a0d75fe409ec298685ff72dc882f882d532e36", size = 14217531, upload-time = "2025-09-18T19:52:15.245Z" },
- { url = "https://files.pythonhosted.org/packages/3b/4a/6ddb1b11d60888be224d721e01bdd2d81faaf1720592858ab8bac3600466/ruff-0.13.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4ea9d1b5ad3e7a83ee8ebb1229c33e5fe771e833d6d3dcfca7b77d95b060d38", size = 13265267, upload-time = "2025-09-18T19:52:17.649Z" },
- { url = "https://files.pythonhosted.org/packages/81/98/3f1d18a8d9ea33ef2ad508f0417fcb182c99b23258ec5e53d15db8289809/ruff-0.13.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0f70202996055b555d3d74b626406476cc692f37b13bac8828acff058c9966a", size = 13243120, upload-time = "2025-09-18T19:52:20.332Z" },
- { url = "https://files.pythonhosted.org/packages/8d/86/b6ce62ce9c12765fa6c65078d1938d2490b2b1d9273d0de384952b43c490/ruff-0.13.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:f8cff7a105dad631085d9505b491db33848007d6b487c3c1979dd8d9b2963783", size = 13443084, upload-time = "2025-09-18T19:52:23.032Z" },
- { url = "https://files.pythonhosted.org/packages/a1/6e/af7943466a41338d04503fb5a81b2fd07251bd272f546622e5b1599a7976/ruff-0.13.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:9761e84255443316a258dd7dfbd9bfb59c756e52237ed42494917b2577697c6a", size = 12295105, upload-time = "2025-09-18T19:52:25.263Z" },
- { url = "https://files.pythonhosted.org/packages/3f/97/0249b9a24f0f3ebd12f007e81c87cec6d311de566885e9309fcbac5b24cc/ruff-0.13.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:3d376a88c3102ef228b102211ef4a6d13df330cb0f5ca56fdac04ccec2a99700", size = 12072284, upload-time = "2025-09-18T19:52:27.478Z" },
- { url = "https://files.pythonhosted.org/packages/f6/85/0b64693b2c99d62ae65236ef74508ba39c3febd01466ef7f354885e5050c/ruff-0.13.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cbefd60082b517a82c6ec8836989775ac05f8991715d228b3c1d86ccc7df7dae", size = 12970314, upload-time = "2025-09-18T19:52:30.212Z" },
- { url = "https://files.pythonhosted.org/packages/96/fc/342e9f28179915d28b3747b7654f932ca472afbf7090fc0c4011e802f494/ruff-0.13.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dd16b9a5a499fe73f3c2ef09a7885cb1d97058614d601809d37c422ed1525317", size = 13422360, upload-time = "2025-09-18T19:52:32.676Z" },
- { url = "https://files.pythonhosted.org/packages/37/54/6177a0dc10bce6f43e392a2192e6018755473283d0cf43cc7e6afc182aea/ruff-0.13.1-py3-none-win32.whl", hash = "sha256:55e9efa692d7cb18580279f1fbb525146adc401f40735edf0aaeabd93099f9a0", size = 12178448, upload-time = "2025-09-18T19:52:35.545Z" },
- { url = "https://files.pythonhosted.org/packages/64/51/c6a3a33d9938007b8bdc8ca852ecc8d810a407fb513ab08e34af12dc7c24/ruff-0.13.1-py3-none-win_amd64.whl", hash = "sha256:3a3fb595287ee556de947183489f636b9f76a72f0fa9c028bdcabf5bab2cc5e5", size = 13286458, upload-time = "2025-09-18T19:52:38.198Z" },
- { url = "https://files.pythonhosted.org/packages/fd/04/afc078a12cf68592345b1e2d6ecdff837d286bac023d7a22c54c7a698c5b/ruff-0.13.1-py3-none-win_arm64.whl", hash = "sha256:c0bae9ffd92d54e03c2bf266f466da0a65e145f298ee5b5846ed435f6a00518a", size = 12437893, upload-time = "2025-09-18T19:52:41.283Z" },
-]
-
-[[package]]
-name = "secretstorage"
-version = "3.4.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "cryptography" },
- { name = "jeepney" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/31/9f/11ef35cf1027c1339552ea7bfe6aaa74a8516d8b5caf6e7d338daf54fd80/secretstorage-3.4.0.tar.gz", hash = "sha256:c46e216d6815aff8a8a18706a2fbfd8d53fcbb0dce99301881687a1b0289ef7c", size = 19748, upload-time = "2025-09-09T16:42:13.859Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/91/ff/2e2eed29e02c14a5cb6c57f09b2d5b40e65d6cc71f45b52e0be295ccbc2f/secretstorage-3.4.0-py3-none-any.whl", hash = "sha256:0e3b6265c2c63509fb7415717607e4b2c9ab767b7f344a57473b779ca13bd02e", size = 15272, upload-time = "2025-09-09T16:42:12.744Z" },
-]
-
-[[package]]
-name = "semver"
-version = "3.0.4"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", size = 269730, upload-time = "2025-01-24T13:19:27.617Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", size = 17912, upload-time = "2025-01-24T13:19:24.949Z" },
-]
-
-[[package]]
-name = "sentry-sdk"
-version = "2.38.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "certifi" },
- { name = "urllib3" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/b2/22/60fd703b34d94d216b2387e048ac82de3e86b63bc28869fb076f8bb0204a/sentry_sdk-2.38.0.tar.gz", hash = "sha256:792d2af45e167e2f8a3347143f525b9b6bac6f058fb2014720b40b84ccbeb985", size = 348116, upload-time = "2025-09-15T15:00:37.846Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7a/84/bde4c4bbb269b71bc09316af8eb00da91f67814d40337cc12ef9c8742541/sentry_sdk-2.38.0-py2.py3-none-any.whl", hash = "sha256:2324aea8573a3fa1576df7fb4d65c4eb8d9929c8fa5939647397a07179eef8d0", size = 370346, upload-time = "2025-09-15T15:00:35.821Z" },
-]
-
-[[package]]
-name = "service-identity"
-version = "24.2.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "attrs" },
- { name = "cryptography" },
- { name = "pyasn1" },
- { name = "pyasn1-modules" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/07/a5/dfc752b979067947261dbbf2543470c58efe735c3c1301dd870ef27830ee/service_identity-24.2.0.tar.gz", hash = "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09", size = 39245, upload-time = "2024-10-26T07:21:57.736Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/08/2c/ca6dd598b384bc1ce581e24aaae0f2bed4ccac57749d5c3befbb5e742081/service_identity-24.2.0-py3-none-any.whl", hash = "sha256:6b047fbd8a84fd0bb0d55ebce4031e400562b9196e1e0d3e0fe2b8a59f6d4a85", size = 11364, upload-time = "2024-10-26T07:21:56.302Z" },
-]
-
-[[package]]
-name = "setuptools"
-version = "80.9.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
-]
-
-[[package]]
-name = "shellingham"
-version = "1.5.4"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
-]
-
-[[package]]
-name = "six"
-version = "1.17.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
-]
-
-[[package]]
-name = "sniffio"
-version = "1.3.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
-]
-
-[[package]]
-name = "sqlparse"
-version = "0.5.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e5/40/edede8dd6977b0d3da179a342c198ed100dd2aba4be081861ee5911e4da4/sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272", size = 84999, upload-time = "2024-12-10T12:05:30.728Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415, upload-time = "2024-12-10T12:05:27.824Z" },
-]
-
-[[package]]
-name = "text-unidecode"
-version = "1.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" },
-]
-
-[[package]]
-name = "thrillwiki"
-version = "0.1.0"
-source = { virtual = "." }
-dependencies = [
- { name = "black" },
- { name = "celery" },
- { name = "channels" },
- { name = "channels-redis" },
- { name = "coverage" },
- { name = "daphne" },
- { name = "dj-database-url" },
- { name = "dj-rest-auth" },
- { name = "django" },
- { name = "django-allauth" },
- { name = "django-celery-beat" },
- { name = "django-celery-results" },
- { name = "django-cleanup" },
- { name = "django-cloudflareimages-toolkit" },
- { name = "django-cors-headers" },
- { name = "django-cotton" },
- { name = "django-debug-toolbar" },
- { name = "django-environ" },
- { name = "django-extensions" },
- { name = "django-filter" },
- { name = "django-forwardemail" },
- { name = "django-health-check" },
- { name = "django-htmx" },
- { name = "django-htmx-autocomplete" },
- { name = "django-oauth-toolkit" },
- { name = "django-pghistory" },
- { name = "django-redis" },
- { name = "django-silk" },
- { name = "django-simple-history" },
- { name = "django-tailwind-cli" },
- { name = "django-webpack-loader" },
- { name = "django-widget-tweaks" },
- { name = "djangorestframework" },
- { name = "djangorestframework-simplejwt" },
- { name = "drf-spectacular" },
- { name = "factory-boy" },
- { name = "flake8" },
- { name = "nplusone" },
- { name = "piexif" },
- { name = "pillow" },
- { name = "playwright" },
- { name = "poetry" },
- { name = "psutil" },
- { name = "psycopg2-binary" },
- { name = "pycountry" },
- { name = "pyjwt" },
- { name = "pyright" },
- { name = "pytest" },
- { name = "pytest-django" },
- { name = "pytest-playwright" },
- { name = "python-decouple" },
- { name = "python-dotenv" },
- { name = "python-json-logger" },
- { name = "redis" },
- { name = "requests" },
- { name = "ruff" },
- { name = "sentry-sdk" },
- { name = "werkzeug" },
- { name = "whitenoise" },
-]
-
-[package.dev-dependencies]
-dev = [
- { name = "autoflake" },
- { name = "autopep8" },
- { name = "black" },
- { name = "django-stubs" },
- { name = "rope" },
-]
-
-[package.metadata]
-requires-dist = [
- { name = "black", specifier = ">=24.1.0" },
- { name = "celery", specifier = ">=5.5.3" },
- { name = "channels", specifier = ">=4.2.0" },
- { name = "channels-redis", specifier = ">=4.2.1" },
- { name = "coverage", specifier = ">=7.9.1" },
- { name = "daphne", specifier = ">=4.1.2" },
- { name = "dj-database-url", specifier = ">=2.3.0" },
- { name = "dj-rest-auth", specifier = ">=7.0.0" },
- { name = "django", specifier = ">=5.0" },
- { name = "django-allauth", specifier = ">=0.60.1" },
- { name = "django-celery-beat", specifier = ">=2.8.1" },
- { name = "django-celery-results", specifier = ">=2.6.0" },
- { name = "django-cleanup", specifier = ">=8.0.0" },
- { name = "django-cloudflareimages-toolkit", specifier = ">=1.0.6" },
- { name = "django-cors-headers", specifier = ">=4.3.1" },
- { name = "django-cotton", specifier = ">=2.1.3" },
- { name = "django-debug-toolbar", specifier = ">=4.0.0" },
- { name = "django-environ", specifier = ">=0.12.0" },
- { name = "django-extensions", specifier = ">=4.1" },
- { name = "django-filter", specifier = ">=23.5" },
- { name = "django-forwardemail", specifier = ">=1.0.0" },
- { name = "django-health-check", specifier = ">=3.17.0" },
- { name = "django-htmx", specifier = ">=1.17.2" },
- { name = "django-htmx-autocomplete", specifier = ">=1.0.5" },
- { name = "django-oauth-toolkit", specifier = ">=3.0.1" },
- { name = "django-pghistory", specifier = ">=3.5.2" },
- { name = "django-redis", specifier = ">=5.4.0" },
- { name = "django-silk", specifier = ">=5.0.0" },
- { name = "django-simple-history", specifier = ">=3.5.0" },
- { name = "django-tailwind-cli", specifier = ">=2.21.1" },
- { name = "django-webpack-loader", specifier = ">=3.1.1" },
- { name = "django-widget-tweaks", specifier = ">=1.5.0" },
- { name = "djangorestframework", specifier = ">=3.14.0" },
- { name = "djangorestframework-simplejwt", specifier = ">=5.5.1" },
- { name = "drf-spectacular", specifier = ">=0.27.0" },
- { name = "factory-boy", specifier = ">=3.3.3" },
- { name = "flake8", specifier = ">=7.1.1" },
- { name = "nplusone", specifier = ">=1.0.0" },
- { name = "piexif", specifier = ">=1.1.3" },
- { name = "pillow", specifier = ">=10.2.0" },
- { name = "playwright", specifier = ">=1.41.0" },
- { name = "poetry", specifier = ">=2.1.3" },
- { name = "psutil", specifier = ">=7.0.0" },
- { name = "psycopg2-binary", specifier = ">=2.9.9" },
- { name = "pycountry", specifier = ">=24.6.1" },
- { name = "pyjwt", specifier = ">=2.10.1" },
- { name = "pyright", specifier = ">=1.1.404" },
- { name = "pytest", specifier = ">=8.3.4" },
- { name = "pytest-django", specifier = ">=4.9.0" },
- { name = "pytest-playwright", specifier = ">=0.4.3" },
- { name = "python-decouple", specifier = ">=3.8" },
- { name = "python-dotenv", specifier = ">=1.0.1" },
- { name = "python-json-logger", url = "https://github.com/nhairs/python-json-logger/releases/download/v3.0.0/python_json_logger-3.0.0-py3-none-any.whl" },
- { name = "redis", specifier = ">=6.4.0" },
- { name = "requests", specifier = ">=2.32.3" },
- { name = "ruff", specifier = ">=0.12.10" },
- { name = "sentry-sdk", specifier = ">=1.40.0" },
- { name = "werkzeug", specifier = ">=3.1.3" },
- { name = "whitenoise", specifier = ">=6.6.0" },
-]
-
-[package.metadata.requires-dev]
-dev = [
- { name = "autoflake", specifier = ">=2.3.1" },
- { name = "autopep8", specifier = ">=2.3.2" },
- { name = "black", specifier = ">=25.1.0" },
- { name = "django-stubs", specifier = ">=5.2.2" },
- { name = "rope", specifier = ">=1.14.0" },
-]
-
-[[package]]
-name = "tomlkit"
-version = "0.13.3"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" },
-]
-
-[[package]]
-name = "trove-classifiers"
-version = "2025.9.11.17"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ca/9a/778622bc06632529817c3c524c82749a112603ae2bbcf72ee3eb33a2c4f1/trove_classifiers-2025.9.11.17.tar.gz", hash = "sha256:931ca9841a5e9c9408bc2ae67b50d28acf85bef56219b56860876dd1f2d024dd", size = 16975, upload-time = "2025-09-11T17:07:50.97Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e1/85/a4ff8758c66f1fc32aa5e9a145908394bf9cf1c79ffd1113cfdeb77e74e4/trove_classifiers-2025.9.11.17-py3-none-any.whl", hash = "sha256:5d392f2d244deb1866556457d6f3516792124a23d1c3a463a2e8668a5d1c15dd", size = 14158, upload-time = "2025-09-11T17:07:49.886Z" },
-]
-
-[[package]]
-name = "twisted"
-version = "25.5.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "attrs" },
- { name = "automat" },
- { name = "constantly" },
- { name = "hyperlink" },
- { name = "incremental" },
- { name = "typing-extensions" },
- { name = "zope-interface" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/13/0f/82716ed849bf7ea4984c21385597c949944f0f9b428b5710f79d0afc084d/twisted-25.5.0.tar.gz", hash = "sha256:1deb272358cb6be1e3e8fc6f9c8b36f78eb0fa7c2233d2dbe11ec6fee04ea316", size = 3545725, upload-time = "2025-06-07T09:52:24.858Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/eb/66/ab7efd8941f0bc7b2bd555b0f0471bff77df4c88e0cc31120c82737fec77/twisted-25.5.0-py3-none-any.whl", hash = "sha256:8559f654d01a54a8c3efe66d533d43f383531ebf8d81d9f9ab4769d91ca15df7", size = 3204767, upload-time = "2025-06-07T09:52:21.428Z" },
-]
-
-[package.optional-dependencies]
-tls = [
- { name = "idna" },
- { name = "pyopenssl" },
- { name = "service-identity" },
-]
-
-[[package]]
-name = "txaio"
-version = "25.6.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/10/21/f1d3305ae1d3ca05aa71d509f02f4db11c1357001f7e31f9713e610efc5b/txaio-25.6.1.tar.gz", hash = "sha256:d8c03dca823515c9bca920df33504923ae54f2dabf476cc5a9ed5cc1691ed687", size = 58709, upload-time = "2025-06-26T16:59:29.544Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/52/56/aff5af8caa210321d0c206eb19897a4e0b29b4e24c4e24226325950efe0b/txaio-25.6.1-py2.py3-none-any.whl", hash = "sha256:f461b917a14d46077fb1668d0bea4998695d93c9c569cd05fd7f193abdd22414", size = 31250, upload-time = "2025-06-26T16:59:28.379Z" },
-]
-
-[[package]]
-name = "typer-slim"
-version = "0.17.5"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/71/19/79ce7f1e0ff64f0b011aac73d13a82ddfb2ca236434a1e238424baae3159/typer_slim-0.17.5.tar.gz", hash = "sha256:833a422a7cd7e27e74fcd5d76bdf51b9264c84037daceffb04b152f1a435883a", size = 103779, upload-time = "2025-09-19T18:34:30.098Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/4e/77/9a212a891a3884345612e7f37e81c93a97836a3361681b9c288e80d46c32/typer_slim-0.17.5-py3-none-any.whl", hash = "sha256:fdd3155287586af53170e87a08b6811dea243f700186b9c7d32403d2f4c9c943", size = 46708, upload-time = "2025-09-19T18:34:28.727Z" },
-]
-
-[[package]]
-name = "types-pyyaml"
-version = "6.0.12.20250915"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/7e/69/3c51b36d04da19b92f9e815be12753125bd8bc247ba0470a982e6979e71c/types_pyyaml-6.0.12.20250915.tar.gz", hash = "sha256:0f8b54a528c303f0e6f7165687dd33fafa81c807fcac23f632b63aa624ced1d3", size = 17522, upload-time = "2025-09-15T03:01:00.728Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/bd/e0/1eed384f02555dde685fff1a1ac805c1c7dcb6dd019c916fe659b1c1f9ec/types_pyyaml-6.0.12.20250915-py3-none-any.whl", hash = "sha256:e7d4d9e064e89a3b3cae120b4990cd370874d2bf12fa5f46c97018dd5d3c9ab6", size = 20338, upload-time = "2025-09-15T03:00:59.218Z" },
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.15.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
-]
-
-[[package]]
-name = "tzdata"
-version = "2025.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" },
-]
-
-[[package]]
-name = "uritemplate"
-version = "4.2.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" },
-]
-
-[[package]]
-name = "urllib3"
-version = "2.5.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
-]
-
-[[package]]
-name = "vine"
-version = "5.1.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/bd/e4/d07b5f29d283596b9727dd5275ccbceb63c44a1a82aa9e4bfd20426762ac/vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0", size = 48980, upload-time = "2023-11-05T08:46:53.857Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/03/ff/7c0c86c43b3cbb927e0ccc0255cb4057ceba4799cd44ae95174ce8e8b5b2/vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc", size = 9636, upload-time = "2023-11-05T08:46:51.205Z" },
-]
-
-[[package]]
-name = "virtualenv"
-version = "20.34.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "distlib" },
- { name = "filelock" },
- { name = "platformdirs" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" },
-]
-
-[[package]]
-name = "wcwidth"
-version = "0.2.13"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" },
-]
-
-[[package]]
-name = "werkzeug"
-version = "3.1.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "markupsafe" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925, upload-time = "2024-11-08T15:52:18.093Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498, upload-time = "2024-11-08T15:52:16.132Z" },
-]
-
-[[package]]
-name = "whitenoise"
-version = "6.11.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/15/95/8c81ec6b6ebcbf8aca2de7603070ccf37dbb873b03f20708e0f7c1664bc6/whitenoise-6.11.0.tar.gz", hash = "sha256:0f5bfce6061ae6611cd9396a8231e088722e4fc67bc13a111be74c738d99375f", size = 26432, upload-time = "2025-09-18T09:16:10.995Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/6c/e9/4366332f9295fe0647d7d3251ce18f5615fbcb12d02c79a26f8dba9221b3/whitenoise-6.11.0-py3-none-any.whl", hash = "sha256:b2aeb45950597236f53b5342b3121c5de69c8da0109362aee506ce88e022d258", size = 20197, upload-time = "2025-09-18T09:16:09.754Z" },
-]
-
-[[package]]
-name = "xattr"
-version = "1.2.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "cffi" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/50/65/14438ae55acf7f8fc396ee8340d740a3e1d6ef382bf25bf24156cfb83563/xattr-1.2.0.tar.gz", hash = "sha256:a64c8e21eff1be143accf80fd3b8fde3e28a478c37da298742af647ac3e5e0a7", size = 17293, upload-time = "2025-07-14T03:15:44.884Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b6/f9/6c98102949691f7e9caf9a31118be6e46720a23049f417dcf77cc689d06e/xattr-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c385ea93a18aeb6443a719eb6a6b1d7f7b143a4d1f2b08bc4fadfc429209e629", size = 24242, upload-time = "2025-07-14T03:14:56.392Z" },
- { url = "https://files.pythonhosted.org/packages/22/6a/130f6cd5cbb0ea0e470c9b366a21b9474eb607288fd17256d60e50f05d0b/xattr-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d39d7b36842c67ab3040bead7eb6d601e35fa0d6214ed20a43df4ec30b6f9f9", size = 19219, upload-time = "2025-07-14T03:14:57.367Z" },
- { url = "https://files.pythonhosted.org/packages/3d/40/93f2dd033544028e7b9512b8b9fb6872ec74a804fbb686e62b83fdf72e21/xattr-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:320ef856bb817f4c40213b6de956dc440d0f23cdc62da3ea02239eb5147093f8", size = 19538, upload-time = "2025-07-14T03:14:58.434Z" },
-]
-
-[[package]]
-name = "zope-interface"
-version = "8.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "setuptools" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/68/21/a6af230243831459f7238764acb3086a9cf96dbf405d8084d30add1ee2e7/zope_interface-8.0.tar.gz", hash = "sha256:b14d5aac547e635af749ce20bf49a3f5f93b8a854d2a6b1e95d4d5e5dc618f7d", size = 253397, upload-time = "2025-09-12T07:17:13.571Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/f2/7a/1093db3af58fe48299659a7e0bc17cb2be72bf8bf7ea54a429556c816e50/zope_interface-8.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:ee9ecad04269c2da4b1be403a47993981531ffd557064b870eab4094730e5062", size = 208743, upload-time = "2025-09-12T07:24:14.397Z" },
- { url = "https://files.pythonhosted.org/packages/fe/ec/63003ea86eb37b423ad85575b77b445ca26baa4b15f431d0c2319642ffeb/zope_interface-8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a9a8a71c38628af82a9ea1f7be58e5d19360a38067080c8896f6cbabe167e4f8", size = 208803, upload-time = "2025-09-12T07:24:15.918Z" },
- { url = "https://files.pythonhosted.org/packages/d9/0e/e19352096e2933e0047b954d861d74dce34c61283a9c3150aac163a182d9/zope_interface-8.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:c0cc51ebd984945362fd3abdc1e140dbd837c3e3b680942b3fa24fe3aac26ef8", size = 258964, upload-time = "2025-09-12T07:58:22.829Z" },
- { url = "https://files.pythonhosted.org/packages/32/a5/ec1578b838f364c889746a03960624a8781c9a1cd1b8cc29c57ec8d16df9/zope_interface-8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:07405019f635a93b318807cb2ec7b05a5ef30f67cf913d11eb2f156ddbcead0d", size = 264435, upload-time = "2025-09-12T08:00:30.255Z" },
- { url = "https://files.pythonhosted.org/packages/e7/8e/4a8b167481cada8b82b2212eb0003d425a30d1699d3604052e6c66817545/zope_interface-8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:450ab3357799eed6093f3a9f1fa22761b3a9de9ebaf57f416da2c9fb7122cdcb", size = 263942, upload-time = "2025-09-12T08:29:22.416Z" },
- { url = "https://files.pythonhosted.org/packages/38/bd/f9da62983480ecfc5a1147fafbc762bb76e5e8528611c4cf8b9d72b4de13/zope_interface-8.0-cp313-cp313-win_amd64.whl", hash = "sha256:e38bb30a58887d63b80b01115ab5e8be6158b44d00b67197186385ec7efe44c7", size = 212034, upload-time = "2025-09-12T07:22:57.241Z" },
-]
-
-[[package]]
-name = "zstandard"
-version = "0.25.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735, upload-time = "2025-09-14T22:17:26.042Z" },
- { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" },
- { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070, upload-time = "2025-09-14T22:17:28.896Z" },
- { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" },
- { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" },
- { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" },
- { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" },
- { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" },
- { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" },
- { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" },
- { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889, upload-time = "2025-09-14T22:17:43.577Z" },
- { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" },
- { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" },
- { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" },
- { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936, upload-time = "2025-09-14T22:17:52.658Z" },
- { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232, upload-time = "2025-09-14T22:17:50.402Z" },
- { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671, upload-time = "2025-09-14T22:17:51.533Z" },
- { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887, upload-time = "2025-09-14T22:17:54.198Z" },
- { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658, upload-time = "2025-09-14T22:17:55.423Z" },
- { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849, upload-time = "2025-09-14T22:17:57.372Z" },
- { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095, upload-time = "2025-09-14T22:17:59.498Z" },
- { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751, upload-time = "2025-09-14T22:18:01.618Z" },
- { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818, upload-time = "2025-09-14T22:18:03.769Z" },
- { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402, upload-time = "2025-09-14T22:18:05.954Z" },
- { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108, upload-time = "2025-09-14T22:18:07.68Z" },
- { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248, upload-time = "2025-09-14T22:18:09.753Z" },
- { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330, upload-time = "2025-09-14T22:18:11.966Z" },
- { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123, upload-time = "2025-09-14T22:18:13.907Z" },
- { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591, upload-time = "2025-09-14T22:18:16.465Z" },
- { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513, upload-time = "2025-09-14T22:18:20.61Z" },
- { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118, upload-time = "2025-09-14T22:18:17.849Z" },
- { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940, upload-time = "2025-09-14T22:18:19.088Z" },
-]
diff --git a/verify_no_tuple_fallbacks.py b/verify_no_tuple_fallbacks.py
deleted file mode 100644
index eb005b76..00000000
--- a/verify_no_tuple_fallbacks.py
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/usr/bin/env python3
-"""
-Independent verification script to prove ALL tuple fallbacks have been eliminated.
-
-This script searches for any remaining tuple fallback patterns and fails if any are found.
-You can run this script independently to verify the claims.
-"""
-
-import os
-import re
-import sys
-from pathlib import Path
-
-def search_for_tuple_fallbacks():
- """Search for tuple fallback patterns in the codebase."""
-
- # Patterns that indicate tuple fallbacks
- choice_fallback_patterns = [
- r'choices\.get\([^,]+,\s*[^)]+\)', # choices.get(value, fallback)
- r'status_.*\.get\([^,]+,\s*[^)]+\)', # status_colors.get(value, fallback)
- r'category_.*\.get\([^,]+,\s*[^)]+\)', # category_images.get(value, fallback)
- r'sla_hours\.get\([^,]+,\s*[^)]+\)', # sla_hours.get(priority, fallback)
- r'get_tuple_choices\(', # get_tuple_choices function
- r'from_tuple\(', # from_tuple function
- r'convert_tuple_choices\(', # convert_tuple_choices function
- ]
-
- apps_dir = Path('apps')
- if not apps_dir.exists():
- print("❌ Error: apps directory not found")
- return False
-
- found_fallbacks = []
-
- # Search all Python files in apps directory
- for py_file in apps_dir.rglob('*.py'):
- # Skip migrations (they're supposed to have hardcoded values)
- if 'migration' in str(py_file):
- continue
-
- try:
- with open(py_file, 'r', encoding='utf-8') as f:
- content = f.read()
-
- for line_num, line in enumerate(content.split('\n'), 1):
- for pattern in choice_fallback_patterns:
- if re.search(pattern, line):
- found_fallbacks.append({
- 'file': py_file,
- 'line': line_num,
- 'content': line.strip(),
- 'pattern': pattern
- })
- except Exception as e:
- print(f"❌ Error reading {py_file}: {e}")
- continue
-
- # Report results
- if found_fallbacks:
- print(f"❌ FOUND {len(found_fallbacks)} TUPLE FALLBACK PATTERNS:")
- for fallback in found_fallbacks:
- print(f" {fallback['file']}:{fallback['line']} - {fallback['content']}")
- return False
- else:
- print("✅ NO TUPLE FALLBACKS FOUND - All eliminated!")
- return True
-
-def verify_tuple_functions_removed():
- """Verify that tuple fallback functions have been removed."""
-
- # Check that get_tuple_choices is not importable
- try:
- from apps.core.choices.registry import get_tuple_choices
- print("❌ ERROR: get_tuple_choices function still exists!")
- return False
- except ImportError:
- print("✅ get_tuple_choices function successfully removed")
-
- # Check that Rich Choice objects work as primary source
- try:
- from apps.core.choices.registry import get_choices
- print("✅ get_choices function (Rich Choice objects) works as primary source")
- return True
- except ImportError:
- print("❌ ERROR: get_choices function missing!")
- return False
-
-def main():
- """Main verification function."""
- print("=== TUPLE FALLBACK ELIMINATION VERIFICATION ===\n")
-
- # Change to backend directory if needed
- if 'backend' not in os.getcwd():
- backend_dir = Path(__file__).parent
- os.chdir(backend_dir)
- print(f"Changed directory to: {os.getcwd()}")
-
- print("1. Searching for tuple fallback patterns...")
- patterns_clean = search_for_tuple_fallbacks()
-
- print("\n2. Verifying tuple functions removed...")
- functions_removed = verify_tuple_functions_removed()
-
- print("\n=== FINAL RESULT ===")
- if patterns_clean and functions_removed:
- print("🎉 SUCCESS: ALL TUPLE FALLBACKS HAVE BEEN ELIMINATED!")
- return 0
- else:
- print("❌ FAILURE: Tuple fallbacks still exist!")
- return 1
-
-if __name__ == "__main__":
- sys.exit(main())
\ No newline at end of file