
v^                 @   s  d  d l  Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z Gd d   d e  Z Gd	 d
   d
 e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d  Z Gd d   d e  Z Gd d   d e j j  Z d S)    N)ceil)RemovedInDjango31Warning)cached_property)method_has_no_args)gettext_lazyc               @   s   e  Z d  Z d S)UnorderedObjectListWarningN)__name__
__module____qualname__ r   r   7/tmp/pip-build-8lau8j11/django/django/core/paginator.pyr      s   r   c               @   s   e  Z d  Z d S)InvalidPageN)r   r	   r
   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d S)PageNotAnIntegerN)r   r	   r
   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d S)	EmptyPageN)r   r	   r
   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d d d d  Z d d   Z d d   Z d	 d
   Z d d   Z e d d    Z	 e d d    Z
 e d d    Z d d   Z d S)	Paginatorr   Tc             C   s>   | |  _  |  j   t |  |  _ t |  |  _ | |  _ d  S)N)object_list_check_object_list_is_orderedintper_pageorphansallow_empty_first_page)selfr   r   r   r   r   r   r   __init__   s
    	
zPaginator.__init__c             C   s   y2 t  | t  r% | j   r% t  t |  } Wn* t t f k
 r^ t t d    Yn X| d k  r} t t d    | |  j	 k r | d k r |  j
 r n t t d    | S)z'Validate the given 1-based page number.z"That page number is not an integer   zThat page number is less than 1zThat page contains no results)
isinstancefloat
is_integer
ValueErrorr   	TypeErrorr   _r   	num_pagesr   )r   numberr   r   r   validate_number&   s    zPaginator.validate_numberc             C   sU   y |  j  |  } Wn2 t k
 r- d } Yn t k
 rG |  j } Yn X|  j |  S)zj
        Return a valid page, even if the page argument isn't a number or isn't
        in range.
        r   )r"   r   r   r    page)r   r!   r   r   r   get_page7   s    
zPaginator.get_pagec             C   sl   |  j  |  } | d |  j } | |  j } | |  j |  j k rL |  j } |  j |  j | |  | |   S)z7Return a Page object for the given 1-based page number.r   )r"   r   r   count	_get_pager   )r   r!   Zbottomtopr   r   r   r#   D   s    	zPaginator.pagec             O   s   t  | |   S)z
        Return an instance of a single page.

        This hook can be used by subclasses to use an alternative to the
        standard :cls:`Page` object.
        )Page)r   argskwargsr   r   r   r&   M   s    zPaginator._get_pagec             C   sQ   t  |  j d d  } t |  rD t j |  rD t |  rD |   St |  j  S)z5Return the total number of objects, across all pages.r%   N)getattrr   callableinspectZ	isbuiltinr   len)r   cr   r   r   r%   V   s    (zPaginator.countc             C   sG   |  j  d k r |  j r d St d |  j  |  j  } t | |  j  S)z!Return the total number of pages.r   r   )r%   r   maxr   r   r   )r   hitsr   r   r   r    ^   s    zPaginator.num_pagesc             C   s   t  d |  j d  S)zk
        Return a 1-based range of pages for iterating through within
        a template for loop.
        r   )ranger    )r   r   r   r   
page_rangef   s    zPaginator.page_rangec             C   s   t  |  j d d  } | d k	 r | r t |  j d  r[ d j |  j j |  j j j  n d j |  j  } t j d j |  t	 d d d S)	zO
        Warn if self.object_list is unordered (typically a QuerySet).
        orderedNmodelz{} {}z{!r}zLPagination may yield inconsistent results with an unordered object_list: {}.
stacklevel   )
r+   r   hasattrformatr5   	__class__r   warningswarnr   )r   r4   Zobj_list_reprr   r   r   r   n   s    3z'Paginator._check_object_list_is_orderedN)r   r	   r
   r   r"   r$   r#   r&   r   r%   r    propertyr3   r   r   r   r   r   r      s   		r   c                   s"   e  Z d  Z   f d d   Z   S)QuerySetPaginatorc                s-   t  j d t d d t   j | |   d  S)Nz7The QuerySetPaginator alias of Paginator is deprecated.r6      )r;   r<   r   superr   )r   r)   r*   )r:   r   r   r      s    zQuerySetPaginator.__init__)r   r	   r
   r   r   r   )r:   r   r>      s   r>   c               @   s   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)r(   c             C   s   | |  _  | |  _ | |  _ d  S)N)r   r!   	paginator)r   r   r!   rA   r   r   r   r      s    		zPage.__init__c             C   s   d |  j  |  j j f S)Nz<Page %s of %s>)r!   rA   r    )r   r   r   r   __repr__   s    zPage.__repr__c             C   s   t  |  j  S)N)r.   r   )r   r   r   r   __len__   s    zPage.__len__c             C   s]   t  | t t f  s. t d t |  j   t  |  j t  sR t |  j  |  _ |  j | S)Nz0Page indices must be integers or slices, not %s.)r   r   slicer   typer   r   list)r   indexr   r   r   __getitem__   s    zPage.__getitem__c             C   s   |  j  |  j j k  S)N)r!   rA   r    )r   r   r   r   has_next   s    zPage.has_nextc             C   s   |  j  d k S)Nr   )r!   )r   r   r   r   has_previous   s    zPage.has_previousc             C   s   |  j    p |  j   S)N)rJ   rI   )r   r   r   r   has_other_pages   s    zPage.has_other_pagesc             C   s   |  j  j |  j d  S)Nr   )rA   r"   r!   )r   r   r   r   next_page_number   s    zPage.next_page_numberc             C   s   |  j  j |  j d  S)Nr   )rA   r"   r!   )r   r   r   r   previous_page_number   s    zPage.previous_page_numberc             C   s/   |  j  j d k r d S|  j  j |  j d d S)z
        Return the 1-based index of the first object on this page,
        relative to total objects in the paginator.
        r   r   )rA   r%   r   r!   )r   r   r   r   start_index   s    zPage.start_indexc             C   s0   |  j  |  j j k r |  j j S|  j  |  j j S)z{
        Return the 1-based index of the last object on this page,
        relative to total objects found (hits).
        )r!   rA   r    r%   r   )r   r   r   r   	end_index   s    
zPage.end_indexN)r   r	   r
   r   rB   rC   rH   rI   rJ   rK   rL   rM   rN   rO   r   r   r   r   r(      s   
r(   )collections.abccollectionsr-   r;   mathr   Zdjango.utils.deprecationr   Zdjango.utils.functionalr   Zdjango.utils.inspectr   Zdjango.utils.translationr   r   RuntimeWarningr   	Exceptionr   r   r   r   r>   abcSequencer(   r   r   r   r   <module>   s   e
