diff gpp/custom_search.py @ 415:d4d167876c25

Fixing #205; search result pagination wasn't including models. Created a custom model search form so that the query term and model selections would persist across pages.
author Brian Neal <bgneal@gmail.com>
date Sun, 10 Apr 2011 00:32:14 +0000
parents
children 524fd1b3919a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/custom_search.py	Sun Apr 10 00:32:14 2011 +0000
@@ -0,0 +1,65 @@
+"""
+This module contains custom code to tailor the Haystack search application to
+our needs.
+
+"""
+import urllib
+
+from django import forms
+from haystack.views import SearchView
+from haystack.forms import ModelSearchForm
+
+
+MODEL_CHOICES = (
+    ('forums.topic', 'Forum Topics'),
+    ('forums.post', 'Forum Posts'),
+    ('news.story', 'News Stories'),
+    ('bio.userprofile', 'User Profiles'),
+    ('weblinks.link', 'Links'),
+    ('downloads.download', 'Downloads'),
+    ('podcast.item', 'Podcasts'),
+    ('ygroup.post', 'Yahoo Group Archives'),
+)
+
+
+class CustomModelSearchForm(ModelSearchForm):
+    """
+    This customized ModelSearchForm allows us to explictly label and order
+    the model choices.
+
+    """
+    q = forms.CharField(required=False, label='',
+            widget=forms.TextInput(attrs={'class': 'text', 'size': 48}))
+
+    def __init__(self, *args, **kwargs):
+        super(CustomModelSearchForm, self).__init__(*args, **kwargs)
+        self.fields['models'] = forms.MultipleChoiceField(choices=MODEL_CHOICES,
+                label='', widget=forms.CheckboxSelectMultiple)
+
+
+class ModelSearchView(SearchView):
+    """
+    This custom search view puts an extra value in the template context named
+    search_parms. search_parms will contain the search term q plus any models
+    arguments all as a urlencoded string. This is useful for generating
+    pagination links in the template.
+
+    """
+    def search_params(self):
+        """
+        Return the q and models search parameters as a urlencoded string if the
+        form is valid. An empty string is returned if the form is not valid.
+
+        """
+        if self.form.is_valid():
+            q = self.form.cleaned_data['q']
+            models = self.form.cleaned_data['models']
+
+            params = [('q', q)]
+            params.extend([('models', model) for model in models])
+            return urllib.urlencode(params)
+
+        return ''
+
+    def extra_context(self):
+        return {'search_params': self.search_params() }