mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 17:11:09 -05:00
Add search suggestions feature with category filtering and display; enhance ride list view with improved search functionality
This commit is contained in:
@@ -219,25 +219,55 @@ class RideListView(ListView):
|
||||
context_object_name = 'rides'
|
||||
|
||||
def get_queryset(self):
|
||||
"""Get all rides or filter by park if park_slug is provided"""
|
||||
"""Get filtered rides based on search and filters"""
|
||||
queryset = Ride.objects.all().select_related(
|
||||
'park',
|
||||
'ride_model',
|
||||
'ride_model__manufacturer'
|
||||
).prefetch_related('photos')
|
||||
|
||||
# Park filter
|
||||
if 'park_slug' in self.kwargs:
|
||||
self.park = get_object_or_404(Park, slug=self.kwargs['park_slug'])
|
||||
queryset = queryset.filter(park=self.park)
|
||||
|
||||
# Search term handling
|
||||
search = self.request.GET.get('q', '').strip()
|
||||
if search:
|
||||
# Split search terms for more flexible matching
|
||||
search_terms = search.split()
|
||||
search_query = Q()
|
||||
|
||||
for term in search_terms:
|
||||
term_query = Q(
|
||||
name__icontains=term
|
||||
) | Q(
|
||||
park__name__icontains=term
|
||||
) | Q(
|
||||
description__icontains=term
|
||||
)
|
||||
search_query &= term_query
|
||||
|
||||
queryset = queryset.filter(search_query)
|
||||
|
||||
# Category filter
|
||||
category = self.request.GET.get('category')
|
||||
if category and category != 'all':
|
||||
queryset = queryset.filter(category=category)
|
||||
|
||||
# Operating status filter
|
||||
if self.request.GET.get('operating') == 'true':
|
||||
queryset = queryset.filter(status='operating')
|
||||
|
||||
return queryset
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
"""Add park to context if park_slug is provided"""
|
||||
"""Add park and category choices to context"""
|
||||
context = super().get_context_data(**kwargs)
|
||||
if hasattr(self, 'park'):
|
||||
context['park'] = self.park
|
||||
context['park_slug'] = self.kwargs['park_slug']
|
||||
context['category_choices'] = CATEGORY_CHOICES
|
||||
return context
|
||||
|
||||
|
||||
@@ -336,3 +366,63 @@ def search_ride_models(request: HttpRequest) -> HttpResponse:
|
||||
{"ride_models": ride_models, "search_term": query,
|
||||
"manufacturer_id": manufacturer_id},
|
||||
)
|
||||
|
||||
|
||||
def get_search_suggestions(request: HttpRequest) -> HttpResponse:
|
||||
"""Get smart search suggestions for rides
|
||||
|
||||
Returns suggestions including:
|
||||
- Common matching ride names
|
||||
- Matching parks
|
||||
- Matching categories
|
||||
"""
|
||||
query = request.GET.get('q', '').strip().lower()
|
||||
suggestions = []
|
||||
|
||||
if query:
|
||||
# Get common ride names
|
||||
matching_names = Ride.objects.filter(
|
||||
name__icontains=query
|
||||
).values('name').annotate(
|
||||
count=Count('id')
|
||||
).order_by('-count')[:3]
|
||||
|
||||
for match in matching_names:
|
||||
suggestions.append({
|
||||
'type': 'ride',
|
||||
'text': match['name'],
|
||||
'count': match['count']
|
||||
})
|
||||
|
||||
# Get matching parks
|
||||
matching_parks = Park.objects.filter(
|
||||
Q(name__icontains=query) |
|
||||
Q(location__city__icontains=query)
|
||||
)[:3]
|
||||
|
||||
for park in matching_parks:
|
||||
suggestions.append({
|
||||
'type': 'park',
|
||||
'text': park.name,
|
||||
'location': park.location.city if park.location else None
|
||||
})
|
||||
|
||||
# Add category matches
|
||||
for code, name in CATEGORY_CHOICES:
|
||||
if query in name.lower():
|
||||
ride_count = Ride.objects.filter(category=code).count()
|
||||
suggestions.append({
|
||||
'type': 'category',
|
||||
'code': code,
|
||||
'text': name,
|
||||
'count': ride_count
|
||||
})
|
||||
|
||||
return render(
|
||||
request,
|
||||
'rides/partials/search_suggestions.html',
|
||||
{
|
||||
'suggestions': suggestions,
|
||||
'query': query
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user