Пример #1
0
 def test_search(self):
     """ search all connectors """
     results = connector_manager.search("Example")
     self.assertEqual(len(results), 1)
     self.assertIsInstance(results[0]["connector"], SelfConnector)
     self.assertEqual(len(results[0]["results"]), 1)
     self.assertEqual(results[0]["results"][0].title, "Example Edition")
Пример #2
0
 def test_search_isbn(self):
     """ special handling if a query resembles an isbn """
     results = connector_manager.search("0000000000")
     self.assertEqual(len(results), 1)
     self.assertIsInstance(results[0]["connector"], SelfConnector)
     self.assertEqual(len(results[0]["results"]), 1)
     self.assertEqual(results[0]["results"][0].title, "Example Edition")
Пример #3
0
 def test_search(self):
     ''' search all connectors '''
     results = connector_manager.search('Example')
     self.assertEqual(len(results), 1)
     self.assertIsInstance(results[0]['connector'], SelfConnector)
     self.assertEqual(len(results[0]['results']), 1)
     self.assertEqual(results[0]['results'][0].title, 'Example Edition')
Пример #4
0
def book_search(query, _, min_confidence, search_remote=False):
    """the real business is elsewhere"""
    if search_remote:
        return connector_manager.search(query, min_confidence=min_confidence)
    results = connector_manager.local_search(query, min_confidence=min_confidence)
    if not results:
        return None
    return [{"results": results}]
Пример #5
0
def book_search(query, user, min_confidence, search_remote=False):
    """the real business is elsewhere"""
    # try a local-only search
    results = [{"results": search(query, min_confidence=min_confidence)}]
    if not user.is_authenticated or (results[0]["results"] and not search_remote):
        return results, False

    # if there were no local results, or the request was for remote, search all sources
    results += connector_manager.search(query, min_confidence=min_confidence)
    return results, True
Пример #6
0
def book_search(query, _, min_confidence, search_remote=False):
    """the real business is elsewhere"""
    # try a local-only search
    if not search_remote:
        results = connector_manager.local_search(query,
                                                 min_confidence=min_confidence)
        if results:
            # gret, we found something
            return [{"results": results}], False
    # if there weere no local results, or the request was for remote, search all sources
    return connector_manager.search(query, min_confidence=min_confidence), True
Пример #7
0
 def test_search_isbn(self):
     """special handling if a query resembles an isbn"""
     responses.add(
         responses.GET,
         "http://fake.ciom/isbn/0000000000",
         json={},
     )
     results = connector_manager.search("0000000000")
     self.assertEqual(len(results), 1)
     self.assertIsInstance(results[0]["connector"], SelfConnector)
     self.assertEqual(len(results[0]["results"]), 1)
     self.assertEqual(results[0]["results"][0].title, "Example Edition")
Пример #8
0
 def test_search(self):
     """search all connectors"""
     responses.add(
         responses.GET,
         "http://fake.ciom/search/Example?min_confidence=0.1",
         json={},
     )
     results = connector_manager.search("Example")
     self.assertEqual(len(results), 1)
     self.assertIsInstance(results[0]["connector"], SelfConnector)
     self.assertEqual(len(results[0]["results"]), 1)
     self.assertEqual(results[0]["results"][0].title, "Example Edition")
Пример #9
0
 def test_search_isbn(self):
     """special handling if a query resembles an isbn"""
     responses.add(
         responses.GET,
         "http://fake.ciom/isbn/0000000000",
         json=[{
             "title": "Hello",
             "key": "https://www.example.com/search/1"
         }],
     )
     results = connector_manager.search("0000000000")
     self.assertEqual(len(results), 1)
     self.assertEqual(len(results[0]["results"]), 1)
     self.assertEqual(results[0]["connector"].identifier,
                      "test_connector_remote")
     self.assertEqual(results[0]["results"][0].title, "Hello")
Пример #10
0
 def test_search_plaintext(self):
     """search all connectors"""
     responses.add(
         responses.GET,
         "http://fake.ciom/search/Example?min_confidence=0.1",
         json=[{
             "title": "Hello",
             "key": "https://www.example.com/search/1"
         }],
     )
     results = connector_manager.search("Example")
     self.assertEqual(len(results), 1)
     self.assertEqual(len(results[0]["results"]), 1)
     self.assertEqual(results[0]["connector"].identifier,
                      "test_connector_remote")
     self.assertEqual(results[0]["results"][0].title, "Hello")
Пример #11
0
    def get(self, request):
        ''' that search bar up top '''
        query = request.GET.get('q')
        min_confidence = request.GET.get('min_confidence', 0.1)

        if is_api_request(request):
            # only return local book results via json so we don't cascade
            book_results = connector_manager.local_search(
                query, min_confidence=min_confidence)
            return JsonResponse([r.json() for r in book_results], safe=False)

        # use webfinger for mastodon style [email protected] username
        if re.match(r'\B%s' % regex.full_username, query):
            handle_remote_webfinger(query)

        # do a  user search
        user_results = models.User.objects.annotate(
            similarity=Greatest(
                TrigramSimilarity('username', query),
                TrigramSimilarity('localname', query),
            )
        ).filter(
            similarity__gt=0.5,
        ).order_by('-similarity')[:10]

        # any relevent lists?
        list_results = privacy_filter(
            request.user, models.List.objects, ['public', 'followers']
        ).annotate(
            similarity=Greatest(
                TrigramSimilarity('name', query),
                TrigramSimilarity('description', query),
            )
        ).filter(
            similarity__gt=0.1,
        ).order_by('-similarity')[:10]

        book_results = connector_manager.search(
            query, min_confidence=min_confidence)
        data = {
            'title': 'Search Results',
            'book_results': book_results,
            'user_results': user_results,
            'list_results': list_results,
            'query': query,
        }
        return TemplateResponse(request, 'search_results.html', data)
Пример #12
0
    def get(self, request):
        """ that search bar up top """
        query = request.GET.get("q")
        min_confidence = request.GET.get("min_confidence", 0.1)

        if is_api_request(request):
            # only return local book results via json so we don't cascade
            book_results = connector_manager.local_search(
                query, min_confidence=min_confidence)
            return JsonResponse([r.json() for r in book_results], safe=False)

        # use webfinger for mastodon style [email protected] username
        if re.match(r"\B%s" % regex.full_username, query):
            handle_remote_webfinger(query)

        # do a  user search
        user_results = (models.User.viewer_aware_objects(
            request.user).annotate(similarity=Greatest(
                TrigramSimilarity("username", query),
                TrigramSimilarity("localname", query),
            )).filter(similarity__gt=0.5, ).order_by("-similarity")[:10])

        # any relevent lists?
        list_results = (privacy_filter(
            request.user,
            models.List.objects,
            privacy_levels=["public", "followers"],
        ).annotate(similarity=Greatest(
            TrigramSimilarity("name", query),
            TrigramSimilarity("description", query),
        )).filter(similarity__gt=0.1, ).order_by("-similarity")[:10])

        book_results = connector_manager.search(query,
                                                min_confidence=min_confidence)
        data = {
            "book_results": book_results,
            "user_results": user_results,
            "list_results": list_results,
            "query": query,
        }
        return TemplateResponse(request, "search_results.html", data)
Пример #13
0
 def test_search_empty_query(self):
     """don't panic on empty queries"""
     results = connector_manager.search("")
     self.assertEqual(results, [])