Skip to content

Commit 855ab19

Browse files
authored
Merge pull request #884 from OpenSPP/imp/get-api-pagination
[UPD] add pagination to GET API response
2 parents 1bb19df + 1561073 commit 855ab19

3 files changed

Lines changed: 62 additions & 13 deletions

File tree

spp_api/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"images": [
88
"images/icon.png",
99
],
10-
"version": "17.0.1.3.1",
10+
"version": "17.0.1.4.1",
1111
"application": False,
1212
"author": "OpenSPP.org",
1313
"development_status": "Production/Stable",

spp_api/controllers/api.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,21 +207,46 @@ def read_multi__GET(self, namespace, version, model, **kw):
207207
path = kw.get("path")
208208
del kw["path"]
209209

210+
# For backward compatibility
211+
# Will not use pagination
212+
backward_compat = False
213+
if "start_from" in kw:
214+
backward_compat = True
215+
216+
try:
217+
page = int(kw.get("page", 1))
218+
except (ValueError, TypeError):
219+
page = 1
220+
page = max(1, page)
221+
kw["page"] = page
222+
210223
kw = path.search_treatment_kwargs(kw)
224+
limit = kw.get("limit")
225+
211226
records = self.get_records(path.model, kw)
212227
records_data = records.search_read(**kw)
213228
records_all = records.search_count(kw.get("domain"))
214229
records_data = path._get_response_treatment(records_data)
230+
215231
response_data = {
216232
"results": records_data,
217-
"count": records_all,
218-
"offset": kw.get("offset", 0),
219-
"limit": kw.get("limit", 0),
220233
"version": version,
221234
"timestamp": datetime_format(datetime.datetime.now()),
222235
"reply_id": self.get_reply_id(),
223236
}
224237

238+
if backward_compat:
239+
response_data["count"] = records_all
240+
response_data["offset"] = kw.get("offset", 0)
241+
response_data["limit"] = limit
242+
else:
243+
response_data["pagination"] = {
244+
"page": page,
245+
"limit": limit,
246+
"total_records": records_all,
247+
"total_pages": max(1, (records_all + limit - 1) // limit if limit > 0 else 1),
248+
}
249+
225250
return successful_response(200, response_data)
226251

227252
# ReadOne (optional: include_fields, exclude_fields)

spp_api/models/spp_api_path.py

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class SPPAPIPath(models.Model):
8989
# Read
9090
filter_domain = fields.Char(default="[]")
9191
field_ids = fields.Many2many("ir.model.fields", domain="[('model_id', '=', model_id)]", string="Fields")
92-
limit = fields.Integer(string="Limit of results", default=500)
92+
limit = fields.Integer(string="Limit of results", default=500, help="Limit of results per page")
9393
# Create / Update
9494
warning_required = fields.Boolean(compute="_compute_warning_required", compute_sudo=True)
9595
api_field_ids = fields.One2many("spp_api.field", "path_id", string="API Fields", copy=True)
@@ -663,15 +663,39 @@ def search_treatment_kwargs(self, kwargs):
663663
"""
664664
self.ensure_one()
665665

666-
# Limit
667-
limit = kwargs.get("limit", 0)
668-
max_limit = self.limit if self.limit else MAX_LIMIT
669-
kwargs["limit"] = limit if (limit and limit <= max_limit) else max_limit
670-
671-
# Offset
672-
kwargs["offset"] = kwargs.get("start_from", 0)
666+
backward_compat = False
673667
if "start_from" in kwargs:
674-
del kwargs["start_from"]
668+
backward_compat = True
669+
670+
if backward_compat:
671+
limit = kwargs.get("limit", 0)
672+
max_limit = self.limit if self.limit else MAX_LIMIT
673+
kwargs["limit"] = limit if (limit and limit <= max_limit) else max_limit
674+
kwargs["offset"] = kwargs.get("start_from", 0)
675+
if "start_from" in kwargs:
676+
del kwargs["start_from"]
677+
else:
678+
# Page
679+
page = int(kwargs.get("page", 1))
680+
681+
# Get defined limit first in spp_api.path
682+
# if limit is defined in kwargs (query parameter), use it; else use self.limit or MAX_LIMIT
683+
max_limit = self.limit if self.limit else MAX_LIMIT
684+
limit = kwargs.get("limit", max_limit)
685+
686+
# Validate limit
687+
try:
688+
limit = int(limit)
689+
if limit <= 0 or limit > max_limit:
690+
limit = max_limit
691+
except (ValueError, TypeError):
692+
limit = max_limit
693+
694+
kwargs["limit"] = limit
695+
696+
# Offset
697+
offset = (page - 1) * limit
698+
kwargs["offset"] = offset
675699

676700
# Domain
677701
kwargs["domain"] = self.get_domain(kwargs)

0 commit comments

Comments
 (0)