From 265512bcd6f289af2d6790d862d25609b379a528 Mon Sep 17 00:00:00 2001 From: Andrew Melton Date: Mon, 8 Apr 2013 16:53:59 -0400 Subject: [PATCH] Default and Hard Limits on dbapi --- stacktach/dbapi.py | 13 ++++++++----- tests/unit/test_dbapi.py | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/stacktach/dbapi.py b/stacktach/dbapi.py index ce255c3..088dfd5 100644 --- a/stacktach/dbapi.py +++ b/stacktach/dbapi.py @@ -36,6 +36,10 @@ from stacktach import models from stacktach import utils +DEFAULT_LIMIT = 50 +HARD_LIMIT = 1000 + + class APIException(Exception): def __init__(self, message="Internal Server Error"): self.status = 500 @@ -269,16 +273,15 @@ def get_db_objects(klass, request, default_order_by, direction='asc', order_by = '-%s' % order_by offset = request.GET.get('offset') - limit = request.GET.get('limit') + limit = request.GET.get('limit', DEFAULT_LIMIT) + if limit > HARD_LIMIT: + limit = HARD_LIMIT if offset: start = int(offset) else: start = None offset = 0 - if limit: - end = int(offset) + int(limit) - else: - end = None + end = int(offset) + int(limit) return objects.order_by(order_by)[start:end] diff --git a/tests/unit/test_dbapi.py b/tests/unit/test_dbapi.py index bfc622c..b470dd5 100644 --- a/tests/unit/test_dbapi.py +++ b/tests/unit/test_dbapi.py @@ -140,7 +140,8 @@ class DBAPITestCase(unittest.TestCase): result = self.mox.CreateMockAnything() fake_model.objects.all().AndReturn(result) result.order_by('id').AndReturn(result) - result.__getitem__(slice(None, None, None)).AndReturn(result) + s = slice(None, dbapi.DEFAULT_LIMIT, None) + result.__getitem__(s).AndReturn(result) self.mox.ReplayAll() query_result = dbapi.get_db_objects(fake_model, fake_request, 'id') @@ -160,7 +161,8 @@ class DBAPITestCase(unittest.TestCase): result = self.mox.CreateMockAnything() fake_model.objects.all().AndReturn(result) result.order_by('-id').AndReturn(result) - result.__getitem__(slice(None, None, None)).AndReturn(result) + s = slice(None, dbapi.DEFAULT_LIMIT, None) + result.__getitem__(s).AndReturn(result) self.mox.ReplayAll() query_result = dbapi.get_db_objects(fake_model, fake_request, 'id') @@ -188,6 +190,27 @@ class DBAPITestCase(unittest.TestCase): self.mox.VerifyAll() + def test_get_db_objects_hard_limit(self): + fake_model = self.make_fake_model() + fake_request = self.mox.CreateMockAnything() + fake_request.GET = {'limit': dbapi.HARD_LIMIT + 1} + self.mox.StubOutWithMock(dbapi, '_get_filter_args') + dbapi._get_filter_args(fake_model, fake_request, + custom_filters=None).AndReturn({}) + self.mox.StubOutWithMock(dbapi, '_check_has_field') + dbapi._check_has_field(fake_model, 'id') + result = self.mox.CreateMockAnything() + fake_model.objects.all().AndReturn(result) + result.order_by('id').AndReturn(result) + s = slice(None, dbapi.HARD_LIMIT, None) + result.__getitem__(s).AndReturn(result) + self.mox.ReplayAll() + + query_result = dbapi.get_db_objects(fake_model, fake_request, 'id') + self.assertEquals(query_result, result) + + self.mox.VerifyAll() + def test_get_db_objects_offset(self): fake_model = self.make_fake_model() fake_request = self.mox.CreateMockAnything() @@ -200,7 +223,7 @@ class DBAPITestCase(unittest.TestCase): result = self.mox.CreateMockAnything() fake_model.objects.all().AndReturn(result) result.order_by('id').AndReturn(result) - result.__getitem__(slice(1, None, None)).AndReturn(result) + result.__getslice__(1, dbapi.DEFAULT_LIMIT + 1).AndReturn(result) self.mox.ReplayAll() query_result = dbapi.get_db_objects(fake_model, fake_request, 'id') @@ -241,7 +264,8 @@ class DBAPITestCase(unittest.TestCase): result = self.mox.CreateMockAnything() fake_model.objects.filter(**filters).AndReturn(result) result.order_by('id').AndReturn(result) - result.__getitem__(slice(None, None, None)).AndReturn(result) + s = slice(None, dbapi.DEFAULT_LIMIT, None) + result.__getitem__(s).AndReturn(result) self.mox.ReplayAll() query_result = dbapi.get_db_objects(fake_model, fake_request, 'id') @@ -266,7 +290,8 @@ class DBAPITestCase(unittest.TestCase): all_filters.update(custom_filters['raw']) fake_model.objects.filter(**all_filters).AndReturn(result) result.order_by('id').AndReturn(result) - result.__getitem__(slice(None, None, None)).AndReturn(result) + s = slice(None, dbapi.DEFAULT_LIMIT, None) + result.__getitem__(s).AndReturn(result) self.mox.ReplayAll() query_result = dbapi.get_db_objects(fake_model, fake_request, 'id',