fixing the home page

This commit is contained in:
pacnpal
2024-11-06 19:09:56 +00:00
parent 3026ab55a0
commit 4899d08cfb
8 changed files with 28 additions and 16 deletions

View File

@@ -47,8 +47,8 @@ class Park(HistoricalModel):
average_rating = models.DecimalField( average_rating = models.DecimalField(
max_digits=3, decimal_places=2, null=True, blank=True max_digits=3, decimal_places=2, null=True, blank=True
) )
total_rides = models.IntegerField(null=True, blank=True) ride_count = models.IntegerField(null=True, blank=True)
total_roller_coasters = models.IntegerField(null=True, blank=True) coaster_count = models.IntegerField(null=True, blank=True)
# Relationships # Relationships
owner = models.ForeignKey( owner = models.ForeignKey(

View File

@@ -6,22 +6,22 @@ from rides.models import Ride
from .models import Park from .models import Park
def update_park_ride_counts(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') operating_rides = Q(status='OPERATING')
# Count total operating rides # 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 # Count total operating roller coasters
total_coasters = park.rides.filter( coaster_count = park.rides.filter(
operating_rides, operating_rides,
category='RC' category='RC'
).count() ).count()
# Update park counts # Update park counts
Park.objects.filter(id=park.id).update( Park.objects.filter(id=park.id).update(
total_rides=total_rides, ride_count=ride_count,
total_roller_coasters=total_coasters coaster_count=coaster_count
) )
@receiver(post_save, sender=Ride) @receiver(post_save, sender=Ride)

View File

@@ -3,7 +3,7 @@ from django.views.generic import DetailView, ListView, CreateView, UpdateView
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.core.serializers.json import DjangoJSONEncoder from django.core.serializers.json import DjangoJSONEncoder
from django.urls import reverse 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.auth.mixins import LoginRequiredMixin
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib import messages from django.contrib import messages
@@ -18,6 +18,7 @@ from moderation.models import EditSubmission
from media.models import Photo from media.models import Photo
from location.models import Location from location.models import Location
from reviews.models import Review # Import the Review model from reviews.models import Review # Import the Review model
from analytics.models import PageView # Import PageView for tracking views
def location_search(request): def location_search(request):
@@ -131,6 +132,13 @@ class ParkListView(ListView):
if statuses: if statuses:
queryset = queryset.filter(status__in=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() return queryset.distinct()
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):

View File

@@ -43,7 +43,7 @@
<a href="{% url 'rides:all_rides' %}" <a href="{% url 'rides:all_rides' %}"
class="p-6 text-center transition-transform transform bg-white rounded-lg shadow-lg dark:bg-gray-800 hover:-translate-y-1 hover:shadow-xl"> class="p-6 text-center transition-transform transform bg-white rounded-lg shadow-lg dark:bg-gray-800 hover:-translate-y-1 hover:shadow-xl">
<div class="mb-2 text-4xl font-bold text-blue-600 dark:text-blue-400"> <div class="mb-2 text-4xl font-bold text-blue-600 dark:text-blue-400">
{{ stats.total_rides }} {{ stats.ride_count }}
</div> </div>
<div class="text-xl text-gray-600 dark:text-gray-300"> <div class="text-xl text-gray-600 dark:text-gray-300">
Attractions Attractions
@@ -54,7 +54,7 @@
<a href="{% url 'rides:roller_coasters' %}" <a href="{% url 'rides:roller_coasters' %}"
class="p-6 text-center transition-transform transform bg-white rounded-lg shadow-lg dark:bg-gray-800 hover:-translate-y-1 hover:shadow-xl"> class="p-6 text-center transition-transform transform bg-white rounded-lg shadow-lg dark:bg-gray-800 hover:-translate-y-1 hover:shadow-xl">
<div class="mb-2 text-4xl font-bold text-blue-600 dark:text-blue-400"> <div class="mb-2 text-4xl font-bold text-blue-600 dark:text-blue-400">
{{ stats.total_roller_coasters }} {{ stats.coaster_count }}
</div> </div>
<div class="text-xl text-gray-600 dark:text-gray-300"> <div class="text-xl text-gray-600 dark:text-gray-300">
Roller Coasters Roller Coasters
@@ -83,13 +83,15 @@
{{ park.name }} {{ park.name }}
</div> </div>
<div class="text-sm text-gray-200"> <div class="text-sm text-gray-200">
{{ park.location }} {{ park.ride_count }} rides, {{ park.coaster_count }} coasters
</div> </div>
{% if park.average_rating %} {% if park.average_rating %}
<div class="flex items-center mt-1 text-yellow-400"> <div class="absolute top-0 right-0 p-2 text-yellow-400">
<span class="mr-1"></span> <span class="mr-1"></span>
<span>{{ park.average_rating|floatformat:1 }}/10</span> <span>{{ park.average_rating|floatformat:1 }}/10</span>
</div> </div>
{% else %}
<div class="text-sm text-gray-400">Rating not available</div>
{% endif %} {% endif %}
</div> </div>
</a> </a>
@@ -125,6 +127,8 @@
<span class="mr-1"></span> <span class="mr-1"></span>
<span>{{ ride.average_rating|floatformat:1 }}/10</span> <span>{{ ride.average_rating|floatformat:1 }}/10</span>
</div> </div>
{% else %}
<div class="text-sm text-gray-400">Rating not available</div>
{% endif %} {% endif %}
</div> </div>
</a> </a>
@@ -177,9 +181,9 @@
{{ item.name }} {{ item.name }}
</div> </div>
<div class="text-sm text-gray-200"> <div class="text-sm text-gray-200">
{{ item.location }} {{ item.ride_count }} rides, {{ item.coaster_count }} coasters
</div> </div>
<div class="flex items-center mt-1 text-yellow-400"> <div class="absolute top-0 right-0 p-2 text-yellow-400">
<span class="mr-1"></span> <span class="mr-1"></span>
<span>{{ item.average_rating|floatformat:1 }}/10</span> <span>{{ item.average_rating|floatformat:1 }}/10</span>
</div> </div>

View File

@@ -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"> 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">
<dt class="text-sm font-semibold text-gray-900 sm:text-base lg:text-lg dark:text-white">Total Rides</dt> <dt class="text-sm font-semibold text-gray-900 sm:text-base lg:text-lg dark:text-white">Total Rides</dt>
<dd class="mt-1 text-xl font-bold text-sky-900 hover:text-sky-800 sm:text-2xl lg:text-3xl dark:text-sky-400 dark:hover:text-sky-300"> <dd class="mt-1 text-xl font-bold text-sky-900 hover:text-sky-800 sm:text-2xl lg:text-3xl dark:text-sky-400 dark:hover:text-sky-300">
{{ park.total_rides|default:"N/A" }} {{ park.ride_count|default:"N/A" }}
</dd> </dd>
</a> </a>
@@ -102,7 +102,7 @@
<div class="flex flex-col items-center justify-center p-3 text-center bg-white rounded-lg shadow-lg dark:bg-gray-800"> <div class="flex flex-col items-center justify-center p-3 text-center bg-white rounded-lg shadow-lg dark:bg-gray-800">
<dt class="text-sm font-semibold text-gray-900 sm:text-base lg:text-lg dark:text-white">Roller Coasters</dt> <dt class="text-sm font-semibold text-gray-900 sm:text-base lg:text-lg dark:text-white">Roller Coasters</dt>
<dd class="mt-1 text-xl font-bold text-sky-900 hover:text-sky-800 sm:text-2xl lg:text-3xl dark:text-sky-400 dark:hover:text-sky-300"> <dd class="mt-1 text-xl font-bold text-sky-900 hover:text-sky-800 sm:text-2xl lg:text-3xl dark:text-sky-400 dark:hover:text-sky-300">
{{ park.total_roller_coasters|default:"N/A" }} {{ park.coaster_count|default:"N/A" }}
</dd> </dd>
</div> </div>
</div> </div>