-from django import template
+from django import template, VERSION as django_version
from django.conf import settings
from django.utils.safestring import mark_safe
from philo.contrib.shipherd.models import Navigation
context['item'] = item
context['children'] = self.__class__(self.template_nodes, item.get_children(), context, request)
+ # Django 1.2.X compatibility - a lazy recurser will not be called if accessed as a template variable.
+ if django_version < (1,3):
+ context['children'] = context['children']()
+
# Then render the nodelist bit by bit.
for node in self.template_nodes:
bits.append(node.render(context))
class SearchView(MultiView):
results_page = models.ForeignKey(Page, related_name='search_results_related')
searches = SlugMultipleChoiceField(choices=registry.iterchoices())
- enable_ajax_api = models.BooleanField("Enable AJAX API", default=True)
+ enable_ajax_api = models.BooleanField("Enable AJAX API", default=True, help_text="Search results will be available <i>only</i> by AJAX, not as template variables.")
placeholder_text = models.CharField(max_length=75, default="Search")
search_form = SearchForm
def __unicode__(self):
- return u"%s (%s)" % (self.placeholder_text, u", ".join([display for slug, display in registry.iterchoices()]))
+ return u"%s (%s)" % (self.placeholder_text, u", ".join([display for slug, display in registry.iterchoices() if slug in self.searches]))
def get_reverse_params(self, obj):
raise ViewCanNotProvideSubpath
})
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()]
+ 'searches': [{'verbose_name': verbose_name, 'url': self.reverse('ajax_api_view', kwargs={'slug': slug}, node=request.node)} for slug, verbose_name in registry.iterchoices() if slug in self.searches]
})
else:
form = SearchForm()
SEARCH_CACHE_KEY = 'philo_sobol_search_results'
DEFAULT_RESULT_TEMPLATE_STRING = "{% if url %}<a href='{{ url }}'>{% endif %}{{ title }}{% if url %}</a>{% endif %}"
+DEFAULT_RESULT_TEMPLATE = Template(DEFAULT_RESULT_TEMPLATE_STRING)
# Determines the timeout on the entire result cache.
-MAX_CACHE_TIMEOUT = 60*60*24*7
+MAX_CACHE_TIMEOUT = 60*24*7
class RegistrationError(Exception):
def register(self, search, slug=None):
slug = slug or search.slug
if slug in self._registry:
- if self._registry[slug] != search:
- raise RegistrationError("A different search is already registered as `%s`")
+ registered = self._registry[slug]
+ if registered.__module__ != search.__module__:
+ raise RegistrationError("A different search is already registered as `%s`" % slug)
else:
self._registry[slug] = search
return self.search.get_result_title(self.result)
def get_url(self):
- return "?%s" % self.search.get_result_querydict(self.result).urlencode()
+ qd = self.search.get_result_querydict(self.result)
+ if qd is None:
+ return ""
+ return "?%s" % qd.urlencode()
def get_template(self):
return self.search.get_result_template(self.result)
limit = self.result_limit
if limit is not None:
limit += 1
- results = self.get_results(self.result_limit)
+ results = self.get_results(limit)
except:
if settings.DEBUG:
raise
raise NotImplementedError
def get_result_querydict(self, result):
- return make_tracking_querydict(self.search_arg, self.get_result_url(result))
+ url = self.get_result_url(result)
+ if url is None:
+ return None
+ return make_tracking_querydict(self.search_arg, url)
def get_result_template(self, result):
if hasattr(self, 'result_template'):
return loader.get_template(self.result_template)
if not hasattr(self, '_result_template'):
- self._result_template = Template(DEFAULT_RESULT_TEMPLATE_STRING)
+ self._result_template = DEFAULT_RESULT_TEMPLATE
return self._result_template
def get_result_extra_context(self, result):
class DatabaseSearch(BaseSearch):
model = None
- def has_more_results(self):
- return self.get_queryset().count() > self.result_limit
-
def search(self, limit=None):
if not hasattr(self, '_qs'):
self._qs = self.get_queryset()
query_format_str = "?v=1.0&q=%s"
# TODO: Change this template to reflect the app's actual name.
result_template = 'search/googlesearch.html'
- timeout = 60
+ _cache_timeout = 60
def parse_response(self, response, limit=None):
responseData = json.loads(response.read())['responseData']
def parse_response(self, response, limit=None):
strainer = self.strainer
soup = BeautifulSoup(response, parseOnlyThese=strainer)
- return self.parse_results(soup[:limit])
+ return self.parse_results(soup.findAll(recursive=False, limit=limit))
def parse_results(self, results):
"""
def parse_response(self, response, limit=None):
strainer = self.strainer
- soup = BeautifulStoneSoup(page, selfClosingTags=self._self_closing_tags, parseOnlyThese=strainer)
- return self.parse_results(soup[:limit])
\ No newline at end of file
+ soup = BeautifulStoneSoup(response, selfClosingTags=self._self_closing_tags, parseOnlyThese=strainer)
+ return self.parse_results(soup.findAll(recursive=False, limit=limit))
\ No newline at end of file