mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 15:31:08 -05:00
139 lines
5.5 KiB
Python
139 lines
5.5 KiB
Python
from django.shortcuts import render
|
|
from django.views.generic import TemplateView
|
|
from django.db.models import Count, Q, Value, CharField
|
|
from django.db.models.functions import Concat
|
|
from django.core.cache import cache
|
|
from parks.models import Park
|
|
from rides.models import Ride
|
|
from companies.models import Company, Manufacturer
|
|
from analytics.models import PageView
|
|
from django.conf import settings
|
|
import os
|
|
import secrets
|
|
|
|
|
|
def handler404(request, exception):
|
|
return render(request, '404.html', status=404)
|
|
|
|
def handler500(request):
|
|
return render(request, '500.html', status=500)
|
|
|
|
class HomeView(TemplateView):
|
|
template_name = 'home.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
|
|
# Get stats
|
|
context['stats'] = {
|
|
'total_parks': Park.objects.count(),
|
|
'ride_count': Ride.objects.count(),
|
|
'coaster_count': Ride.objects.filter(category='RC').count(),
|
|
}
|
|
|
|
# Try to get trending items from cache first
|
|
trending_parks = cache.get('trending_parks')
|
|
trending_rides = cache.get('trending_rides')
|
|
|
|
# If not in cache, get them directly and cache them
|
|
if trending_parks is None:
|
|
try:
|
|
trending_parks = list(PageView.get_trending_items(Park, hours=24, limit=10))
|
|
if trending_parks:
|
|
cache.set('trending_parks', trending_parks, 3600) # Cache for 1 hour
|
|
else:
|
|
# Fallback to highest rated parks if no trending data
|
|
trending_parks = Park.objects.exclude(
|
|
average_rating__isnull=True
|
|
).order_by('-average_rating')[:10]
|
|
except Exception:
|
|
# Fallback to highest rated parks if trending calculation fails
|
|
trending_parks = Park.objects.exclude(
|
|
average_rating__isnull=True
|
|
).order_by('-average_rating')[:10]
|
|
|
|
if trending_rides is None:
|
|
try:
|
|
trending_rides = list(PageView.get_trending_items(Ride, hours=24, limit=10))
|
|
if trending_rides:
|
|
cache.set('trending_rides', trending_rides, 3600) # Cache for 1 hour
|
|
else:
|
|
# Fallback to highest rated rides if no trending data
|
|
trending_rides = Ride.objects.exclude(
|
|
average_rating__isnull=True
|
|
).order_by('-average_rating')[:10]
|
|
except Exception:
|
|
# Fallback to highest rated rides if trending calculation fails
|
|
trending_rides = Ride.objects.exclude(
|
|
average_rating__isnull=True
|
|
).order_by('-average_rating')[:10]
|
|
|
|
# Get highest rated items (mix of parks and rides)
|
|
highest_rated_parks = list(Park.objects.exclude(
|
|
average_rating__isnull=True
|
|
).order_by('-average_rating')[:20]) # Get more items to randomly select from
|
|
|
|
highest_rated_rides = list(Ride.objects.exclude(
|
|
average_rating__isnull=True
|
|
).order_by('-average_rating')[:20]) # Get more items to randomly select from
|
|
|
|
# Combine and shuffle highest rated items
|
|
all_highest_rated = highest_rated_parks + highest_rated_rides
|
|
secrets.SystemRandom().shuffle(all_highest_rated)
|
|
|
|
# Keep the same context variable names for template compatibility
|
|
context['popular_parks'] = trending_parks
|
|
context['popular_rides'] = trending_rides
|
|
context['highest_rated'] = all_highest_rated[:10] # Take first 10 after shuffling
|
|
|
|
return context
|
|
|
|
class SearchView(TemplateView):
|
|
template_name = 'search_results.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
|
|
if query := self.request.GET.get('q', '').strip():
|
|
# Search parks
|
|
context['parks'] = Park.objects.filter(
|
|
Q(name__icontains=query) |
|
|
Q(location__icontains=query) |
|
|
Q(description__icontains=query)
|
|
).select_related('owner').prefetch_related('photos')[:10]
|
|
|
|
# Search rides
|
|
context['rides'] = Ride.objects.filter(
|
|
Q(name__icontains=query) |
|
|
Q(description__icontains=query) |
|
|
Q(manufacturer__name__icontains=query)
|
|
).select_related('park', 'coaster_stats').prefetch_related('photos')[:10]
|
|
|
|
# Search companies
|
|
context['companies'] = Company.objects.filter(
|
|
Q(name__icontains=query) |
|
|
Q(headquarters__icontains=query) |
|
|
Q(description__icontains=query)
|
|
).prefetch_related('parks')[:10]
|
|
|
|
# Search manufacturers
|
|
context['manufacturers'] = Manufacturer.objects.filter(
|
|
Q(name__icontains=query) |
|
|
Q(headquarters__icontains=query) |
|
|
Q(description__icontains=query)
|
|
).prefetch_related('rides')[:10]
|
|
|
|
return context
|
|
|
|
def environment_and_settings_view(request):
|
|
# Get all environment variables
|
|
env_vars = dict(os***REMOVED***iron)
|
|
|
|
# Get all Django settings as a dictionary
|
|
settings_vars = {setting: getattr(settings, setting) for setting in dir(settings) if setting.isupper()}
|
|
|
|
return render(request, 'environment_and_settings.html', {
|
|
'env_vars': env_vars,
|
|
'settings_vars': settings_vars
|
|
})
|