mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	added autocomplete to backend
This commit is contained in:
		| @@ -75,6 +75,7 @@ def update_document(writer, doc): | |||||||
|         content=doc.content |         content=doc.content | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|  |  | ||||||
| @receiver(models.signals.post_save, sender=Document) | @receiver(models.signals.post_save, sender=Document) | ||||||
| def add_document_to_index(sender, instance, **kwargs): | def add_document_to_index(sender, instance, **kwargs): | ||||||
|     ix = open_index() |     ix = open_index() | ||||||
| @@ -102,3 +103,13 @@ def query_index(ix, querystr): | |||||||
|              'score': r.score, |              'score': r.score, | ||||||
|              'title': r['title'] |              'title': r['title'] | ||||||
|              } for r in results] |              } for r in results] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def autocomplete(ix, term, limit=10): | ||||||
|  |     with ix.reader() as reader: | ||||||
|  |         terms = [] | ||||||
|  |         for t in reader.expand_prefix("content", term.lower()): | ||||||
|  |             terms.append(t) | ||||||
|  |             if len(terms) >= limit: | ||||||
|  |                 break | ||||||
|  |         return terms | ||||||
|   | |||||||
| @@ -151,7 +151,11 @@ class LogViewSet(ReadOnlyModelViewSet): | |||||||
|  |  | ||||||
|  |  | ||||||
| class SearchView(APIView): | class SearchView(APIView): | ||||||
|  |  | ||||||
|  |     permission_classes = (IsAuthenticated,) | ||||||
|  |  | ||||||
|     ix = index.open_index() |     ix = index.open_index() | ||||||
|  |  | ||||||
|     def get(self, request, format=None): |     def get(self, request, format=None): | ||||||
|         if 'query' in request.query_params: |         if 'query' in request.query_params: | ||||||
|             query = request.query_params['query'] |             query = request.query_params['query'] | ||||||
| @@ -162,3 +166,26 @@ class SearchView(APIView): | |||||||
|             return Response(query_results) |             return Response(query_results) | ||||||
|         else: |         else: | ||||||
|             return Response([]) |             return Response([]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class SearchAutoCompleteView(APIView): | ||||||
|  |  | ||||||
|  |     permission_classes = (IsAuthenticated,) | ||||||
|  |  | ||||||
|  |     ix = index.open_index() | ||||||
|  |  | ||||||
|  |     def get(self, request, format=None): | ||||||
|  |         if 'term' in request.query_params: | ||||||
|  |             term = request.query_params['term'] | ||||||
|  |         else: | ||||||
|  |             term = None | ||||||
|  |  | ||||||
|  |         if 'limit' in request.query_params: | ||||||
|  |             limit = int(request.query_params['limit']) | ||||||
|  |         else: | ||||||
|  |             limit = 10 | ||||||
|  |  | ||||||
|  |         if term is not None: | ||||||
|  |             return Response(index.autocomplete(self.ix, term, limit)) | ||||||
|  |         else: | ||||||
|  |             return Response([]) | ||||||
|   | |||||||
| @@ -11,7 +11,8 @@ from documents.views import ( | |||||||
|     TagViewSet, |     TagViewSet, | ||||||
|     DocumentTypeViewSet, |     DocumentTypeViewSet, | ||||||
|     SearchView, |     SearchView, | ||||||
|     IndexView |     IndexView, | ||||||
|  |     SearchAutoCompleteView | ||||||
| ) | ) | ||||||
|  |  | ||||||
| api_router = DefaultRouter() | api_router = DefaultRouter() | ||||||
| @@ -26,6 +27,7 @@ urlpatterns = [ | |||||||
|  |  | ||||||
|     # API |     # API | ||||||
|     url(r"^api/auth/",include(('rest_framework.urls', 'rest_framework'), namespace="rest_framework")), |     url(r"^api/auth/",include(('rest_framework.urls', 'rest_framework'), namespace="rest_framework")), | ||||||
|  |     url(r"^api/search/autocomplete/", SearchAutoCompleteView.as_view(), name="autocomplete"), | ||||||
|     url(r"^api/search/", SearchView.as_view(), name="search"), |     url(r"^api/search/", SearchView.as_view(), name="search"), | ||||||
|     url(r"^api/token/", views.obtain_auth_token), url(r"^api/", include((api_router.urls, 'drf'), namespace="drf")), |     url(r"^api/token/", views.obtain_auth_token), url(r"^api/", include((api_router.urls, 'drf'), namespace="drf")), | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jonas Winkler
					Jonas Winkler