from django.views.generic import DetailView, ListView from django.shortcuts import get_object_or_404 from .models import Ride, RollerCoasterStats from parks.models import Park from core.views import SlugRedirectMixin class RideDetailView(SlugRedirectMixin, DetailView): model = Ride template_name = 'rides/ride_detail.html' context_object_name = 'ride' slug_url_kwarg = 'ride_slug' def get_object(self, queryset=None): if queryset is None: queryset = self.get_queryset() park_slug = self.kwargs.get('park_slug') ride_slug = self.kwargs.get('ride_slug') # Try to get by current or historical slug obj, is_old_slug = self.model.get_by_slug(ride_slug) if obj.park.slug != park_slug: raise self.model.DoesNotExist("Park slug doesn't match") return obj def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) if self.object.category == 'RC': context['coaster_stats'] = RollerCoasterStats.objects.filter(ride=self.object).first() return context def get_redirect_url_pattern(self): return 'ride_detail' def get_redirect_url_kwargs(self): return { 'park_slug': self.object.park.slug, 'ride_slug': self.object.slug } class RideListView(ListView): model = Ride template_name = 'rides/ride_list.html' context_object_name = 'rides' paginate_by = 12 def get_queryset(self): queryset = Ride.objects.select_related('park', 'coaster_stats') # Filter by category if specified category = self.request.GET.get('category') if category: queryset = queryset.filter(category=category) # Filter by status if specified status = self.request.GET.get('status') if status: queryset = queryset.filter(status=status) # Filter by manufacturer if specified manufacturer = self.request.GET.get('manufacturer') if manufacturer: queryset = queryset.filter(manufacturer=manufacturer) return queryset.order_by('name') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['manufacturers'] = Ride.objects.values_list( 'manufacturer', flat=True ).distinct().order_by('manufacturer') return context