mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 16:51:07 -05:00
fixing the home page
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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(
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user