Django

Code

Show
Ignore:
Timestamp:
08/05/08 12:15:33 (5 months ago)
Author:
jbronn
Message:

gis: Merged revisions 7981-8001,8003-8011,8013-8033,8035-8036,8038-8039,8041-8063,8065-8076,8078-8139,8141-8154,8156-8214 via svnmerge from trunk.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/gis

    • Property svnmerge-integrated changed from /django/trunk:1-7978 to /django/trunk:1-8214
  • django/branches/gis/django/core/paginator.py

    r7918 r8215  
     1from math import ceil 
     2 
    13class InvalidPage(Exception): 
    24    pass 
     
    4345        "Returns the total number of objects, across all pages." 
    4446        if self._count is None: 
    45             from django.db.models.query import QuerySet 
    46             if isinstance(self.object_list, QuerySet): 
     47            try: 
    4748                self._count = self.object_list.count() 
    48             else: 
     49            except (AttributeError, TypeError): 
     50                # AttributeError if object_list has no count() method. 
     51                # TypeError if object_list.count() requires arguments 
     52                # (i.e. is of type list). 
    4953                self._count = len(self.object_list) 
    5054        return self._count 
     
    5458        "Returns the total number of pages." 
    5559        if self._num_pages is None: 
    56             hits = self.count - 1 - self.orphans 
    57             if hits < 1: 
    58                 hits = 0 
    59             if hits == 0 and not self.allow_empty_first_page: 
     60            if self.count == 0 and not self.allow_empty_first_page: 
    6061                self._num_pages = 0 
    6162            else: 
    62                 self._num_pages = hits // self.per_page + 1 
     63                hits = max(1, self.count - self.orphans) 
     64                self._num_pages = int(ceil(hits / float(self.per_page))) 
    6365        return self._num_pages 
    6466    num_pages = property(_get_num_pages) 
     
    103105        relative to total objects in the paginator. 
    104106        """ 
     107        # Special case, return zero if no items. 
     108        if self.paginator.count == 0: 
     109            return 0 
    105110        return (self.paginator.per_page * (self.number - 1)) + 1 
    106111 
     
    110115        relative to total objects found (hits). 
    111116        """ 
     117        # Special case for the last page because there can be orphans. 
    112118        if self.number == self.paginator.num_pages: 
    113119            return self.paginator.count 
    114120        return self.number * self.paginator.per_page 
    115  
    116 class ObjectPaginator(Paginator): 
    117     """ 
    118     Legacy ObjectPaginator class, for backwards compatibility. 
    119  
    120     Note that each method on this class that takes page_number expects a 
    121     zero-based page number, whereas the new API (Paginator/Page) uses one-based 
    122     page numbers. 
    123     """ 
    124     def __init__(self, query_set, num_per_page, orphans=0): 
    125         Paginator.__init__(self, query_set, num_per_page, orphans) 
    126         import warnings 
    127         warnings.warn("The ObjectPaginator is deprecated. Use django.core.paginator.Paginator instead.", DeprecationWarning) 
    128  
    129         # Keep these attributes around for backwards compatibility. 
    130         self.query_set = query_set 
    131         self.num_per_page = num_per_page 
    132         self._hits = self._pages = None 
    133  
    134     def validate_page_number(self, page_number): 
    135         try: 
    136             page_number = int(page_number) + 1 
    137         except ValueError: 
    138             raise PageNotAnInteger 
    139         return self.validate_number(page_number) 
    140  
    141     def get_page(self, page_number): 
    142         try: 
    143             page_number = int(page_number) + 1 
    144         except ValueError: 
    145             raise PageNotAnInteger 
    146         return self.page(page_number).object_list 
    147  
    148     def has_next_page(self, page_number): 
    149         return page_number < self.pages - 1 
    150  
    151     def has_previous_page(self, page_number): 
    152         return page_number > 0 
    153  
    154     def first_on_page(self, page_number): 
    155         """ 
    156         Returns the 1-based index of the first object on the given page, 
    157         relative to total objects found (hits). 
    158         """ 
    159         page_number = self.validate_page_number(page_number) 
    160         return (self.num_per_page * (page_number - 1)) + 1 
    161  
    162     def last_on_page(self, page_number): 
    163         """ 
    164         Returns the 1-based index of the last object on the given page, 
    165         relative to total objects found (hits). 
    166         """ 
    167         page_number = self.validate_page_number(page_number) 
    168         if page_number == self.num_pages: 
    169             return self.count 
    170         return page_number * self.num_per_page 
    171  
    172     def _get_count(self): 
    173         # The old API allowed for self.object_list to be either a QuerySet or a 
    174         # list. Here, we handle both. 
    175         if self._count is None: 
    176             try: 
    177                 self._count = self.object_list.count() 
    178             except (AttributeError, TypeError): 
    179                 # AttributeError if object_list has no count() method. 
    180                 # TypeError if object_list.count() requires arguments 
    181                 # (i.e. is of type list). 
    182                 self._count = len(self.object_list) 
    183         return self._count 
    184     count = property(_get_count) 
    185  
    186     # The old API called it "hits" instead of "count". 
    187     hits = count 
    188  
    189     # The old API called it "pages" instead of "num_pages". 
    190     pages = Paginator.num_pages