summaryrefslogtreecommitdiff
path: root/ishtar_common/rest.py
blob: 8b4419e82b9c18753eec99431eb6ffb57e06c3bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from rest_framework import authentication, permissions
from rest_framework.response import Response
from rest_framework.views import APIView

from ishtar_common.models import ApiSearchModel
from ishtar_common.views_item import get_item


class IpModelPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if not request.user or not getattr(request.user, "apiuser", None):
            return False
        ip_addr = request.META['REMOTE_ADDR']
        q = view.search_model_query(request).filter(user__ip=ip_addr)
        return bool(q.count())


class SearchAPIView(APIView):
    model = None
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated, IpModelPermission)

    def __init__(self, **kwargs):
        assert self.model is not None
        super(SearchAPIView, self).__init__(**kwargs)

    def search_model_query(self, request):
        return ApiSearchModel.objects.filter(
            user=request.user.apiuser,
            content_type__app_label=self.model._meta.app_label,
            content_type__model=self.model._meta.model_name)

    def get(self, request, format=None):
        _get_item = get_item(
            self.model, "get_" + self.model.SLUG, self.model.SLUG,
            # TODO: own_table_cols=get_table_cols_for_ope() - adapt columns
        )
        search_model = self.search_model_query(request).all()[0]
        if search_model.limit_query:
            query = search_model.limit_query
            if request.GET.get("search_vector", None):
                query += " " + request.GET.get("search_vector")
            request.GET._mutable = True
            request.GET["search_vector"] = query
            request.GET._mutable = False
        response = _get_item(request)
        return response
        #return Response({})