def complete(request, field=None, **kw): if not field in ('serie', 'technique', 'support', "authentication_source"): return HttpResponse(status=412) sqs = SearchQuerySet() term = request.REQUEST.get('term', "") if field == 'technique': # Multivalued field. Rather than parsing the values at the # javascript level, we handle them here: we assume that we # should complete the last item of the comma-separated list techniques = term.split(",") last = techniques.pop() if not last: # Nothing to complete completions = set([ term ]) else: kw = { field + '_auto': last } # We have to filter again here for "term in item" since the # 'technique' field is multivalued, and autocomplete will also # output the other techniques from the same work. # Moreover, the output is a list of items that must be flattened completions = set(",".join(techniques + [ item[0][0] ]) for item in sqs.autocomplete(**kw).values_list(field) if last in item[0][0] and not item[0][0] in techniques) else: kw = { field + '_auto': term } completions = set(item[0] for item in sqs.autocomplete(**kw).values_list(field)) # there can be some None values in the set (due to an outdated index) completions.discard(None) s = (sorted(i for i in completions if i.startswith(term)) + sorted(i for i in completions if not i.startswith(term))) return HttpResponse(json.dumps([{'value': item} for item in s]), content_type="application/json")
class AutocompleteQueryTestCase(TestCase): fixtures = ['mock_persons'] def setUp(self): PersonIndex().reindex() self.sqs = SearchQuerySet().all() def test_filter_CharField(self): # Make sure we only get exact hit when searching using # the `CharField` fields self.assertEqual(self.sqs.filter(firstname='abel').count(), Person.objects.filter(firstname__iexact='abel').count()) self.assertEqual(self.sqs.filter(lastname='hood').count(), Person.objects.filter(lastname__iexact='hood').count()) def test_filter_AutocompleteEdgeNgramField(self): # Make sure we get results for all tokens indexed using # the `AutocompleteEdgeNgramField`. We should get match on # both firstname and lastname. self.assertEqual(self.sqs.autocomplete(q='d').count(), Person.objects.filter(Q(firstname__istartswith='d') | Q(lastname__istartswith='d')).count()) self.assertEqual(self.sqs.autocomplete(q='ab').count(), Person.objects.filter(Q(firstname__istartswith='ab') | Q(lastname__istartswith='ab')).count())
class LiveWhooshAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveWhooshAutocompleteTestCase, self).setUp() # Stow. temp_path = os.path.join('tmp', 'test_whoosh_query') self.old_whoosh_path = settings.HAYSTACK_CONNECTIONS['default']['PATH'] settings.HAYSTACK_CONNECTIONS['default']['PATH'] = temp_path self.old_ui = connections['default'].get_unified_index() self.ui = UnifiedIndex() self.wacsi = WhooshAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.wacsi]) self.sb = connections['default'].get_backend() connections['default']._index = self.ui # Stow. import haystack self.old_debug = settings.DEBUG settings.DEBUG = True self.sb.setup() self.sqs = SearchQuerySet() # Wipe it clean. self.sqs.query.backend.clear() for mock in MockModel.objects.all(): self.wacsi.update_object(mock) def tearDown(self): if os.path.exists(settings.HAYSTACK_CONNECTIONS['default']['PATH']): shutil.rmtree(settings.HAYSTACK_CONNECTIONS['default']['PATH']) settings.HAYSTACK_CONNECTIONS['default']['PATH'] = self.old_whoosh_path connections['default']._index = self.old_ui settings.DEBUG = self.old_debug super(LiveWhooshAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'6', u'7', u'14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) def test_edgengram_regression(self): autocomplete = self.sqs.autocomplete(text_auto='ngm') self.assertEqual(autocomplete.count(), 0) def test_extra_whitespace(self): autocomplete = self.sqs.autocomplete(text_auto='mod ') self.assertEqual(autocomplete.count(), 5)
class LiveWhooshAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveWhooshAutocompleteTestCase, self).setUp() # Stow. temp_path = os.path.join('tmp', 'test_whoosh_query') self.old_whoosh_path = settings.HAYSTACK_CONNECTIONS['default']['PATH'] settings.HAYSTACK_CONNECTIONS['default']['PATH'] = temp_path self.old_ui = connections['default'].get_unified_index() self.ui = UnifiedIndex() self.wacsi = WhooshAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.wacsi]) self.sb = connections['default'].get_backend() connections['default']._index = self.ui # Stow. import haystack self.old_debug = settings.DEBUG settings.DEBUG = True self.sb.setup() self.sqs = SearchQuerySet() # Wipe it clean. self.sqs.query.backend.clear() for mock in MockModel.objects.all(): self.wacsi.update_object(mock) def tearDown(self): if os.path.exists(settings.HAYSTACK_CONNECTIONS['default']['PATH']): shutil.rmtree(settings.HAYSTACK_CONNECTIONS['default']['PATH']) settings.HAYSTACK_CONNECTIONS['default']['PATH'] = self.old_whoosh_path connections['default']._index = self.old_ui settings.DEBUG = self.old_debug super(LiveWhooshAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'6', u'7', u'14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) def test_edgengram_regression(self): autocomplete = self.sqs.autocomplete(text_auto='ngm') self.assertEqual(autocomplete.count(), 0) def test_extra_whitespace(self): autocomplete = self.sqs.autocomplete(text_auto='mod ') self.assertEqual(autocomplete.count(), 5)
class LiveWhooshAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveWhooshAutocompleteTestCase, self).setUp() # Stow. temp_path = os.path.join('tmp', 'test_whoosh_query') self.old_whoosh_path = getattr(settings, 'HAYSTACK_WHOOSH_PATH', temp_path) settings.HAYSTACK_WHOOSH_PATH = temp_path self.site = SearchSite() self.sb = SearchBackend(site=self.site) self.wacsi = WhooshAutocompleteMockModelSearchIndex(MockModel, backend=self.sb) self.site.register(MockModel, WhooshAutocompleteMockModelSearchIndex) # Stow. import haystack self.old_debug = settings.DEBUG settings.DEBUG = True self.old_site = haystack.site haystack.site = self.site self.sb.setup() self.sqs = SearchQuerySet(site=self.site) # Wipe it clean. self.sqs.query.backend.clear() for mock in MockModel.objects.all(): self.wacsi.update_object(mock) def tearDown(self): if os.path.exists(settings.HAYSTACK_WHOOSH_PATH): shutil.rmtree(settings.HAYSTACK_WHOOSH_PATH) settings.HAYSTACK_WHOOSH_PATH = self.old_whoosh_path import haystack haystack.site = self.old_site settings.DEBUG = self.old_debug super(LiveWhooshAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'6', u'7', u'14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) def test_edgengram_regression(self): autocomplete = self.sqs.autocomplete(text_auto='ngm') self.assertEqual(autocomplete.count(), 0)
class LiveSolrAutocompleteTestCase(TestCase): fixtures = ["bulk_data.json"] def setUp(self): super(LiveSolrAutocompleteTestCase, self).setUp() # Wipe it clean. clear_solr_index() # With the models registered, you get the proper bits. import haystack from haystack.sites import SearchSite # Stow. self.old_site = haystack.site test_site = SearchSite() test_site.register(MockModel, SolrAutocompleteMockModelSearchIndex) haystack.site = test_site self.sqs = SearchQuerySet() test_site.get_index(MockModel).update() def tearDown(self): # Restore. import haystack haystack.site = self.old_site super(LiveSolrAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto="mod") self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], ["1", "12", "6", "7", "14"]) self.assertTrue("mod" in autocomplete[0].text.lower()) self.assertTrue("mod" in autocomplete[1].text.lower()) self.assertTrue("mod" in autocomplete[2].text.lower()) self.assertTrue("mod" in autocomplete[3].text.lower()) self.assertTrue("mod" in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) # Test multiple words. autocomplete_2 = self.sqs.autocomplete(text_auto="your mod") self.assertEqual(autocomplete_2.count(), 3) self.assertEqual([result.pk for result in autocomplete_2], ["1", "14", "6"]) self.assertTrue("your" in autocomplete_2[0].text.lower()) self.assertTrue("mod" in autocomplete_2[0].text.lower()) self.assertTrue("your" in autocomplete_2[1].text.lower()) self.assertTrue("mod" in autocomplete_2[1].text.lower()) self.assertTrue("your" in autocomplete_2[2].text.lower()) self.assertTrue("mod" in autocomplete_2[2].text.lower()) self.assertEqual(len([result.pk for result in autocomplete_2]), 3) # Test multiple fields. autocomplete_3 = self.sqs.autocomplete(text_auto="Django", name_auto="dan") self.assertEqual(autocomplete_3.count(), 4) self.assertEqual([result.pk for result in autocomplete_3], ["12", "1", "14", "22"]) self.assertEqual(len([result.pk for result in autocomplete_3]), 4)
class LiveSolrAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveSolrAutocompleteTestCase, self).setUp() # Wipe it clean. clear_solr_index() # Stow. self.old_ui = connections['default'].get_unified_index() self.ui = UnifiedIndex() self.smmi = SolrAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.smmi]) connections['default']._index = self.ui self.sqs = SearchQuerySet() self.smmi.update() def tearDown(self): # Restore. connections['default']._index = self.old_ui super(LiveSolrAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], ['1', '12', '6', '7', '14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) # Test multiple words. autocomplete_2 = self.sqs.autocomplete(text_auto='your mod') self.assertEqual(autocomplete_2.count(), 3) self.assertEqual([result.pk for result in autocomplete_2], ['1', '14', '6']) self.assertTrue('your' in autocomplete_2[0].text.lower()) self.assertTrue('mod' in autocomplete_2[0].text.lower()) self.assertTrue('your' in autocomplete_2[1].text.lower()) self.assertTrue('mod' in autocomplete_2[1].text.lower()) self.assertTrue('your' in autocomplete_2[2].text.lower()) self.assertTrue('mod' in autocomplete_2[2].text.lower()) self.assertEqual(len([result.pk for result in autocomplete_2]), 3) # Test multiple fields. autocomplete_3 = self.sqs.autocomplete(text_auto='Django', name_auto='dan') self.assertEqual(autocomplete_3.count(), 4) self.assertEqual([result.pk for result in autocomplete_3], ['12', '1', '14', '22']) self.assertEqual(len([result.pk for result in autocomplete_3]), 4)
class LiveSolrAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveSolrAutocompleteTestCase, self).setUp() # Wipe it clean. clear_solr_index() # Stow. self.old_ui = connections['default'].get_unified_index() self.ui = UnifiedIndex() self.smmi = SolrAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.smmi]) connections['default']._index = self.ui self.sqs = SearchQuerySet() self.smmi.update() def tearDown(self): # Restore. connections['default']._index = self.old_ui super(LiveSolrAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], ['1', '12', '6', '7', '14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) # Test multiple words. autocomplete_2 = self.sqs.autocomplete(text_auto='your mod') self.assertEqual(autocomplete_2.count(), 3) self.assertEqual([result.pk for result in autocomplete_2], ['1', '14', '6']) self.assertTrue('your' in autocomplete_2[0].text.lower()) self.assertTrue('mod' in autocomplete_2[0].text.lower()) self.assertTrue('your' in autocomplete_2[1].text.lower()) self.assertTrue('mod' in autocomplete_2[1].text.lower()) self.assertTrue('your' in autocomplete_2[2].text.lower()) self.assertTrue('mod' in autocomplete_2[2].text.lower()) self.assertEqual(len([result.pk for result in autocomplete_2]), 3) # Test multiple fields. autocomplete_3 = self.sqs.autocomplete(text_auto='Django', name_auto='dan') self.assertEqual(autocomplete_3.count(), 4) self.assertEqual([result.pk for result in autocomplete_3], ['12', '1', '14', '22']) self.assertEqual(len([result.pk for result in autocomplete_3]), 4)
class LiveWhooshAutocompleteTestCase(WhooshTestCase): fixtures = ["bulk_data.json"] def setUp(self): super().setUp() # Stow. self.old_ui = connections["whoosh"].get_unified_index() self.ui = UnifiedIndex() self.wacsi = WhooshAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.wacsi]) self.sb = connections["whoosh"].get_backend() connections["whoosh"]._index = self.ui # Stow. import haystack self.sb.setup() self.sqs = SearchQuerySet("whoosh") # Wipe it clean. self.sqs.query.backend.clear() self.wacsi.update(using="whoosh") def tearDown(self): connections["whoosh"]._index = self.old_ui super().tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto="mod") self.assertEqual(autocomplete.count(), 5) self.assertEqual( [result.pk for result in autocomplete], ["1", "12", "6", "7", "14"] ) self.assertTrue("mod" in autocomplete[0].text.lower()) self.assertTrue("mod" in autocomplete[1].text.lower()) self.assertTrue("mod" in autocomplete[2].text.lower()) self.assertTrue("mod" in autocomplete[3].text.lower()) self.assertTrue("mod" in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) def test_edgengram_regression(self): autocomplete = self.sqs.autocomplete(text_auto="ngm") self.assertEqual(autocomplete.count(), 0) def test_extra_whitespace(self): autocomplete = self.sqs.autocomplete(text_auto="mod ") self.assertEqual(autocomplete.count(), 5)
class LiveWhooshAutocompleteTestCase(WhooshTestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveWhooshAutocompleteTestCase, self).setUp() # Stow. self.old_ui = connections['whoosh'].get_unified_index() self.ui = UnifiedIndex() self.wacsi = WhooshAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.wacsi]) self.sb = connections['whoosh'].get_backend() connections['whoosh']._index = self.ui # Stow. import haystack self.sb.setup() self.sqs = SearchQuerySet('whoosh') # Wipe it clean. self.sqs.query.backend.clear() self.wacsi.update(using='whoosh') def tearDown(self): connections['whoosh']._index = self.old_ui super(LiveWhooshAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'6', u'7', u'14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) def test_edgengram_regression(self): autocomplete = self.sqs.autocomplete(text_auto='ngm') self.assertEqual(autocomplete.count(), 0) def test_extra_whitespace(self): autocomplete = self.sqs.autocomplete(text_auto='mod ') self.assertEqual(autocomplete.count(), 5)
def autocomplete(request): products = SearchQuerySet.autocomplete( content_auto=request.GET.get('q', '')) suggestions = [result.name for result in products] the_data = json.dumps({'result': suggestions}) return HttpResponse(the_data, content_type='application/json')
def search_courses(query, user, max_result=None): result = [] result_objs = [] if query: user_is_staff = user.is_staff sgs_name = SearchQuerySet().models(Course).order_by('-is_active') if not user_is_staff: groups = user.group_set.all() courses_ids = (Course.objects.filter(groups__in=groups) | Course.objects.filter(teachers=user)) \ .values_list('id', flat=True) sgs_name = sgs_name.filter(course_id__in=courses_ids).autocomplete(name_auto=query) else: sgs_name = sgs_name.autocomplete(name_auto=query) for sg in sgs_name[:max_result]: result.append({ 'name': unicode(sg.object.name), 'year': unicode(sg.object.year), 'url': sg.object.get_absolute_url(), 'schools': [sch.name for sch in sg.object.school_set.all()], 'is_active': sg.object.is_active }) result_objs.append(sg.object) return result, result_objs
def autocomplete(model_name): model_names = [ m._meta.model_name for m in [Author, Container, Platform, Sponsor, Tag] ] if model_name not in model_names: abort(404) model = apps.get_model('citation', model_name) q = request.args.get('q') if model == Container: containers = Container.objects.filter( id__in=Publication.api.primary().values_list('container', flat=True)) if q: containers = containers.filter( Q(name__iregex=q) | Q(issn__iexact=q)) return jsonify( [dict(value=c.pk, label=c.name) for c in containers[:20]]) search_results = SearchQuerySet().models(model).order_by('name') if q: search_results = search_results.autocomplete(name=q) pks = [int(pk) for pk in search_results.values_list('pk', flat=True)] results = model.objects.filter(pk__in=pks)[:20] return jsonify([dict(value=r.pk, label=r.name) for r in results])
class LiveXapianAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveXapianAutocompleteTestCase, self).setUp() site = SearchSite() backend = SearchBackend(site=site) index = XapianAutocompleteMockModelSearchIndex(MockModel, backend=backend) site.register(MockModel, XapianAutocompleteMockModelSearchIndex) backend.update(index, MockModel.objects.all()) self.sq = SearchQuery(backend=backend) self.sqs = SearchQuerySet(query=self.sq) def tearDown(self): if os.path.exists(settings.HAYSTACK_XAPIAN_PATH): shutil.rmtree(settings.HAYSTACK_XAPIAN_PATH) super(LiveXapianAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'7', u'6', u'14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5)
def autocomplete(request): """View called when the url 'search/autocomplete/' is hit. It is called using a AJAX call when the user enters text Arguments: request {HttpRequest} -- Standard Django Request object Returns: [json] -- returns a json response containing a list of suggestions which would match the user's input. List set against a key 'suggestions' """ cur_user_org = get_current_org() if cur_user_org is None: sqs_org = SearchQuerySet().none() else: sqs_org = SearchQuerySet().filter(org_id=cur_user_org.id) sqs = sqs_org.autocomplete(device_name_auto=request.GET.get('query', '')) # TODO: [:5] at the end of the above sqs statement to display only top 5 suggestions = [result.object.name for result in sqs] # Make sure you return a JSON object, not a bare list. # Otherwise, you could be vulnerable to an XSS attack. the_data = json.dumps({'suggestions': suggestions}) return HttpResponse(the_data, content_type='application/json')
def get(self, request, format=None): query = request.GET.get('q', '').strip() sqs = SearchQuerySet().models(self.model_class) if query: sqs = sqs.autocomplete(name=query) data = [{'id': int(result.pk), 'name': result.name} for result in sqs] return Response(dumps(data))
def search_courses(query, user, max_result=None): result = [] result_objs = [] if query: user_is_staff = user.is_staff sgs_name = SearchQuerySet().models(Course).order_by('-is_active') if not user_is_staff: groups = user.group_set.all() courses_ids = (Course.objects.filter(groups__in=groups) | Course.objects.filter(teachers=user)) \ .values_list('id', flat=True) sgs_name = sgs_name.filter(course_id__in=courses_ids).autocomplete( name_auto=query) else: sgs_name = sgs_name.autocomplete(name_auto=query) for sg in sgs_name[:max_result]: result.append({ 'name': unicode(sg.object.name), 'year': unicode(sg.object.year), 'url': sg.object.get_absolute_url(), 'schools': [sch.name for sch in sg.object.school_set.all()], 'is_active': sg.object.is_active }) result_objs.append(sg.object) return result, result_objs
def get(self, request, format=None): query = request.GET.get('q', '').strip() sqs = SearchQuerySet().models(self.model_class) if query: sqs = sqs.autocomplete(name=query) data = [{'id': int(result.pk), 'name': result.name} for result in sqs] return Response(json.dumps(data))
class LiveWhooshAutocompleteTestCase(WhooshTestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveWhooshAutocompleteTestCase, self).setUp() # Stow. self.old_ui = connections['whoosh'].get_unified_index() self.ui = UnifiedIndex() self.wacsi = WhooshAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.wacsi]) self.sb = connections['whoosh'].get_backend() connections['whoosh']._index = self.ui # Stow. import haystack self.sb.setup() self.sqs = SearchQuerySet('whoosh') # Wipe it clean. self.sqs.query.backend.clear() self.wacsi.update(using='whoosh') def tearDown(self): connections['whoosh']._index = self.old_ui super(LiveWhooshAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'6', u'7', u'14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) def test_edgengram_regression(self): autocomplete = self.sqs.autocomplete(text_auto='ngm') self.assertEqual(autocomplete.count(), 0) def test_extra_whitespace(self): autocomplete = self.sqs.autocomplete(text_auto='mod ') self.assertEqual(autocomplete.count(), 5)
def search(self): if not self.is_valid(): return self.no_query_found() sqs = SearchQuerySet().models(Maintainer) if self.cleaned_data['q']: sqs = sqs.autocomplete(github=self.cleaned_data['q']) return sqs
def search(self): if not self.is_valid(): return self.no_query_found() sqs = SearchQuerySet().models(Variant) if self.cleaned_data['q']: sqs = sqs.autocomplete(variant=self.cleaned_data['q']) return sqs
class LiveWhooshAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveWhooshAutocompleteTestCase, self).setUp() # Stow. temp_path = os.path.join('tmp', 'test_whoosh_query') self.old_whoosh_path = getattr(settings, 'HAYSTACK_WHOOSH_PATH', temp_path) settings.HAYSTACK_WHOOSH_PATH = temp_path self.site = SearchSite() self.sb = SearchBackend(site=self.site) self.wacsi = WhooshAutocompleteMockModelSearchIndex(MockModel, backend=self.sb) self.site.register(MockModel, WhooshAutocompleteMockModelSearchIndex) # Stow. import haystack self.old_debug = settings.DEBUG settings.DEBUG = True self.old_site = haystack.site haystack.site = self.site self.sb.setup() self.sqs = SearchQuerySet(site=self.site) # Wipe it clean. self.sqs.query.backend.clear() for mock in MockModel.objects.all(): self.wacsi.update_object(mock) def tearDown(self): if os.path.exists(settings.HAYSTACK_WHOOSH_PATH): shutil.rmtree(settings.HAYSTACK_WHOOSH_PATH) settings.HAYSTACK_WHOOSH_PATH = self.old_whoosh_path import haystack haystack.site = self.old_site settings.DEBUG = self.old_debug super(LiveWhooshAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'14', u'7', u'6']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5)
def ask_autocomplete(request, language='en'): term = request.GET.get('term', '').strip().replace('<', '') if not term: return JsonResponse([], safe=False) sqs = SearchQuerySet().models(AnswerPage) sqs = sqs.autocomplete(autocomplete=term, language=language) results = [{ 'question': result.autocomplete, 'url': result.url } for result in sqs[:20]] return JsonResponse(results, safe=False)
def school_search_api(request): sqs = SearchQuerySet().models(School) sqs = sqs.autocomplete(autocomplete=request.GET.get('q', '')) document = [{'schoolname': school.text, 'id': school.school_id, 'city': school.city, 'state': school.state, 'url': reverse('disclosures:school-json', args=[school.school_id])} for school in sqs] json_doc = json.dumps(document) return HttpResponse(json_doc, content_type='application/json')
def school_search_api(request): sqs = SearchQuerySet().models(School) sqs = sqs.autocomplete(autocomplete=request.GET.get('q', '')) document = [{'schoolname': school.text, 'id': school.school_id, 'city': school.city, 'state': school.state, 'url': reverse('disclosures:school-json', args=[school.school_id])} for school in sqs] json_doc = json.dumps(document) return HttpResponse(json_doc, content_type='application/json')
def ask_autocomplete(request, language='en'): term = request.GET.get( 'term', '').strip().replace('<', '') if not term: return JsonResponse([], safe=False) if language == 'es': sqs = SearchQuerySet().models(SpanishAnswerProxy) else: sqs = SearchQuerySet().models(EnglishAnswerProxy) sqs = sqs.autocomplete(autocomplete=term) results = [{'question': result.autocomplete, 'url': result.url} for result in sqs[:20]] return JsonResponse(results, safe=False)
def autocomplete_search(request, q, model=None, max_results=5): q = replace(q) sqs = SearchQuerySet() if model is None: unified_index = get_haystack_unified_index() models = unified_index.get_indexed_models() models = [model for model in models if 'content_auto' in unified_index.get_index(model).fields] sqs = sqs.models(*models) else: sqs = sqs.models(model) sqs = filter_published(sqs, request) sqs = sqs.autocomplete(content_auto=q)[:max_results] return list(result_iterator(sqs))
def autocomplete(request): query = request.GET.get('query', '') jurisdiction = request.GET.get('jurisdiction', None) result = SearchQuerySet().models(PublicBody) result = result.autocomplete(name_auto=query) if jurisdiction is not None: result = result.filter(jurisdiction=result.query.clean(jurisdiction)) names = [u"%s (%s)" % (x.name, x.jurisdiction) for x in result] data = [{"name": x.name, "jurisdiction": x.jurisdiction, "id": x.pk, "url": x.url} for x in result] response = {"query": query, "suggestions": names, "data": data } return HttpResponse(json.dumps(response), content_type="application/json")
def school_search_api(request): sqs = SearchQuerySet().models(School) sqs = sqs.autocomplete(autocomplete=request.GET.get("q", "")) document = [ { "schoolname": school.text, "id": school.school_id, "city": school.city, "state": school.state, "url": reverse("disclosures:school-json", args=[school.school_id]), } for school in sqs ] json_doc = json.dumps(document) return HttpResponse(json_doc, content_type="application/json")
def autocomplete(request): """ """ # only autocomplete on concepts? acinp = request.GET.get("ac") if not acinp: return HttpResponse(status=501) sqs = SearchQuerySet() if (request.GET.get("onlyConcepts")): sqs = sqs.models(Concept) else: sqs = sqs.models(Concept, Roadmap) # concepts and roadmaps sqs = sqs.autocomplete(title=acinp).filter(is_listed_in_main_str="True")[:7] resp = [{"tag": acres.tag, "title": acres.title, "id": acres.id.split(".")[-1]} for acres in sqs] return HttpResponse(json.dumps(resp), "application/json")
def autocomplete(request): query = escape(request.GET.get('q', '')).strip() language_code = get_language_from_request(request, check_path=True) connection_alias = alias_from_language(language_code) sqs = SearchQuerySet(using=connection_alias) sqs = sqs.autocomplete(autocomplete=query) sqs = sqs.filter(language=language_code) if not request.user.is_authenticated(): sqs = sqs.exclude(login_required=True) suggestions = [] for result in sqs[:8]: suggestions.append({ # 'name': Highlighter(result.text).highlight(query), 'name': result.title, 'url': result.url, }) return JSONResponse(request, suggestions)
def school_search_api(request): form = SchoolSearchForm(request.GET) if form.is_valid(): sqs = SearchQuerySet().models(School) sqs = sqs.autocomplete(autocomplete=form.cleaned_data['q']) document = [{ 'schoolname': school.text, 'id': school.school_id, 'city': school.city, 'state': school.state, 'url': reverse('school-json', args=[school.school_id]) } for school in sqs] else: document = [] json_doc = json.dumps(document) return HttpResponse(json_doc, content_type='application/json')
def searchInterestByUser(request): user = request.user if user.is_anonymous: return Response('Anonymous user is not allowed', status=status.HTTP_400_BAD_REQUEST) q = request.GET.get('q', '') if q is '': return Response(data=[], status=status.HTTP_200_OK) sqsUser = SearchQuerySet().models(Interest).filter( id__in=user.interests.all().values_list('id', flat=True)) sqs = sqsUser.filter(name__contains=q) if sqs.count() == 0: #if len(sqs) == 0: sqs = sqsUser.autocomplete(autocomplete_search=q) serializer_list = [] for sqs_element in sqs: interest = Interest.objects.get(id=sqs_element.object.id) serializer_list.append(interest) serializer = InterestSearchSerializer(serializer_list, many=True) return Response(data=serializer.data, status=status.HTTP_200_OK)
def autocomplete(request): """ """ # only autocomplete on concepts? acinp = request.GET.get("ac") if not acinp: return HttpResponse(status=501) sqs = SearchQuerySet() if (request.GET.get("onlyConcepts")): sqs = sqs.models(Concept) else: sqs = sqs.models(Concept, Roadmap) # concepts and roadmaps sqs = sqs.autocomplete(title=acinp).filter( is_listed_in_main_str="True")[:7] resp = [{ "tag": acres.tag, "title": acres.title, "id": acres.id.split(".")[-1] } for acres in sqs] return HttpResponse(json.dumps(resp), "application/json")
def autocomplete(request, model=None, filters=None, max_results=MAX_RESULTS, query_term=DEFAULT_QUERY_TERM): """ autocomplete template. It intends to be used as a helper inside another view and not as a standalone view. *request* is a traditional GET request object send to a view *model* is the model to filter. If none, global SearchQuerySet is used *filters* is a list of filter strings to search for (inside *request.GET*) *max_results* is the maximum number of results to send. Defaults to 10 *query_term* is the term string to get from the *request.GET* object and kickstart the search """ q = request.GET.get(query_term) if not q: return [] q = clean_accents(q) if model is not None: results = SearchQuerySet().models(model) else: results = SearchQuerySet() if not filters: filters = [] for filter_field in filters: filter_q = request.GET.get(filter_field, None) if filter_q: results = results.filter(**{filter_field: filter_q}) # Lazy Evaluation results = results.autocomplete(content_auto=q)[:max_results] results = [r.object for r in results if r.object] return results
def autocomplete_results(self, query): """Return the results of autocompleting the resource with ``query``.""" qs = SearchQuerySet() return qs.autocomplete(name_auto=query)
def search_users(query, user, max_result=None): result = [] result_objs = [] if query: user_is_staff = user.is_staff user_is_teacher = None if not user_is_staff: user_is_teacher = True if Course.objects.filter( teachers=user).count() else False sgs = SearchQuerySet().models(UserProfile).exclude(user_id=user.id) sgs_fullname = sgs.autocomplete(fullname_auto=query) sgs_login = sgs.autocomplete(login_auto=query) if user_is_staff or user_is_teacher: sgs_ya_contest_login = sgs.autocomplete( ya_contest_login_auto=query) sgs_ya_passport_email = sgs.autocomplete( ya_passport_email_auto=query) sgs_email = sgs.autocomplete(email_auto=query) else: sgs_ya_contest_login = sgs.none() sgs_ya_passport_email = sgs.none() sgs_email = sgs.none() sgs = sgs_fullname | sgs_login | sgs_ya_contest_login | sgs_ya_passport_email | sgs_email if not user_is_staff: groups = user.group_set.all() courses = Course.objects.filter(groups__in=groups) schools = School.objects.filter(courses__in=courses) courses_teacher = Course.objects.filter(teachers=user) schools_teacher = School.objects.filter( courses__in=courses_teacher) for sg in sgs: user_to_show = sg.object.user groups_user_to_show = user_to_show.group_set.all() courses_user_to_show = Course.objects.filter( groups__in=groups_user_to_show) schools_user_to_show = School.objects.filter( courses__in=courses_user_to_show) courses_user_to_show_teacher = Course.objects.filter( teachers=user_to_show) schools_user_to_show_teacher = School.objects.filter( courses__in=courses_user_to_show_teacher) user_school_user_to_show = False if (schools_user_to_show | schools_user_to_show_teacher) & ( schools | schools_teacher): user_school_user_to_show = True if not user_school_user_to_show: continue user_to_show_teach_user = False if courses_user_to_show_teacher & courses: user_to_show_teach_user = True user_teach_user_to_show = False if courses_teacher & courses_user_to_show: user_teach_user_to_show = True show_email = \ sg.object.show_email or \ user_teach_user_to_show or \ user_to_show_teach_user result.append({ "fullname": user_to_show.get_full_name(), "username": user_to_show.username, "ya_contest_login": sg.object.ya_contest_login if user_is_teacher else '', "url": user_to_show.get_absolute_url(), "avatar": sg.object.avatar.url if sg.object.avatar else '', "email": user_to_show.email if show_email else '', "ya_passport_email": sg.object.ya_passport_email if show_email else '', "id": user_to_show.id, "statuses": list(sg.object.user_status.values_list('name', 'color')) }) result_objs.append(sg.object) if len(result) == max_result: break else: for sg in sgs[:max_result]: result.append({ "fullname": sg.object.user.get_full_name(), "username": sg.object.user.username, "ya_contest_login": sg.object.ya_contest_login, "url": sg.object.user.get_absolute_url(), "avatar": sg.object.avatar.url if sg.object.avatar else '', "email": sg.object.user.email, "ya_passport_email": sg.object.ya_passport_email, "id": sg.object.user.id, "statuses": list(sg.object.user_status.values_list('name', 'color')) }) result_objs.append(sg.object) return result, result_objs
class LiveElasticsearchAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveElasticsearchAutocompleteTestCase, self).setUp() # Stow. self.old_ui = connections['default'].get_unified_index() self.ui = UnifiedIndex() self.smmi = ElasticsearchAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.smmi]) connections['default']._index = self.ui self.sqs = SearchQuerySet() # Wipe it clean. clear_elasticsearch_index() # Reboot the schema. self.sb = connections['default'].get_backend() self.sb.setup() self.smmi.update() def tearDown(self): # Restore. connections['default']._index = self.old_ui super(LiveElasticsearchAutocompleteTestCase, self).tearDown() def test_build_schema(self): self.sb = connections['default'].get_backend() content_name, mapping = self.sb.build_schema(self.ui.all_searchfields()) self.assertEqual(mapping, { 'name_auto': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'edgengram_analyzer', 'boost': 1.0, 'store': 'yes' }, 'text': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'snowball', 'boost': 1.0, 'store': 'yes' }, 'pub_date': { 'index': 'analyzed', 'boost': 1.0, 'store': 'yes', 'type': 'date' }, 'name': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'snowball', 'boost': 1.0, 'store': 'yes' }, 'text_auto': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'edgengram_analyzer', 'boost': 1.0, 'store': 'yes' } }) def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'14', u'6', u'7']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) # Test multiple words. autocomplete_2 = self.sqs.autocomplete(text_auto='your mod') self.assertEqual(autocomplete_2.count(), 3) self.assertEqual([result.pk for result in autocomplete_2], ['1', '14', '6']) self.assertTrue('your' in autocomplete_2[0].text.lower()) self.assertTrue('mod' in autocomplete_2[0].text.lower()) self.assertTrue('your' in autocomplete_2[1].text.lower()) self.assertTrue('mod' in autocomplete_2[1].text.lower()) self.assertTrue('your' in autocomplete_2[2].text.lower()) self.assertTrue('mod' in autocomplete_2[2].text.lower()) self.assertEqual(len([result.pk for result in autocomplete_2]), 3) # Test multiple fields. autocomplete_3 = self.sqs.autocomplete(text_auto='Django', name_auto='dan') self.assertEqual(autocomplete_3.count(), 4) self.assertEqual([result.pk for result in autocomplete_3], ['12', '1', '14', '22']) self.assertEqual(len([result.pk for result in autocomplete_3]), 4)
def search_users(query, user, max_result=None): result = [] result_objs = [] if query: user_is_staff = user.is_staff user_is_teacher = None if not user_is_staff: user_is_teacher = True if Course.objects.filter(teachers=user).count() else False sgs = SearchQuerySet().models(UserProfile).exclude(user_id=user.id) sgs_fullname = sgs.autocomplete(fullname_auto=query) sgs_login = sgs.autocomplete(login_auto=query) if user_is_staff or user_is_teacher: sgs_ya_contest_login = sgs.autocomplete(ya_contest_login_auto=query) sgs_ya_passport_email = sgs.autocomplete(ya_passport_email_auto=query) sgs_email = sgs.autocomplete(email_auto=query) else: sgs_ya_contest_login = sgs.none() sgs_ya_passport_email = sgs.none() sgs_email = sgs.none() sgs = sgs_fullname | sgs_login | sgs_ya_contest_login | sgs_ya_passport_email | sgs_email if not user_is_staff: groups = user.group_set.all() courses = Course.objects.filter(groups__in=groups) schools = School.objects.filter(courses__in=courses) courses_teacher = Course.objects.filter(teachers=user) schools_teacher = School.objects.filter(courses__in=courses_teacher) for sg in sgs: user_to_show = sg.object.user groups_user_to_show = user_to_show.group_set.all() courses_user_to_show = Course.objects.filter(groups__in=groups_user_to_show) schools_user_to_show = School.objects.filter(courses__in=courses_user_to_show) courses_user_to_show_teacher = Course.objects.filter(teachers=user_to_show) schools_user_to_show_teacher = School.objects.filter(courses__in=courses_user_to_show_teacher) user_school_user_to_show = False if (schools_user_to_show | schools_user_to_show_teacher) & (schools | schools_teacher): user_school_user_to_show = True if not user_school_user_to_show: continue user_to_show_teach_user = False if courses_user_to_show_teacher & courses: user_to_show_teach_user = True user_teach_user_to_show = False if courses_teacher & courses_user_to_show: user_teach_user_to_show = True show_email = \ sg.object.show_email or \ user_teach_user_to_show or \ user_to_show_teach_user result.append({ "fullname": user_to_show.get_full_name(), "username": user_to_show.username, "ya_contest_login": sg.object.ya_contest_login if user_is_teacher else '', "url": user_to_show.get_absolute_url(), "avatar": sg.object.avatar.url if sg.object.avatar else '', "email": user_to_show.email if show_email else '', "ya_passport_email": sg.object.ya_passport_email if show_email else '', "id": user_to_show.id, "statuses": list(sg.object.user_status.values_list('name', 'color')) }) result_objs.append(sg.object) if len(result) == max_result: break else: for sg in sgs[:max_result]: result.append({ "fullname": sg.object.user.get_full_name(), "username": sg.object.user.username, "ya_contest_login": sg.object.ya_contest_login, "url": sg.object.user.get_absolute_url(), "avatar": sg.object.avatar.url if sg.object.avatar else '', "email": sg.object.user.email, "ya_passport_email": sg.object.ya_passport_email, "id": sg.object.user.id, "statuses": list(sg.object.user_status.values_list('name', 'color')) }) result_objs.append(sg.object) return result, result_objs
def search_in_model(model, q, max_results): q = replace(q) sqs = SearchQuerySet().models(model) sqs = sqs.autocomplete(content_auto=q).boost(q + "*", 10)[:max_results] q = q.lower() return [r.object for r in sqs if q in r.get_stored_fields()["content_auto"].lower()]
class LiveElasticsearchAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveElasticsearchAutocompleteTestCase, self).setUp() # Stow. self.old_ui = connections['default'].get_unified_index() self.ui = UnifiedIndex() self.smmi = ElasticsearchAutocompleteMockModelSearchIndex() self.ui.build(indexes=[self.smmi]) connections['default']._index = self.ui self.sqs = SearchQuerySet() # Wipe it clean. clear_elasticsearch_index() # Reboot the schema. self.sb = connections['default'].get_backend() self.sb.setup() self.smmi.update() def tearDown(self): # Restore. connections['default']._index = self.old_ui super(LiveElasticsearchAutocompleteTestCase, self).tearDown() def test_build_schema(self): self.sb = connections['default'].get_backend() content_name, mapping = self.sb.build_schema(self.ui.all_searchfields()) self.assertEqual(mapping, { 'name_auto': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'edgengram_analyzer', 'boost': 1.0, 'store': 'yes' }, 'text': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'snowball', 'boost': 1.0, 'store': 'yes' }, 'pub_date': { 'index': 'analyzed', 'boost': 1.0, 'store': 'yes', 'type': 'date' }, 'name': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'snowball', 'boost': 1.0, 'store': 'yes' }, 'text_auto': { 'index': 'analyzed', 'term_vector': 'with_positions_offsets', 'type': 'string', 'analyzer': 'edgengram_analyzer', 'boost': 1.0, 'store': 'yes' } }) def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], [u'1', u'12', u'14', u'6', u'7']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) # Test multiple words. autocomplete_2 = self.sqs.autocomplete(text_auto='your mod') self.assertEqual(autocomplete_2.count(), 3) self.assertEqual([result.pk for result in autocomplete_2], ['1', '14', '6']) self.assertTrue('your' in autocomplete_2[0].text.lower()) self.assertTrue('mod' in autocomplete_2[0].text.lower()) self.assertTrue('your' in autocomplete_2[1].text.lower()) self.assertTrue('mod' in autocomplete_2[1].text.lower()) self.assertTrue('your' in autocomplete_2[2].text.lower()) self.assertTrue('mod' in autocomplete_2[2].text.lower()) self.assertEqual(len([result.pk for result in autocomplete_2]), 3) # Test multiple fields. autocomplete_3 = self.sqs.autocomplete(text_auto='Django', name_auto='dan') self.assertEqual(autocomplete_3.count(), 4) self.assertEqual([result.pk for result in autocomplete_3], ['12', '1', '14', '22']) self.assertEqual(len([result.pk for result in autocomplete_3]), 4)
class LiveSolrAutocompleteTestCase(TestCase): fixtures = ['bulk_data.json'] def setUp(self): super(LiveSolrAutocompleteTestCase, self).setUp() # Wipe it clean. clear_solr_index() # With the models registered, you get the proper bits. import haystack from haystack.sites import SearchSite # Stow. self.old_site = haystack.site test_site = SearchSite() test_site.register(MockModel, SolrAutocompleteMockModelSearchIndex) haystack.site = test_site self.sqs = SearchQuerySet() test_site.get_index(MockModel).update() def tearDown(self): # Restore. import haystack haystack.site = self.old_site super(LiveSolrAutocompleteTestCase, self).tearDown() def test_autocomplete(self): autocomplete = self.sqs.autocomplete(text_auto='mod') self.assertEqual(autocomplete.count(), 5) self.assertEqual([result.pk for result in autocomplete], ['1', '12', '6', '7', '14']) self.assertTrue('mod' in autocomplete[0].text.lower()) self.assertTrue('mod' in autocomplete[1].text.lower()) self.assertTrue('mod' in autocomplete[2].text.lower()) self.assertTrue('mod' in autocomplete[3].text.lower()) self.assertTrue('mod' in autocomplete[4].text.lower()) self.assertEqual(len([result.pk for result in autocomplete]), 5) # Test multiple words. autocomplete_2 = self.sqs.autocomplete(text_auto='your mod') self.assertEqual(autocomplete_2.count(), 3) self.assertEqual([result.pk for result in autocomplete_2], ['1', '14', '6']) self.assertTrue('your' in autocomplete_2[0].text.lower()) self.assertTrue('mod' in autocomplete_2[0].text.lower()) self.assertTrue('your' in autocomplete_2[1].text.lower()) self.assertTrue('mod' in autocomplete_2[1].text.lower()) self.assertTrue('your' in autocomplete_2[2].text.lower()) self.assertTrue('mod' in autocomplete_2[2].text.lower()) self.assertEqual(len([result.pk for result in autocomplete_2]), 3) # Test multiple fields. autocomplete_3 = self.sqs.autocomplete(text_auto='Django', name_auto='dan') self.assertEqual(autocomplete_3.count(), 4) self.assertEqual([result.pk for result in autocomplete_3], ['12', '1', '14', '22']) self.assertEqual(len([result.pk for result in autocomplete_3]), 4)