This commit is contained in:
pacnpal
2026-01-02 07:58:58 -05:00
parent b243b17af7
commit 1adba1b804
36 changed files with 6345 additions and 6 deletions

View File

@@ -491,6 +491,374 @@ class HybridRideSerializer(serializers.ModelSerializer):
return obj.card_image.image.url
return None
# Computed property
is_closing = serializers.SerializerMethodField()
@extend_schema_field(serializers.BooleanField())
def get_is_closing(self, obj):
"""Check if ride has an announced closing date in the future."""
return obj.is_closing
# Water ride stats fields
water_wetness_level = serializers.SerializerMethodField()
water_splash_height_ft = serializers.SerializerMethodField()
water_has_splash_zone = serializers.SerializerMethodField()
water_boat_capacity = serializers.SerializerMethodField()
water_uses_flume = serializers.SerializerMethodField()
water_rapids_sections = serializers.SerializerMethodField()
@extend_schema_field(serializers.CharField(allow_null=True))
def get_water_wetness_level(self, obj):
try:
if hasattr(obj, "water_stats") and obj.water_stats:
return obj.water_stats.wetness_level
return None
except AttributeError:
return None
@extend_schema_field(serializers.FloatField(allow_null=True))
def get_water_splash_height_ft(self, obj):
try:
if hasattr(obj, "water_stats") and obj.water_stats:
return float(obj.water_stats.splash_height_ft) if obj.water_stats.splash_height_ft else None
return None
except (AttributeError, TypeError):
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_water_has_splash_zone(self, obj):
try:
if hasattr(obj, "water_stats") and obj.water_stats:
return obj.water_stats.has_splash_zone
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_water_boat_capacity(self, obj):
try:
if hasattr(obj, "water_stats") and obj.water_stats:
return obj.water_stats.boat_capacity
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_water_uses_flume(self, obj):
try:
if hasattr(obj, "water_stats") and obj.water_stats:
return obj.water_stats.uses_flume
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_water_rapids_sections(self, obj):
try:
if hasattr(obj, "water_stats") and obj.water_stats:
return obj.water_stats.rapids_sections
return None
except AttributeError:
return None
# Dark ride stats fields
dark_scene_count = serializers.SerializerMethodField()
dark_animatronic_count = serializers.SerializerMethodField()
dark_has_projection_technology = serializers.SerializerMethodField()
dark_is_interactive = serializers.SerializerMethodField()
dark_ride_system = serializers.SerializerMethodField()
dark_uses_practical_effects = serializers.SerializerMethodField()
dark_uses_motion_base = serializers.SerializerMethodField()
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_dark_scene_count(self, obj):
try:
if hasattr(obj, "dark_stats") and obj.dark_stats:
return obj.dark_stats.scene_count
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_dark_animatronic_count(self, obj):
try:
if hasattr(obj, "dark_stats") and obj.dark_stats:
return obj.dark_stats.animatronic_count
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_dark_has_projection_technology(self, obj):
try:
if hasattr(obj, "dark_stats") and obj.dark_stats:
return obj.dark_stats.has_projection_technology
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_dark_is_interactive(self, obj):
try:
if hasattr(obj, "dark_stats") and obj.dark_stats:
return obj.dark_stats.is_interactive
return None
except AttributeError:
return None
@extend_schema_field(serializers.CharField(allow_null=True))
def get_dark_ride_system(self, obj):
try:
if hasattr(obj, "dark_stats") and obj.dark_stats:
return obj.dark_stats.ride_system
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_dark_uses_practical_effects(self, obj):
try:
if hasattr(obj, "dark_stats") and obj.dark_stats:
return obj.dark_stats.uses_practical_effects
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_dark_uses_motion_base(self, obj):
try:
if hasattr(obj, "dark_stats") and obj.dark_stats:
return obj.dark_stats.uses_motion_base
return None
except AttributeError:
return None
# Flat ride stats fields
flat_max_height_ft = serializers.SerializerMethodField()
flat_rotation_speed_rpm = serializers.SerializerMethodField()
flat_swing_angle_degrees = serializers.SerializerMethodField()
flat_motion_type = serializers.SerializerMethodField()
flat_arm_count = serializers.SerializerMethodField()
flat_seats_per_gondola = serializers.SerializerMethodField()
flat_max_g_force = serializers.SerializerMethodField()
@extend_schema_field(serializers.FloatField(allow_null=True))
def get_flat_max_height_ft(self, obj):
try:
if hasattr(obj, "flat_stats") and obj.flat_stats:
return float(obj.flat_stats.max_height_ft) if obj.flat_stats.max_height_ft else None
return None
except (AttributeError, TypeError):
return None
@extend_schema_field(serializers.FloatField(allow_null=True))
def get_flat_rotation_speed_rpm(self, obj):
try:
if hasattr(obj, "flat_stats") and obj.flat_stats:
return float(obj.flat_stats.rotation_speed_rpm) if obj.flat_stats.rotation_speed_rpm else None
return None
except (AttributeError, TypeError):
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_flat_swing_angle_degrees(self, obj):
try:
if hasattr(obj, "flat_stats") and obj.flat_stats:
return obj.flat_stats.swing_angle_degrees
return None
except AttributeError:
return None
@extend_schema_field(serializers.CharField(allow_null=True))
def get_flat_motion_type(self, obj):
try:
if hasattr(obj, "flat_stats") and obj.flat_stats:
return obj.flat_stats.motion_type
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_flat_arm_count(self, obj):
try:
if hasattr(obj, "flat_stats") and obj.flat_stats:
return obj.flat_stats.arm_count
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_flat_seats_per_gondola(self, obj):
try:
if hasattr(obj, "flat_stats") and obj.flat_stats:
return obj.flat_stats.seats_per_gondola
return None
except AttributeError:
return None
@extend_schema_field(serializers.FloatField(allow_null=True))
def get_flat_max_g_force(self, obj):
try:
if hasattr(obj, "flat_stats") and obj.flat_stats:
return float(obj.flat_stats.max_g_force) if obj.flat_stats.max_g_force else None
return None
except (AttributeError, TypeError):
return None
# Kiddie ride stats fields
kiddie_min_age = serializers.SerializerMethodField()
kiddie_max_age = serializers.SerializerMethodField()
kiddie_educational_theme = serializers.SerializerMethodField()
kiddie_character_theme = serializers.SerializerMethodField()
kiddie_guardian_required = serializers.SerializerMethodField()
kiddie_adult_ride_along = serializers.SerializerMethodField()
kiddie_seats_per_vehicle = serializers.SerializerMethodField()
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_kiddie_min_age(self, obj):
try:
if hasattr(obj, "kiddie_stats") and obj.kiddie_stats:
return obj.kiddie_stats.min_age
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_kiddie_max_age(self, obj):
try:
if hasattr(obj, "kiddie_stats") and obj.kiddie_stats:
return obj.kiddie_stats.max_age
return None
except AttributeError:
return None
@extend_schema_field(serializers.CharField(allow_null=True))
def get_kiddie_educational_theme(self, obj):
try:
if hasattr(obj, "kiddie_stats") and obj.kiddie_stats:
return obj.kiddie_stats.educational_theme or None
return None
except AttributeError:
return None
@extend_schema_field(serializers.CharField(allow_null=True))
def get_kiddie_character_theme(self, obj):
try:
if hasattr(obj, "kiddie_stats") and obj.kiddie_stats:
return obj.kiddie_stats.character_theme or None
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_kiddie_guardian_required(self, obj):
try:
if hasattr(obj, "kiddie_stats") and obj.kiddie_stats:
return obj.kiddie_stats.guardian_required
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_kiddie_adult_ride_along(self, obj):
try:
if hasattr(obj, "kiddie_stats") and obj.kiddie_stats:
return obj.kiddie_stats.adult_ride_along
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_kiddie_seats_per_vehicle(self, obj):
try:
if hasattr(obj, "kiddie_stats") and obj.kiddie_stats:
return obj.kiddie_stats.seats_per_vehicle
return None
except AttributeError:
return None
# Transportation stats fields
transport_type = serializers.SerializerMethodField()
transport_route_length_ft = serializers.SerializerMethodField()
transport_stations_count = serializers.SerializerMethodField()
transport_vehicle_capacity = serializers.SerializerMethodField()
transport_vehicles_count = serializers.SerializerMethodField()
transport_round_trip_duration_minutes = serializers.SerializerMethodField()
transport_scenic_highlights = serializers.SerializerMethodField()
transport_is_one_way = serializers.SerializerMethodField()
@extend_schema_field(serializers.CharField(allow_null=True))
def get_transport_type(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return obj.transport_stats.transport_type
return None
except AttributeError:
return None
@extend_schema_field(serializers.FloatField(allow_null=True))
def get_transport_route_length_ft(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return float(obj.transport_stats.route_length_ft) if obj.transport_stats.route_length_ft else None
return None
except (AttributeError, TypeError):
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_transport_stations_count(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return obj.transport_stats.stations_count
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_transport_vehicle_capacity(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return obj.transport_stats.vehicle_capacity
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_transport_vehicles_count(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return obj.transport_stats.vehicles_count
return None
except AttributeError:
return None
@extend_schema_field(serializers.IntegerField(allow_null=True))
def get_transport_round_trip_duration_minutes(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return obj.transport_stats.round_trip_duration_minutes
return None
except AttributeError:
return None
@extend_schema_field(serializers.CharField(allow_null=True))
def get_transport_scenic_highlights(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return obj.transport_stats.scenic_highlights or None
return None
except AttributeError:
return None
@extend_schema_field(serializers.BooleanField(allow_null=True))
def get_transport_is_one_way(self, obj):
try:
if hasattr(obj, "transport_stats") and obj.transport_stats:
return obj.transport_stats.is_one_way
return None
except AttributeError:
return None
class Meta:
model = Ride
fields = [
@@ -504,7 +872,10 @@ class HybridRideSerializer(serializers.ModelSerializer):
"post_closing_status",
# Dates and computed fields
"opening_date",
"opening_date_precision",
"closing_date",
"closing_date_precision",
"is_closing",
"status_since",
"opening_year",
# Park fields
@@ -533,6 +904,9 @@ class HybridRideSerializer(serializers.ModelSerializer):
"capacity_per_hour",
"ride_duration_seconds",
"average_rating",
# Additional classification
"ride_sub_type",
"age_requirement",
# Roller coaster stats
"coaster_height_ft",
"coaster_length_ft",
@@ -548,6 +922,46 @@ class HybridRideSerializer(serializers.ModelSerializer):
"coaster_trains_count",
"coaster_cars_per_train",
"coaster_seats_per_car",
# Water ride stats
"water_wetness_level",
"water_splash_height_ft",
"water_has_splash_zone",
"water_boat_capacity",
"water_uses_flume",
"water_rapids_sections",
# Dark ride stats
"dark_scene_count",
"dark_animatronic_count",
"dark_has_projection_technology",
"dark_is_interactive",
"dark_ride_system",
"dark_uses_practical_effects",
"dark_uses_motion_base",
# Flat ride stats
"flat_max_height_ft",
"flat_rotation_speed_rpm",
"flat_swing_angle_degrees",
"flat_motion_type",
"flat_arm_count",
"flat_seats_per_gondola",
"flat_max_g_force",
# Kiddie ride stats
"kiddie_min_age",
"kiddie_max_age",
"kiddie_educational_theme",
"kiddie_character_theme",
"kiddie_guardian_required",
"kiddie_adult_ride_along",
"kiddie_seats_per_vehicle",
# Transportation stats
"transport_type",
"transport_route_length_ft",
"transport_stations_count",
"transport_vehicle_capacity",
"transport_vehicles_count",
"transport_round_trip_duration_minutes",
"transport_scenic_highlights",
"transport_is_one_way",
# Images
"banner_image_url",
"card_image_url",