Mentions légales du service

Skip to content
Snippets Groups Projects

WIP Feature/search

Open Robin Tissot requested to merge feature/search into feature/polygons
Files
19
+ 27
0
@@ -2,7 +2,9 @@ import itertools
import logging
from django.db.models import Prefetch, Count
from django.urls import reverse
from elasticsearch.exceptions import RequestError
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status
@@ -11,6 +13,7 @@ from rest_framework.pagination import PageNumberPagination
from api.serializers import *
from core.models import *
from core.search import DocumentPartESDocument
from imports.forms import ImportForm, ExportForm
from imports.parsers import ParseError
from versioning.models import NoChangeException
@@ -74,6 +77,30 @@ class DocumentViewSet(ModelViewSet):
return form.stream()
else:
return self.form_error(json.dumps(form.errors))
@action(detail=True, methods=['get'])
def search(self, request, pk=None):
document = self.get_object()
fields = ['title', 'content'] + ['content_{}'.format(lang.iso_code)
for lang in document.languages.all()]
esq = (DocumentPartESDocument.search()
.filter('term', document_pk=document.pk)
.query('multi_match',
query=request.GET.get('q'), fields=fields)
.highlight('content', fragment_size=50))
self.paginate_queryset(esq)
try:
results = esq.execute()
except RequestError as e:
return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)
return self.get_paginated_response([dict(part.to_dict(),
**{'meta': part.meta.to_dict(),
'uri': reverse('document-part-edit',
kwargs={'pk': document.pk,
'part_pk': part.meta.id})
})
for part in results])
class PartViewSet(ModelViewSet):
Loading