Files
thrillwiki_django_no_react/shared/docs/memory-bank/features/search-system.md
pacnpal d504d41de2 feat: complete monorepo structure with frontend and shared resources
- Add complete backend/ directory with full Django application
- Add frontend/ directory with Vite + TypeScript setup ready for Next.js
- Add comprehensive shared/ directory with:
  - Complete documentation and memory-bank archives
  - Media files and avatars (letters, park/ride images)
  - Deployment scripts and automation tools
  - Shared types and utilities
- Add architecture/ directory with migration guides
- Configure pnpm workspace for monorepo development
- Update .gitignore to exclude .django_tailwind_cli/ build artifacts
- Preserve all historical documentation in shared/docs/memory-bank/
- Set up proper structure for full-stack development with shared resources
2025-08-23 18:40:07 -04:00

3.4 KiB

Site-Wide Search System Architecture

1. Architectural Overview

  • Filter-First Approach: Utilizes django-filter for robust filtering capabilities
  • Modular Design:
    # 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

# 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

# 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

<!-- templates/search/filters.html -->
<form hx-get="/search/" hx-target="#search-results" hx-swap="outerHTML">
    {{ filters.form.as_p }}
    <button type="submit">Apply Filters</button>
</form>

<!-- Dynamic filter updates -->
<div hx-trigger="filter-update from:body" 
     hx-get="/search/filters/" 
     hx-swap="innerHTML">
</div>

5. Benefits of django-filter Integration

  • Built-in validation for filter parameters
  • Automatic form generation
  • Complex lookup expressions
  • Reusable filter components
  • Plugin ecosystem support

6. Security Considerations

  • Input sanitization using django's built-in escaping
  • Query parameter whitelisting via FilterSet definitions
  • Rate limiting on autocomplete endpoint (using django-ratelimit)
  • Permission-aware queryset filtering

7. Performance Optimization

  • Select related/prefetch_related in FilterSet querysets
  • Caching filter configurations
  • Indexing recommendations for filtered fields
  • Pagination integration with django-filter

8. Testing Strategy

  • FilterSet validation tests
  • HTMX interaction tests
  • Cross-browser filter UI tests
  • Performance load testing

9. Style Integration

  • Custom filter form templates matching Tailwind design
  • Responsive filter controls grid
  • Accessible form labels and error messages
  • Dark mode support

10. Expansion Framework

  • Registry pattern for adding new FilterSets
  • Dynamic filter discovery system
  • Plugin configuration templates
  • Analytics integration points