3
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 G dd deZG d	d
 d
eZG dd deZG dd deZG dd dZG dd deZG d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   9/usr/lib/python3.6/site-packages/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               @   sb   e Zd Z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   y$t |tr|j  rtt|}W n$ ttfk
rH   ttdY nX |dk r^ttd|| j	kr|dkrx| j
rxn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   sJ   y| j |}W n0 tk
r&   d}Y n tk
r>   | j}Y n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   sP   | j |}|d | j }|| j }|| j | jkr8| j}| j| j|| || S )z7Return a Page object for the given 1-based page number.r   )r"   r   r   count	_get_pager   )r   r!   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   s:   t | jdd}t|r0tj| r0t|r0| S t| jS )z5Return the total number of objects, across all pages.r%   N)getattrr   callableinspect	isbuiltinr   len)r   cr   r   r   r%   V   s    zPaginator.countc             C   s6   | j dkr| j rdS t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   sd   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formatr7   	__class__r   warningswarnr   )r   r6   Zobj_list_reprr   r   r   r   n   s    "z'Paginator._check_object_list_is_orderedN)r   T)r   r	   r
   r   r"   r$   r#   r&   r   r%   r    propertyr5   r   r   r   r   r   r      s    
		r   c                   s   e Zd Z fddZ  ZS )QuerySetPaginatorc                s"   t jdtdd t j|| d S )Nz7The QuerySetPaginator alias of Paginator is deprecated.   )r9   )r=   r>   r   superr   )r   r*   r+   )r<   r   r   r      s    
zQuerySetPaginator.__init__)r   r	   r
   r   __classcell__r   r   )r<   r   r@      s   r@   c               @   sd   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!   rD   r   r   r   r      s    zPage.__init__c             C   s   d| j | jjf S )Nz<Page %s of %s>)r!   rD   r    )r   r   r   r   __repr__   s    zPage.__repr__c             C   s
   t | jS )N)r0   r   )r   r   r   r   __len__   s    zPage.__len__c             C   sB   t |ttfs tdt|j t | jts8t| 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!   rD   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)rM   rL   )r   r   r   r   has_other_pages   s    zPage.has_other_pagesc             C   s   | j j| jd S )Nr   )rD   r"   r!   )r   r   r   r   next_page_number   s    zPage.next_page_numberc             C   s   | j j| jd S )Nr   )rD   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   )rD   r%   r   r!   )r   r   r   r   start_index   s    zPage.start_indexc             C   s$   | 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!   rD   r    r%   r   )r   r   r   r   	end_index   s    zPage.end_indexN)r   r	   r
   r   rE   rF   rK   rL   rM   rN   rO   rP   rQ   rR   r   r   r   r   r)      s   
r)   )collections.abccollectionsr.   r=   mathr   django.utils.deprecationr   django.utils.functionalr   django.utils.inspectr   django.utils.translationr   r   RuntimeWarningr   	Exceptionr   r   r   r   r@   abcSequencer)   r   r   r   r   <module>   s   e
