Solidified AJAX API.
authorStephen Burrows <stephen.r.burrows@gmail.com>
Wed, 2 Mar 2011 21:16:22 +0000 (16:16 -0500)
committerStephen Burrows <stephen.r.burrows@gmail.com>
Wed, 2 Mar 2011 21:16:22 +0000 (16:16 -0500)
contrib/sobol/models.py
contrib/sobol/search.py
contrib/sobol/templates/search/googlesearch.html

index e5852d7..b653c09 100644 (file)
@@ -2,7 +2,7 @@ from django.conf.urls.defaults import patterns, url
 from django.contrib import messages
 from django.core.exceptions import ValidationError
 from django.db import models
-from django.http import HttpResponseRedirect, Http404
+from django.http import HttpResponseRedirect, Http404, HttpResponse
 from django.utils import simplejson as json
 from django.utils.datastructures import SortedDict
 from philo.contrib.sobol import registry
@@ -148,7 +148,7 @@ class SearchView(MultiView):
                )
                if self.enable_ajax_api:
                        urlpatterns += patterns('',
-                               url(r'^(?P<slug>[\w-]+)', self.ajax_api_view, name='ajax_api_view')
+                               url(r'^(?P<slug>[\w-]+)$', self.ajax_api_view, name='ajax_api_view')
                        )
                return urlpatterns
        
@@ -196,6 +196,10 @@ class SearchView(MultiView):
                                        context.update({
                                                'searches': search_instances
                                        })
+                               else:
+                                       context.update({
+                                               'searches': [{'verbose_name': verbose_name, 'url': self.reverse('ajax_api_view', kwargs={'slug': slug}, node=request.node)} for slug, verbose_name in registry.iterchoices()]
+                                       })
                else:
                        form = SearchForm()
                
@@ -214,8 +218,7 @@ class SearchView(MultiView):
                        raise Http404
                
                search_instance = self.get_search_instance(slug, search_string)
-               response = json.dumps({
-                       'results': search_instance.results,
-                       'template': search_instance.get_template()
-               })
+               response = HttpResponse(json.dumps({
+                       'results': [result.get_context() for result in search_instance.results],
+               }))
                return response
\ No newline at end of file
index cce3ec6..36c2b5d 100644 (file)
@@ -69,6 +69,9 @@ class SearchRegistry(object):
        
        def __getitem__(self, key):
                return self._registry[key]
+       
+       def __iter__(self):
+               return self._registry.__iter__()
 
 
 registry = SearchRegistry()
@@ -90,7 +93,7 @@ class Result(object):
                return self.search.get_result_title(self.result)
        
        def get_url(self):
-               return self.search.get_result_querydict(self.result).urlencode()
+               return "?%s" % self.search.get_result_querydict(self.result).urlencode()
        
        def get_template(self):
                return self.search.get_result_template(self.result)
@@ -98,13 +101,17 @@ class Result(object):
        def get_extra_context(self):
                return self.search.get_result_extra_context(self.result)
        
-       def render(self):
-               t = self.get_template()
-               c = Context(self.get_extra_context())
-               c.update({
+       def get_context(self):
+               context = self.get_extra_context()
+               context.update({
                        'title': self.get_title(),
                        'url': self.get_url()
                })
+               return context
+       
+       def render(self):
+               t = self.get_template()
+               c = Context(self.get_context())
                return t.render(c)
        
        def __unicode__(self):
@@ -211,9 +218,6 @@ class BaseSearch(object):
                        self._result_template = Template(DEFAULT_RESULT_TEMPLATE_STRING)
                return self._result_template
        
-       def get_ajax_result_template(self, result):
-               return getattr(self, 'ajax_result_template', DEFAULT_RESULT_TEMPLATE_STRING)
-       
        def get_result_extra_context(self, result):
                return {}
        
index 2938214..1b22388 100644 (file)
@@ -1,4 +1,4 @@
 <article>
-       <h1><a href="?{{ url }}">{{ title|safe }}</a></h1>
+       <h1><a href="{{ url }}">{{ title|safe }}</a></h1>
        <p>{{ content|safe }}</p>
 </article>
\ No newline at end of file