@classmethod
    def get(cls, count=10, q_filters={}, search=None, start=None, model=None, \
            order='ASC', order_by='__key__'):
        """
        get queries the database on model, starting with key, ordered by
        order. It receives count + 1 items, returning count and setting a
        next field to the count + 1 item key. It then reverses the sort, and
        grabs count objects, returning the last as a the previous.

        Arguments:
            count:         The amount of entries to pull on query
            q_filter:      The filter value (optional)
            search:        Search is used for SearchableModel searches
            start:         The key to start the page from
            model:         The Model object to query against. This is not a
                           string, it must be a Model derived object.
            order:         The order in which to pull the values.
            order_by:      The attribute to order results by. This defaults to
                           __key__

        Returns a dict:
        {
            'next': next_key,
            'prev': prev_key,
            'items': entities_pulled
        }
        """

        # argument validation
        if model == None:
            raise ValueError('You must pass a model to query')

        # a valid model object will have a gql method.
        if callable(model.gql) == False:
            raise TypeError('model must be a valid model object.')

        # cache check
        cache_string = "gae_paginator_"
        for q_filter in q_filters:
            cache_string = cache_string + q_filter + "_" + q_filters[q_filter] + "_"
        cache_string = cache_string + "index"
        c = Cache()
        if c.has_key(cache_string):
            return c[cache_string]

        # build query
        query = model.all()
        if len(q_filters) > 0:
            for q_filter in q_filters:
                query.filter(q_filter + " = ", q_filters[q_filter])
        if start:
            if order.lower() == "DESC".lower():
                query.filter(order_by + " <", start)
            else:
                query.filter(order_by + " >", start)
        if search:
            query.search(search)
        if order.lower() == "DESC".lower():
            query.order("-" + order_by)
        else:
            query.order(order_by)
        results = query.fetch(count + 1)
        if len(results) == count + 1:
            next = getattr(results[count - 1], order_by)
            # reverse the query to get the value for previous
            if start is not None:
                rquery = model.all()
                for q_filter in q_filters:
                    rquery.filter(q_filter + " = ", q_filters[q_filter])
                if search:
                    query.search(search)
                if order.lower() == "DESC".lower():
                    rquery.order(order_by)
                else:
                    rquery.order("-" + order_by)
                rresults = rquery.fetch(count)
                previous = getattr(results[0], order_by)
            else:
                previous = None
        else:
            next = None
        return {
                    "results": results,
                    "next": next,
                    "previous": previous
               }
dataset/ETHPy150Open kuri65536/python-for-android/python-build/python-libs/gdata/samples/oauth/oauth_on_appengine/appengine_utilities/paginator.py/Paginator.get/original