From 62723d0e33467b29a2ac0522fef3f4373ed2f3a5 Mon Sep 17 00:00:00 2001 From: pacnpal <183241239+pacnpal@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:41:35 -0500 Subject: [PATCH] Implement site-wide search system architecture with modular design and enhanced backend components; integrate django-filter for improved filtering capabilities and security considerations --- memory-bank/features/search-system.md | 121 ++++++++++++++++++++++++++ search/__init__.py | 0 search/admin.py | 3 + search/apps.py | 6 ++ search/migrations/__init__.py | 0 search/models.py | 3 + search/tests.py | 3 + search/views.py | 3 + 8 files changed, 139 insertions(+) create mode 100644 memory-bank/features/search-system.md create mode 100644 search/__init__.py create mode 100644 search/admin.py create mode 100644 search/apps.py create mode 100644 search/migrations/__init__.py create mode 100644 search/models.py create mode 100644 search/tests.py create mode 100644 search/views.py diff --git a/memory-bank/features/search-system.md b/memory-bank/features/search-system.md new file mode 100644 index 00000000..cec3ace4 --- /dev/null +++ b/memory-bank/features/search-system.md @@ -0,0 +1,121 @@ +# Site-Wide Search System Architecture + +## 1. Architectural Overview +- **Filter-First Approach**: Utilizes django-filter for robust filtering capabilities +- **Modular Design**: + ```python + # filters.py + class ParkFilter(django_filters.FilterSet): + search = django_filters.CharFilter(method='filter_search') + + class Meta: + model = Park + fields = { + 'state': ['exact', 'in'], + 'rating': ['gte', 'lte'], + } + + def filter_search(self, queryset, name, value): + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) + ``` + +## 2. Enhanced Backend Components + +### Search Endpoint (`/search/`) +```python +# views.py +class AdaptiveSearchView(TemplateView): + template_name = "search/results.html" + + def get_queryset(self): + return Park.objects.all() + + def get_filterset(self): + return ParkFilter(self.request.GET, queryset=self.get_queryset()) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + filterset = self.get_filterset() + context['results'] = filterset.qs + context['filters'] = filterset.form + return context +``` + +## 3. Plugin Integration + +### Recommended django-filter Extensions +```python +# settings.py +INSTALLED_APPS += [ + 'django_filters', + 'django_filters_addons', # For custom widgets + 'rangefilter', # For date/number ranges +] + +# filters.py +class EnhancedParkFilter(ParkFilter): + rating_range = django_filters.RangeFilter(field_name='rating') + features = django_filters.MultipleChoiceFilter( + field_name='features__slug', + widget=HorizontalCheckboxSelectMultiple, + lookup_expr='contains' + ) + + class Meta(ParkFilter.Meta): + fields = ParkFilter.Meta.fields + ['rating_range', 'features'] +``` + +## 4. Frontend Filter Rendering +```html + +
+ + +