Merge branch 'release/0.9.1'
[philo.git] / philo / contrib / sobol / models.py
index 1bef3cd..ffe5871 100644 (file)
@@ -79,6 +79,8 @@ class Search(models.Model):
                                        self._favored_results += subresults
                                else:
                                        break
+                       if len(self._favored_results) == len(results):
+                               self._favored_results = []
                return self._favored_results
        
        class Meta:
@@ -151,32 +153,20 @@ class Click(models.Model):
                get_latest_by = 'datetime'
 
 
-class RegistryChoiceField(SlugMultipleChoiceField):
-       def _get_choices(self):
-               if isinstance(self._choices, RegistryIterator):
-                       return self._choices.copy()
-               elif hasattr(self._choices, 'next'):
-                       choices, self._choices = itertools.tee(self._choices)
-                       return choices
-               else:
-                       return self._choices
-       choices = property(_get_choices)
-
-
 try:
        from south.modelsinspector import add_introspection_rules
 except ImportError:
        pass
 else:
-       add_introspection_rules([], ["^philo\.contrib\.shipherd\.models\.RegistryChoiceField"])
+       add_introspection_rules([], ["^philo\.contrib\.sobol\.models\.RegistryChoiceField"])
 
 
 class SearchView(MultiView):
        """Handles a view for the results of a search, anonymously tracks the selections made by end users, and provides an AJAX API for asynchronous search result loading. This can be particularly useful if some searches are slow."""
        #: :class:`ForeignKey` to a :class:`.Page` which will be used to render the search results.
        results_page = models.ForeignKey(Page, related_name='search_results_related')
-       #: A :class:`.SlugMultipleChoiceField` whose choices are the contents of the :class:`.SearchRegistry`
-       searches = RegistryChoiceField(choices=registry.iterchoices())
+       #: A :class:`.SlugMultipleChoiceField` whose choices are the contents of :obj:`.sobol.search.registry`
+       searches = SlugMultipleChoiceField(choices=registry.iterchoices())
        #: A :class:`BooleanField` which controls whether or not the AJAX API is enabled.
        #:
        #: .. note:: If the AJAX API is enabled, a ``ajax_api_url`` attribute will be added to each search instance containing the url and get parameters for an AJAX request to retrieve results for that search.
@@ -255,8 +245,16 @@ class SearchView(MultiView):
                                        pool.waitall()
                                
                                context.update({
-                                       'searches': search_instances
+                                       'searches': search_instances,
+                                       'favored_results': []
                                })
+                               
+                               try:
+                                       search = Search.objects.get(string=search_string)
+                               except Search.DoesNotExist:
+                                       pass
+                               else:
+                                       context['favored_results'] = [r.url for r in search.get_favored_results()]
                else:
                        form = SearchForm()
                
@@ -267,8 +265,10 @@ class SearchView(MultiView):
        
        def ajax_api_view(self, request, slug, extra_context=None):
                """
-               Returns a JSON string containing two keyed lists.
+               Returns a JSON object containing the following variables:
                
+               search
+                       Contains the slug for the search.
                results
                        Contains the results of :meth:`.Result.get_context` for each result.
                rendered
@@ -276,7 +276,7 @@ class SearchView(MultiView):
                hasMoreResults
                        ``True`` or ``False`` whether the search has more results according to :meth:`BaseSearch.has_more_results`
                moreResultsURL
-                       Contains None or a querystring which, once accessed, will note the :class:`Click` and redirect the user to a page containing more results.
+                       Contains ``None`` or a querystring which, once accessed, will note the :class:`Click` and redirect the user to a page containing more results.
                
                """
                search_string = request.GET.get(SEARCH_ARG_GET_KEY)
@@ -288,7 +288,7 @@ class SearchView(MultiView):
                
                return HttpResponse(json.dumps({
                        'search': search_instance.slug,
-                       'results': [result.render() for result in search_instance.results],
+                       'results': [result.get_context() for result in search_instance.results],
                        'hasMoreResults': search_instance.has_more_results,
-                       'moreResultsURL': (u"?%s" % search_instance.more_results_querydict.urlencode()) if search_instance.more_results_querydict else None,
+                       'moreResultsURL': search_instance.more_results_url,
                }), mimetype="application/json")
\ No newline at end of file