diff --git a/parks/__pycache__/models.cpython-312.pyc b/parks/__pycache__/models.cpython-312.pyc index cee51a3d..a2667cdd 100644 Binary files a/parks/__pycache__/models.cpython-312.pyc and b/parks/__pycache__/models.cpython-312.pyc differ diff --git a/parks/__pycache__/signals.cpython-312.pyc b/parks/__pycache__/signals.cpython-312.pyc index ff678b54..88adfcc3 100644 Binary files a/parks/__pycache__/signals.cpython-312.pyc and b/parks/__pycache__/signals.cpython-312.pyc differ diff --git a/parks/__pycache__/views.cpython-312.pyc b/parks/__pycache__/views.cpython-312.pyc index 519db473..823c958d 100644 Binary files a/parks/__pycache__/views.cpython-312.pyc and b/parks/__pycache__/views.cpython-312.pyc differ diff --git a/parks/models.py b/parks/models.py index 164a258b..f99819a5 100644 --- a/parks/models.py +++ b/parks/models.py @@ -47,8 +47,8 @@ class Park(HistoricalModel): average_rating = models.DecimalField( max_digits=3, decimal_places=2, null=True, blank=True ) - total_rides = models.IntegerField(null=True, blank=True) - total_roller_coasters = models.IntegerField(null=True, blank=True) + ride_count = models.IntegerField(null=True, blank=True) + coaster_count = models.IntegerField(null=True, blank=True) # Relationships owner = models.ForeignKey( diff --git a/parks/signals.py b/parks/signals.py index b7500852..acd07a78 100644 --- a/parks/signals.py +++ b/parks/signals.py @@ -6,22 +6,22 @@ from rides.models import Ride from .models import Park def update_park_ride_counts(park): - """Update total_rides and total_roller_coasters for a park""" + """Update ride_count and coaster_count for a park""" operating_rides = Q(status='OPERATING') # Count total operating rides - total_rides = park.rides.filter(operating_rides).count() + ride_count = park.rides.filter(operating_rides).count() # Count total operating roller coasters - total_coasters = park.rides.filter( + coaster_count = park.rides.filter( operating_rides, category='RC' ).count() # Update park counts Park.objects.filter(id=park.id).update( - total_rides=total_rides, - total_roller_coasters=total_coasters + ride_count=ride_count, + coaster_count=coaster_count ) @receiver(post_save, sender=Ride) diff --git a/parks/views.py b/parks/views.py index 81fae91f..fcf7d756 100644 --- a/parks/views.py +++ b/parks/views.py @@ -3,7 +3,7 @@ from django.views.generic import DetailView, ListView, CreateView, UpdateView from django.shortcuts import get_object_or_404, render from django.core.serializers.json import DjangoJSONEncoder from django.urls import reverse -from django.db.models import Q +from django.db.models import Q, Avg, Count from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType from django.contrib import messages @@ -18,6 +18,7 @@ from moderation.models import EditSubmission from media.models import Photo from location.models import Location from reviews.models import Review # Import the Review model +from analytics.models import PageView # Import PageView for tracking views def location_search(request): @@ -131,6 +132,13 @@ class ParkListView(ListView): if statuses: queryset = queryset.filter(status__in=statuses) + # Annotate with ride count, coaster count, and average review rating + queryset = queryset.annotate( + ride_count=Count('rides'), + coaster_count=Count('rides', filter=Q(rides__type='coaster')), + average_rating=Avg('reviews__rating') + ) + return queryset.distinct() def get_context_data(self, **kwargs): diff --git a/templates/home.html b/templates/home.html index 07f668da..26309f4e 100644 --- a/templates/home.html +++ b/templates/home.html @@ -43,7 +43,7 @@
- {{ stats.total_rides }} + {{ stats.ride_count }}
Attractions @@ -54,7 +54,7 @@
- {{ stats.total_roller_coasters }} + {{ stats.coaster_count }}
Roller Coasters @@ -83,13 +83,15 @@ {{ park.name }}
- {{ park.location }} + {{ park.ride_count }} rides, {{ park.coaster_count }} coasters
{% if park.average_rating %} -
+
{{ park.average_rating|floatformat:1 }}/10
+ {% else %} +
Rating not available
{% endif %}
@@ -125,6 +127,8 @@ {{ ride.average_rating|floatformat:1 }}/10
+ {% else %} +
Rating not available
{% endif %} @@ -177,9 +181,9 @@ {{ item.name }}
- {{ item.location }} + {{ item.ride_count }} rides, {{ item.coaster_count }} coasters
-
+
{{ item.average_rating|floatformat:1 }}/10
diff --git a/templates/parks/park_detail.html b/templates/parks/park_detail.html index ae8d7544..051b834a 100644 --- a/templates/parks/park_detail.html +++ b/templates/parks/park_detail.html @@ -94,7 +94,7 @@ class="flex flex-col items-center justify-center p-3 text-center transition-transform bg-white rounded-lg shadow-lg hover:scale-[1.02] dark:bg-gray-800">
Total Rides
- {{ park.total_rides|default:"N/A" }} + {{ park.ride_count|default:"N/A" }}
@@ -102,7 +102,7 @@
Roller Coasters
- {{ park.total_roller_coasters|default:"N/A" }} + {{ park.coaster_count|default:"N/A" }}