Add search suggestions feature with category filtering and display; enhance ride list view with improved search functionality

This commit is contained in:
pacnpal
2025-02-11 13:41:05 -05:00
parent 2e0d32819a
commit 59efc39143
7 changed files with 987 additions and 220 deletions

View File

@@ -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
}
)