Files
mayan-edms/mayan/apps/dynamic_search/api_views.py
2018-04-01 18:38:53 -04:00

115 lines
3.4 KiB
Python

from __future__ import unicode_literals
from django.utils.encoding import force_text
from rest_framework import generics
from rest_framework.exceptions import ParseError
from rest_api.filters import MayanObjectPermissionsFilter
from .classes import SearchModel
from .mixins import SearchModelMixin
from .serializers import SearchModelSerializer
class APISearchView(SearchModelMixin, generics.ListAPIView):
"""
Perform a search operation
---
GET:
omit_serializer: true
parameters:
- name: q
paramType: query
type: string
description: Term that will be used for the search.
"""
filter_backends = (MayanObjectPermissionsFilter,)
def get_queryset(self):
search_model = self.get_search_model()
# Override serializer class just before producing the queryset of
# search results
self.serializer_class = search_model.serializer
if search_model.permission:
self.mayan_object_permissions = {'GET': (search_model.permission,)}
try:
queryset, timedelta = search_model.search(
query_string=self.request.GET, user=self.request.user
)
except Exception as exception:
raise ParseError(force_text(exception))
return queryset
def get_serializer(self, *args, **kwargs):
if self.get_search_model_name():
return super(APISearchView, self).get_serializer(*args, **kwargs)
else:
return None
class APIAdvancedSearchView(SearchModelMixin, generics.ListAPIView):
"""
Perform an advanced search operation
---
GET:
omit_serializer: true
parameters:
- name: _match_all
paramType: query
type: string
description: When checked, only results that match all fields will be returned. When unchecked results that match at least one field will be returned. Possible values are "on" or "off"
"""
filter_backends = (MayanObjectPermissionsFilter,)
def get_queryset(self):
self.search_model = self.get_search_model()
# Override serializer class just before producing the queryset of
# search results
self.serializer_class = self.search_model.serializer
if self.search_model.permission:
self.mayan_object_permissions = {
'GET': (self.search_model.permission,)
}
if self.request.GET.get('_match_all', 'off') == 'on':
global_and_search = True
else:
global_and_search = False
try:
queryset, timedelta = self.search_model.search(
query_string=self.request.GET, user=self.request.user,
global_and_search=global_and_search
)
except Exception as exception:
raise ParseError(force_text(exception))
return queryset
def get_serializer(self, *args, **kwargs):
if self.get_search_model_name():
return super(APISearchView, self).get_serializer(*args, **kwargs)
else:
return None
class APISearchModelList(generics.ListAPIView):
serializer_class = SearchModelSerializer
queryset = SearchModel.all()
def get(self, *args, **kwargs):
"""
Returns a list of all the available search models.
"""
return super(APISearchModelList, self).get(*args, **kwargs)