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")
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")
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')
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}]
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
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
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")
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")
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")
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")
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)
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)
def test_search_empty_query(self): """don't panic on empty queries""" results = connector_manager.search("") self.assertEqual(results, [])