diff --git a/flask_pymongo/__init__.py b/flask_pymongo/__init__.py index 76bbc38..6c68631 100644 --- a/flask_pymongo/__init__.py +++ b/flask_pymongo/__init__.py @@ -40,7 +40,10 @@ from flask_pymongo.wrappers import MongoClient from flask_pymongo.wrappers import MongoReplicaSetClient +from flask_pymongo.helpers import paginate +# Monkey patch Cursor to add paginate +setattr(pymongo.cursor.Cursor, 'paginate', paginate) PRIMARY = pymongo.ReadPreference.PRIMARY diff --git a/flask_pymongo/helpers.py b/flask_pymongo/helpers.py new file mode 100644 index 0000000..f86757f --- /dev/null +++ b/flask_pymongo/helpers.py @@ -0,0 +1,52 @@ +# Copyright (c) 2013, Lorenzo Masini +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +class Paginator(object): + def __init__(self, cursor, page, per_page): + self.cursor = cursor + self.page = page + self.per_page = per_page + + def num_pages(self): + count = self.cursor.count() + pages = count / self.per_page + if count % self.per_page: + pages += 1 + return pages + + def has_prev(self): + return self.page > 0 + + def has_next(self): + return self.page < self.num_pages() - 1 + + def entries(self): + start = self.page * self.per_page + end = start + self.per_page + return self.cursor[start:end] + +def paginate(cursor, page=0, per_page=10): + return Paginator(cursor, page, per_page) +