93 lines
2.7 KiB
Python
93 lines
2.7 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):
|
|
"""
|
|
get: Perform a search operation
|
|
"""
|
|
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):
|
|
"""
|
|
get: Perform an advanced search operation
|
|
"""
|
|
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):
|
|
"""
|
|
get: Returns a list of all the available search models.
|
|
"""
|
|
serializer_class = SearchModelSerializer
|
|
queryset = SearchModel.all()
|