def get_queryset(self, use_haystack=USE_HAYSTACK): """Return the base queryset for this form.""" if use_haystack: qs = SmartSearchQuerySet().models(Video) else: qs = Video.objects.filter(status=Video.ACTIVE) return qs.filter(site=settings.SITE_ID)
def assertQueryResults(self, query, expected): """ Given a query and a list of videos, checks that all expected videos are found by a search with the given query. """ results = SmartSearchQuerySet().auto_query(query) results = dict((unicode(r.pk), r.object.name) for r in results if r.object is not None) expected = dict((unicode(v.pk), v.name) for v in expected) result_pks = set(results.items()) expected_pks = set(expected.items()) self.assertEqual(result_pks, expected_pks)
def assertQueryResults(self, query, expected): """ Given a query and a list of videos, checks that all expected videos are found by a search with the given query. """ results = SmartSearchQuerySet().auto_query(query) results = dict((unicode(r.pk), r.object.name) for r in results) expected = dict((unicode(v.pk), v.name) for v in expected) result_pks = set(results.items()) expected_pks = set(expected.items()) self.assertEqual(result_pks, expected_pks)
def test_search_description_with_html(self): """ If the description contains HTML, searching should still find words next to HTML tags. """ results = SmartSearchQuerySet().auto_query('blahblah') self.assertTrue(results)
def test_search_exclude_terms(self): """ Search should exclude terms that start with - (hyphen). """ results = SmartSearchQuerySet().auto_query('-blender') self.assertTrue(results) for result in results: self.assertFalse('blender' in result.text.lower())
def test_search_phrase(self): """ Phrases in quotes should be searched for as a phrase. """ results = SmartSearchQuerySet().auto_query('"empty mapping"') self.assertTrue(results) for result in results: self.assertTrue('empty mapping' in result.text.lower())
def test_search(self): """ The basic query should return videos which contain the search term. """ results = SmartSearchQuerySet().auto_query('blender') self.assertTrue(results) for result in results: self.assertTrue('blender' in result.text.lower(), result.text)
def test_search_or(self): """ Terms bracketed in {}s should be ORed together. """ results = SmartSearchQuerySet().auto_query('{elephant render}') self.assertTrue(results) for result in results: self.assertTrue(('elephant' in result.text.lower()) or ('render' in result.text.lower()), result.text)
def test_search_or_and(self): """ Mixing OR and AND should work as expected. """ # this used to be '{import repair} -and' but that no longer works. I # wonder if recent versions of Haystack (or Whoosh) skip small words? results = SmartSearchQuerySet().auto_query( '{import repair} -positioning') self.assertTrue(results) for result in results: self.assertFalse('positioning' in result.text.lower(), result.text) self.assertTrue(('import' in result.text.lower()) or ('repair' in result.text.lower()), result.text)
def assertTokenizes(self, query, result): self.assertEqual(tuple(SmartSearchQuerySet().tokenize(query)), tuple(result))
def search(self, query): return [ result.object for result in SmartSearchQuerySet().auto_query(query) ]
def __init__(self, *args, **kwargs): sqs = kwargs.get('searchqueryset', None) if sqs is None: kwargs['searchqueryset'] = SmartSearchQuerySet() super(SmartSearchForm, self).__init__(*args, **kwargs)