feat: Implement initial schema and add various API, service, and management command enhancements across the application.

This commit is contained in:
pacnpal
2026-01-01 15:13:01 -05:00
parent c95f99ca10
commit b243b17af7
413 changed files with 11164 additions and 17433 deletions

View File

@@ -3,7 +3,6 @@ Custom managers and QuerySets for Rides models.
Optimized queries following Django styleguide patterns.
"""
from django.db.models import Count, F, Prefetch, Q
from apps.core.managers import (
@@ -35,9 +34,7 @@ class RideQuerySet(StatusQuerySet, ReviewableQuerySet):
def family_friendly(self, *, max_height_requirement: int = 42):
"""Filter for family-friendly rides."""
return self.filter(
Q(min_height_in__lte=max_height_requirement) | Q(min_height_in__isnull=True)
)
return self.filter(Q(min_height_in__lte=max_height_requirement) | Q(min_height_in__isnull=True))
def by_park(self, *, park_id: int):
"""Filter rides by park."""
@@ -54,8 +51,7 @@ class RideQuerySet(StatusQuerySet, ReviewableQuerySet):
def with_capacity_info(self):
"""Add capacity-related annotations."""
return self.annotate(
estimated_daily_capacity=F("capacity_per_hour")
* 10, # Assuming 10 operating hours
estimated_daily_capacity=F("capacity_per_hour") * 10, # Assuming 10 operating hours
duration_minutes=F("ride_duration_seconds") / 60.0,
)
@@ -65,9 +61,7 @@ class RideQuerySet(StatusQuerySet, ReviewableQuerySet):
def optimized_for_list(self):
"""Optimize for ride list display."""
return self.select_related(
"park", "park_area", "manufacturer", "designer", "ride_model"
).with_review_stats()
return self.select_related("park", "park_area", "manufacturer", "designer", "ride_model").with_review_stats()
def optimized_for_detail(self):
"""Optimize for ride detail display."""
@@ -94,9 +88,7 @@ class RideQuerySet(StatusQuerySet, ReviewableQuerySet):
def with_coaster_stats(self):
"""Always prefetch coaster_stats for roller coaster queries."""
return self.select_related(
"park", "manufacturer", "ride_model"
).prefetch_related("coaster_stats")
return self.select_related("park", "manufacturer", "ride_model").prefetch_related("coaster_stats")
def for_map_display(self):
"""Optimize for map display."""
@@ -129,14 +121,12 @@ class RideQuerySet(StatusQuerySet, ReviewableQuerySet):
if min_height:
queryset = queryset.filter(
Q(rollercoaster_stats__height_ft__gte=min_height)
| Q(min_height_in__gte=min_height)
Q(rollercoaster_stats__height_ft__gte=min_height) | Q(min_height_in__gte=min_height)
)
if max_height:
queryset = queryset.filter(
Q(rollercoaster_stats__height_ft__lte=max_height)
| Q(max_height_in__lte=max_height)
Q(rollercoaster_stats__height_ft__lte=max_height) | Q(max_height_in__lte=max_height)
)
if min_speed:
@@ -146,10 +136,7 @@ class RideQuerySet(StatusQuerySet, ReviewableQuerySet):
if inversions:
queryset = queryset.filter(rollercoaster_stats__inversions__gt=0)
else:
queryset = queryset.filter(
Q(rollercoaster_stats__inversions=0)
| Q(rollercoaster_stats__isnull=True)
)
queryset = queryset.filter(Q(rollercoaster_stats__inversions=0) | Q(rollercoaster_stats__isnull=True))
return queryset
@@ -167,9 +154,7 @@ class RideManager(StatusManager, ReviewableManager):
return self.get_queryset().thrill_rides()
def family_friendly(self, *, max_height_requirement: int = 42):
return self.get_queryset().family_friendly(
max_height_requirement=max_height_requirement
)
return self.get_queryset().family_friendly(max_height_requirement=max_height_requirement)
def by_park(self, *, park_id: int):
return self.get_queryset().by_park(park_id=park_id)
@@ -203,9 +188,7 @@ class RideModelQuerySet(BaseQuerySet):
"""Add count of rides using this model."""
return self.annotate(
ride_count=Count("rides", distinct=True),
operating_rides_count=Count(
"rides", filter=Q(rides__status="OPERATING"), distinct=True
),
operating_rides_count=Count("rides", filter=Q(rides__status="OPERATING"), distinct=True),
)
def popular_models(self, *, min_installations: int = 5):
@@ -260,9 +243,7 @@ class RideReviewManager(BaseManager):
return self.get_queryset().for_ride(ride_id=ride_id)
def by_rating_range(self, *, min_rating: int = 1, max_rating: int = 10):
return self.get_queryset().by_rating_range(
min_rating=min_rating, max_rating=max_rating
)
return self.get_queryset().by_rating_range(min_rating=min_rating, max_rating=max_rating)
class RollerCoasterStatsQuerySet(BaseQuerySet):