Files
thrillwiki_django_no_react/backend/apps/rides/choices.py

648 lines
23 KiB
Python

"""
Rich Choice Objects for Rides Domain
This module defines all choice objects for the rides domain, replacing
the legacy tuple-based choices with rich choice objects.
"""
from apps.core.choices import ChoiceCategory, RichChoice
from apps.core.choices.registry import register_choices
# Ride Category Choices
RIDE_CATEGORIES = [
RichChoice(
value="RC",
label="Roller Coaster",
description="Thrill rides with tracks featuring hills, loops, and high speeds",
metadata={"color": "red", "icon": "roller-coaster", "css_class": "bg-red-100 text-red-800", "sort_order": 1},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="DR",
label="Dark Ride",
description="Indoor rides with themed environments and storytelling",
metadata={
"color": "purple",
"icon": "dark-ride",
"css_class": "bg-purple-100 text-purple-800",
"sort_order": 2,
},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="FR",
label="Flat Ride",
description="Rides that move along a generally flat plane with spinning, swinging, or bouncing motions",
metadata={"color": "blue", "icon": "flat-ride", "css_class": "bg-blue-100 text-blue-800", "sort_order": 3},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="WR",
label="Water Ride",
description="Rides that incorporate water elements like splashing, floating, or getting wet",
metadata={"color": "cyan", "icon": "water-ride", "css_class": "bg-cyan-100 text-cyan-800", "sort_order": 4},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="TR",
label="Transport Ride",
description="Rides primarily designed for transportation around the park",
metadata={"color": "green", "icon": "transport", "css_class": "bg-green-100 text-green-800", "sort_order": 5},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="OT",
label="Other",
description="Rides that don't fit into standard categories",
metadata={"color": "gray", "icon": "other", "css_class": "bg-gray-100 text-gray-800", "sort_order": 6},
category=ChoiceCategory.CLASSIFICATION,
),
]
# Ride Status Choices
RIDE_STATUSES = [
RichChoice(
value="OPERATING",
label="Operating",
description="Ride is currently open and operating normally",
metadata={
"color": "green",
"icon": "check-circle",
"css_class": "bg-green-100 text-green-800",
"sort_order": 1,
"can_transition_to": [
"CLOSED_TEMP",
"SBNO",
"CLOSING",
],
"requires_moderator": False,
"is_final": False,
"is_initial": True,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="CLOSED_TEMP",
label="Temporarily Closed",
description="Ride is temporarily closed for maintenance, weather, or other short-term reasons",
metadata={
"color": "yellow",
"icon": "pause-circle",
"css_class": "bg-yellow-100 text-yellow-800",
"sort_order": 2,
"can_transition_to": [
"SBNO",
"CLOSING",
],
"requires_moderator": False,
"is_final": False,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="SBNO",
label="Standing But Not Operating",
description="Ride structure remains but is not currently operating",
metadata={
"color": "orange",
"icon": "stop-circle",
"css_class": "bg-orange-100 text-orange-800",
"sort_order": 3,
"can_transition_to": [
"CLOSED_PERM",
"DEMOLISHED",
"RELOCATED",
],
"requires_moderator": True,
"is_final": False,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="CLOSING",
label="Closing",
description="Ride is scheduled to close permanently",
metadata={
"color": "red",
"icon": "x-circle",
"css_class": "bg-red-100 text-red-800",
"sort_order": 4,
"can_transition_to": [
"CLOSED_PERM",
"SBNO",
],
"requires_moderator": True,
"is_final": False,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="CLOSED_PERM",
label="Permanently Closed",
description="Ride has been permanently closed and will not reopen",
metadata={
"color": "red",
"icon": "x-circle",
"css_class": "bg-red-100 text-red-800",
"sort_order": 5,
"can_transition_to": [
"DEMOLISHED",
"RELOCATED",
],
"requires_moderator": True,
"is_final": False,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="UNDER_CONSTRUCTION",
label="Under Construction",
description="Ride is currently being built or undergoing major renovation",
metadata={
"color": "blue",
"icon": "tool",
"css_class": "bg-blue-100 text-blue-800",
"sort_order": 6,
"can_transition_to": [
"OPERATING",
],
"requires_moderator": False,
"is_final": False,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="DEMOLISHED",
label="Demolished",
description="Ride has been completely removed and demolished",
metadata={
"color": "gray",
"icon": "trash",
"css_class": "bg-gray-100 text-gray-800",
"sort_order": 7,
"can_transition_to": [],
"requires_moderator": True,
"is_final": True,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="RELOCATED",
label="Relocated",
description="Ride has been moved to a different location",
metadata={
"color": "purple",
"icon": "arrow-right",
"css_class": "bg-purple-100 text-purple-800",
"sort_order": 8,
"can_transition_to": [],
"requires_moderator": True,
"is_final": True,
},
category=ChoiceCategory.STATUS,
),
]
# Post-Closing Status Choices
POST_CLOSING_STATUSES = [
RichChoice(
value="SBNO",
label="Standing But Not Operating",
description="Ride structure remains but is not operating after closure",
metadata={
"color": "orange",
"icon": "stop-circle",
"css_class": "bg-orange-100 text-orange-800",
"sort_order": 1,
},
category=ChoiceCategory.STATUS,
),
RichChoice(
value="CLOSED_PERM",
label="Permanently Closed",
description="Ride has been permanently closed after the closing date",
metadata={"color": "red", "icon": "x-circle", "css_class": "bg-red-100 text-red-800", "sort_order": 2},
category=ChoiceCategory.STATUS,
),
]
# Roller Coaster Track Material Choices
TRACK_MATERIALS = [
RichChoice(
value="STEEL",
label="Steel",
description="Modern steel track construction providing smooth rides and complex layouts",
metadata={"color": "gray", "icon": "steel", "css_class": "bg-gray-100 text-gray-800", "sort_order": 1},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="WOOD",
label="Wood",
description="Traditional wooden track construction providing classic coaster experience",
metadata={"color": "amber", "icon": "wood", "css_class": "bg-amber-100 text-amber-800", "sort_order": 2},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="HYBRID",
label="Hybrid",
description="Combination of steel and wooden construction elements",
metadata={"color": "orange", "icon": "hybrid", "css_class": "bg-orange-100 text-orange-800", "sort_order": 3},
category=ChoiceCategory.TECHNICAL,
),
]
# Roller Coaster Type Choices
COASTER_TYPES = [
RichChoice(
value="SITDOWN",
label="Sit Down",
description="Traditional seated roller coaster with riders sitting upright",
metadata={"color": "blue", "icon": "sitdown", "css_class": "bg-blue-100 text-blue-800", "sort_order": 1},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="INVERTED",
label="Inverted",
description="Coaster where riders' feet dangle freely below the track",
metadata={"color": "purple", "icon": "inverted", "css_class": "bg-purple-100 text-purple-800", "sort_order": 2},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="FLYING",
label="Flying",
description="Riders lie face-down in a flying position",
metadata={"color": "sky", "icon": "flying", "css_class": "bg-sky-100 text-sky-800", "sort_order": 3},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="STANDUP",
label="Stand Up",
description="Riders stand upright during the ride",
metadata={"color": "green", "icon": "standup", "css_class": "bg-green-100 text-green-800", "sort_order": 4},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="WING",
label="Wing",
description="Riders sit on either side of the track with nothing above or below",
metadata={"color": "indigo", "icon": "wing", "css_class": "bg-indigo-100 text-indigo-800", "sort_order": 5},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="DIVE",
label="Dive",
description="Features a vertical or near-vertical drop as the main element",
metadata={"color": "red", "icon": "dive", "css_class": "bg-red-100 text-red-800", "sort_order": 6},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="FAMILY",
label="Family",
description="Designed for riders of all ages with moderate thrills",
metadata={
"color": "emerald",
"icon": "family",
"css_class": "bg-emerald-100 text-emerald-800",
"sort_order": 7,
},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="WILD_MOUSE",
label="Wild Mouse",
description="Compact coaster with sharp turns and sudden drops",
metadata={"color": "yellow", "icon": "mouse", "css_class": "bg-yellow-100 text-yellow-800", "sort_order": 8},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="SPINNING",
label="Spinning",
description="Cars rotate freely during the ride",
metadata={"color": "pink", "icon": "spinning", "css_class": "bg-pink-100 text-pink-800", "sort_order": 9},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="FOURTH_DIMENSION",
label="4th Dimension",
description="Seats rotate independently of the track direction",
metadata={"color": "violet", "icon": "4d", "css_class": "bg-violet-100 text-violet-800", "sort_order": 10},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="OTHER",
label="Other",
description="Coaster type that doesn't fit standard classifications",
metadata={"color": "gray", "icon": "other", "css_class": "bg-gray-100 text-gray-800", "sort_order": 11},
category=ChoiceCategory.CLASSIFICATION,
),
]
# Propulsion System Choices
PROPULSION_SYSTEMS = [
RichChoice(
value="CHAIN",
label="Chain Lift",
description="Traditional chain lift system to pull trains up the lift hill",
metadata={"color": "gray", "icon": "chain", "css_class": "bg-gray-100 text-gray-800", "sort_order": 1},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="LSM",
label="LSM Launch",
description="Linear Synchronous Motor launch system using magnetic propulsion",
metadata={"color": "blue", "icon": "lightning", "css_class": "bg-blue-100 text-blue-800", "sort_order": 2},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="HYDRAULIC",
label="Hydraulic Launch",
description="High-pressure hydraulic launch system for rapid acceleration",
metadata={"color": "red", "icon": "hydraulic", "css_class": "bg-red-100 text-red-800", "sort_order": 3},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="GRAVITY",
label="Gravity",
description="Uses gravity and momentum without mechanical lift systems",
metadata={"color": "green", "icon": "gravity", "css_class": "bg-green-100 text-green-800", "sort_order": 4},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="OTHER",
label="Other",
description="Propulsion system that doesn't fit standard categories",
metadata={"color": "gray", "icon": "other", "css_class": "bg-gray-100 text-gray-800", "sort_order": 5},
category=ChoiceCategory.TECHNICAL,
),
]
# Ride Model Target Market Choices
TARGET_MARKETS = [
RichChoice(
value="FAMILY",
label="Family",
description="Designed for families with children, moderate thrills",
metadata={"color": "green", "icon": "family", "css_class": "bg-green-100 text-green-800", "sort_order": 1},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="THRILL",
label="Thrill",
description="High-intensity rides for thrill seekers",
metadata={"color": "red", "icon": "thrill", "css_class": "bg-red-100 text-red-800", "sort_order": 2},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="EXTREME",
label="Extreme",
description="Maximum intensity rides for extreme thrill seekers",
metadata={"color": "purple", "icon": "extreme", "css_class": "bg-purple-100 text-purple-800", "sort_order": 3},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="KIDDIE",
label="Kiddie",
description="Gentle rides designed specifically for young children",
metadata={"color": "yellow", "icon": "kiddie", "css_class": "bg-yellow-100 text-yellow-800", "sort_order": 4},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="ALL_AGES",
label="All Ages",
description="Suitable for riders of all ages and thrill preferences",
metadata={"color": "blue", "icon": "all-ages", "css_class": "bg-blue-100 text-blue-800", "sort_order": 5},
category=ChoiceCategory.CLASSIFICATION,
),
]
# Ride Model Photo Type Choices
PHOTO_TYPES = [
RichChoice(
value="PROMOTIONAL",
label="Promotional",
description="Marketing and promotional photos of the ride model",
metadata={"color": "blue", "icon": "camera", "css_class": "bg-blue-100 text-blue-800", "sort_order": 1},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="TECHNICAL",
label="Technical Drawing",
description="Technical drawings and engineering diagrams",
metadata={"color": "gray", "icon": "blueprint", "css_class": "bg-gray-100 text-gray-800", "sort_order": 2},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="INSTALLATION",
label="Installation Example",
description="Photos of actual installations of this ride model",
metadata={
"color": "green",
"icon": "installation",
"css_class": "bg-green-100 text-green-800",
"sort_order": 3,
},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="RENDERING",
label="3D Rendering",
description="Computer-generated 3D renderings of the ride model",
metadata={"color": "purple", "icon": "cube", "css_class": "bg-purple-100 text-purple-800", "sort_order": 4},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="CATALOG",
label="Catalog Image",
description="Official catalog and brochure images",
metadata={"color": "orange", "icon": "catalog", "css_class": "bg-orange-100 text-orange-800", "sort_order": 5},
category=ChoiceCategory.CLASSIFICATION,
),
]
# Technical Specification Category Choices
SPEC_CATEGORIES = [
RichChoice(
value="DIMENSIONS",
label="Dimensions",
description="Physical dimensions and measurements",
metadata={"color": "blue", "icon": "ruler", "css_class": "bg-blue-100 text-blue-800", "sort_order": 1},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="PERFORMANCE",
label="Performance",
description="Performance specifications and capabilities",
metadata={"color": "red", "icon": "speedometer", "css_class": "bg-red-100 text-red-800", "sort_order": 2},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="CAPACITY",
label="Capacity",
description="Rider capacity and throughput specifications",
metadata={"color": "green", "icon": "users", "css_class": "bg-green-100 text-green-800", "sort_order": 3},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="SAFETY",
label="Safety Features",
description="Safety systems and features",
metadata={"color": "yellow", "icon": "shield", "css_class": "bg-yellow-100 text-yellow-800", "sort_order": 4},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="ELECTRICAL",
label="Electrical Requirements",
description="Power and electrical system requirements",
metadata={
"color": "purple",
"icon": "lightning",
"css_class": "bg-purple-100 text-purple-800",
"sort_order": 5,
},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="FOUNDATION",
label="Foundation Requirements",
description="Foundation and structural requirements",
metadata={"color": "gray", "icon": "foundation", "css_class": "bg-gray-100 text-gray-800", "sort_order": 6},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="MAINTENANCE",
label="Maintenance",
description="Maintenance requirements and procedures",
metadata={"color": "orange", "icon": "wrench", "css_class": "bg-orange-100 text-orange-800", "sort_order": 7},
category=ChoiceCategory.TECHNICAL,
),
RichChoice(
value="OTHER",
label="Other",
description="Other technical specifications",
metadata={"color": "gray", "icon": "other", "css_class": "bg-gray-100 text-gray-800", "sort_order": 8},
category=ChoiceCategory.TECHNICAL,
),
]
# Company Role Choices for Rides Domain (MANUFACTURER and DESIGNER only)
RIDES_COMPANY_ROLES = [
RichChoice(
value="MANUFACTURER",
label="Ride Manufacturer",
description="Company that designs and builds ride hardware and systems",
metadata={
"color": "blue",
"icon": "factory",
"css_class": "bg-blue-100 text-blue-800",
"sort_order": 1,
"domain": "rides",
"permissions": ["manage_ride_models", "view_manufacturing"],
"url_pattern": "/rides/manufacturers/{slug}/",
},
category=ChoiceCategory.CLASSIFICATION,
),
RichChoice(
value="DESIGNER",
label="Ride Designer",
description="Company that specializes in ride design, layout, and engineering",
metadata={
"color": "purple",
"icon": "design",
"css_class": "bg-purple-100 text-purple-800",
"sort_order": 2,
"domain": "rides",
"permissions": ["manage_ride_designs", "view_design_specs"],
"url_pattern": "/rides/designers/{slug}/",
},
category=ChoiceCategory.CLASSIFICATION,
),
]
def register_rides_choices():
"""Register all rides domain choices with the global registry"""
register_choices(
name="categories",
choices=RIDE_CATEGORIES,
domain="rides",
description="Ride category classifications",
metadata={"domain": "rides", "type": "category"},
)
register_choices(
name="statuses",
choices=RIDE_STATUSES,
domain="rides",
description="Ride operational status options",
metadata={"domain": "rides", "type": "status"},
)
register_choices(
name="post_closing_statuses",
choices=POST_CLOSING_STATUSES,
domain="rides",
description="Status options after ride closure",
metadata={"domain": "rides", "type": "post_closing_status"},
)
register_choices(
name="track_materials",
choices=TRACK_MATERIALS,
domain="rides",
description="Roller coaster track material types",
metadata={"domain": "rides", "type": "track_material", "applies_to": "roller_coasters"},
)
register_choices(
name="coaster_types",
choices=COASTER_TYPES,
domain="rides",
description="Roller coaster type classifications",
metadata={"domain": "rides", "type": "coaster_type", "applies_to": "roller_coasters"},
)
register_choices(
name="propulsion_systems",
choices=PROPULSION_SYSTEMS,
domain="rides",
description="Roller coaster propulsion and lift systems",
metadata={"domain": "rides", "type": "propulsion_system", "applies_to": "roller_coasters"},
)
register_choices(
name="target_markets",
choices=TARGET_MARKETS,
domain="rides",
description="Target market classifications for ride models",
metadata={"domain": "rides", "type": "target_market", "applies_to": "ride_models"},
)
register_choices(
name="photo_types",
choices=PHOTO_TYPES,
domain="rides",
description="Photo type classifications for ride model images",
metadata={"domain": "rides", "type": "photo_type", "applies_to": "ride_model_photos"},
)
register_choices(
name="spec_categories",
choices=SPEC_CATEGORIES,
domain="rides",
description="Technical specification category classifications",
metadata={"domain": "rides", "type": "spec_category", "applies_to": "ride_model_specs"},
)
register_choices(
name="company_roles",
choices=RIDES_COMPANY_ROLES,
domain="rides",
description="Company role classifications for rides domain (MANUFACTURER and DESIGNER only)",
metadata={"domain": "rides", "type": "company_role"},
)
# Auto-register choices when module is imported
register_rides_choices()