Пример #1
0
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")
Пример #2
0
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())
Пример #3
0
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)
Пример #4
0
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)
Пример #7
0
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)
Пример #9
0
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)
Пример #10
0
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)
Пример #11
0
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')
Пример #12
0
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
Пример #13
0
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])
Пример #14
0
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)
Пример #15
0
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')
Пример #16
0
 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))
Пример #17
0
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
Пример #18
0
 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)
Пример #20
0
    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
Пример #21
0
    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
Пример #22
0
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)
Пример #23
0
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)
Пример #24
0
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')
Пример #25
0
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')
Пример #26
0
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)
Пример #27
0
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))
Пример #28
0
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")
Пример #29
0
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")
Пример #30
0
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")
Пример #31
0
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')
Пример #33
0
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)
Пример #34
0
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")
Пример #35
0
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
Пример #36
0
 def autocomplete_results(self, query):
     """Return the results of autocompleting the resource with ``query``."""
     qs = SearchQuerySet()
     return qs.autocomplete(name_auto=query)
Пример #37
0
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
Пример #38
0
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)
Пример #39
0
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
Пример #40
0
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)
Пример #42
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)