mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2026-01-02 01:47:04 -05:00
feat: Implement initial schema and add various API, service, and management command enhancements across the application.
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user