1010from rest_framework .decorators import action
1111from deep .permissions import ModifyPermission
1212from project .models import Project
13+ from utils .common import parse_number
14+
1315from .serializers import (
1416 SourceSerializer ,
1517 SourceDataSerializer ,
2426 ConnectorProject ,
2527)
2628from .sources .store import source_store
29+ from .sources .base import Source
2730
2831
2932class SourceViewSet (viewsets .ViewSet ):
@@ -45,7 +48,13 @@ class SourceQueryView(views.APIView):
4548 def query (self , source_type , query , params ):
4649 source = source_store [source_type ]()
4750 method = getattr (source , 'query_{}' .format (query ))
48- results = method (params )
51+
52+ query_params = self .request .query_params
53+
54+ limit = parse_number (query_params .get ('limit' ))
55+ offset = parse_number (query_params .get ('offset' ))
56+
57+ results = method (params , limit , offset )
4958
5059 if isinstance (results , list ):
5160 return response .Response ({
@@ -112,8 +121,8 @@ def get_leads(self, request, pk=None, version=None):
112121 project_id = request .data .pop ('project' , None )
113122 project = project_id and Project .objects .get (id = project_id )
114123
115- offset = request .data .pop ('offset' , None )
116- limit = request .data .pop ('limit' , None )
124+ offset = request .data .pop ('offset' , None ) or 0
125+ limit = request .data .pop ('limit' , None ) or Source . DEFAULT_PER_PAGE
117126
118127 params = {
119128 ** (connector .params or {}),
@@ -122,6 +131,12 @@ def get_leads(self, request, pk=None, version=None):
122131
123132 source = source_store [connector .source ]()
124133 data , count = source .fetch (params , offset , limit )
134+
135+ # Paginate manually
136+ # FIXME: Make this better: probably cache, and also optimize
137+ # Because, right now, every data is pulled and then only paginated
138+ data = data [offset :offset + limit ]
139+
125140 serializer = SourceDataSerializer (
126141 data ,
127142 many = True ,
@@ -131,7 +146,7 @@ def get_leads(self, request, pk=None, version=None):
131146
132147 return response .Response ({
133148 'count' : count ,
134- 'count_per_page' : getattr ( source , 'count_per_page' , None ) ,
149+ 'count_per_page' : limit ,
135150 'results' : results
136151 })
137152
0 commit comments