o
    ˜¨Êhv  ã                   @   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 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jjƒZdS )é    N)Úceil)Úcached_property)Úmethod_has_no_args)Úgettext_lazyc                   @   ó   e Zd ZdS )ÚUnorderedObjectListWarningN©Ú__name__Ú
__module__Ú__qualname__© r   r   úG/var/www/html/env/lib/python3.10/site-packages/django/core/paginator.pyr      ó    r   c                   @   r   )ÚInvalidPageNr   r   r   r   r   r      r   r   c                   @   r   )ÚPageNotAnIntegerNr   r   r   r   r   r      r   r   c                   @   r   )Ú	EmptyPageNr   r   r   r   r   r      r   r   c                   @   s„   e Zd ZedƒZddd„Z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 dddœdd„ZdS )!Ú	Paginatoru   â€¦r   Tc                 C   s,   || _ |  ¡  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   � | j D ]}|  |¡V  qd S r   )Ú
page_rangeÚpage)r   Úpage_numberr   r   r   Ú__iter__'   s   €
ÿzPaginator.__iter__c              	   C   s„   zt |tƒr| ¡ st‚t|ƒ}W n ttfy    ttdƒƒ‚w |dk r+ttdƒƒ‚|| j	kr@|dkr:| j
r:	 |S 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   sF   z|   |¡}W n ty   d}Y n ty   | j}Y nw |  |¡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'   r   r(   r   r   r   Úget_page<   s   
ÿ
zPaginator.get_pagec                 C   sP   |   |¡}|d | j }|| j }|| j | jkr| 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   I   s   

zPaginator.pagec                 O   s   t |i |¤Ž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-   R   s   zPaginator._get_pagec                 C   s8   t | jddƒ}t|ƒrt |¡st|ƒr|ƒ 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,   [   s   
zPaginator.countc                 C   s4   | j dkr
| js
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'   c   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   r   k   s   zPaginator.page_rangec                 C   sj   t | jddƒ}|dur1|s3t| jdƒrd | jj| jjj¡nd | j¡}tjd |¡t	dd� dS dS 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)
r3   r   ÚhasattrÚformatr>   Ú	__class__r	   ÚwarningsÚwarnr   )r   r=   Úobj_list_reprr   r   r   r   s   s   
ýÿ
û
üøz'Paginator._check_object_list_is_orderedr    r?   é   )Úon_each_sideÚon_endsc                c   s  � |   |¡}| j|| d kr| jE dH  dS |d| | d kr<td|d ƒE dH  | jV  t|| |d ƒE dH  n
td|d ƒE dH  || j| | d k rut|d || d ƒE dH  | jV  t| j| d | jd ƒE dH  dS t|d | jd ƒE dH  dS )u›  
        Return a 1-based range of pages with some values elided.

        If the page range is larger than a given size, the whole range is not
        provided and a compact form is returned instead, e.g. for a paginator
        with 50 pages, if page 43 were the current page, the output, with the
        default arguments, would be:

            1, 2, â€¦, 40, 41, 42, 43, 44, 45, 46, â€¦, 49, 50.
        rG   Nr    )r*   r'   r   r;   ÚELLIPSIS)r   r)   rH   rI   r   r   r   Úget_elided_page_range‡   s   €
$zPaginator.get_elided_page_rangeN)r   T)r    )r	   r
   r   r&   rJ   r   r   r*   r+   r   r-   r   r,   r'   Úpropertyr   r   rK   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 )r0   c                 C   s   || _ || _|| _d S r   )r   r)   Ú	paginator)r   r   r)   rM   r   r   r   r   ¨   s   
zPage.__init__c                 C   s   d| j | jjf S )Nz<Page %s of %s>©r)   rM   r'   r<   r   r   r   Ú__repr__­   ó   zPage.__repr__c                 C   s
   t | jƒS r   )r7   r   r<   r   r   r   Ú__len__°   ó   
zPage.__len__c                 C   sB   t |ttfƒstdt|ƒj ƒ‚t | jtƒs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 r   rN   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Â   rR   zPage.has_previousc                 C   s   |   ¡ p|  ¡ S r   )rZ   rX   r<   r   r   r   Úhas_other_pagesÅ   s   zPage.has_other_pagesc                 C   s   | j  | jd ¡S rY   ©rM   r*   r)   r<   r   r   r   Únext_page_numberÈ   rP   zPage.next_page_numberc                 C   s   | j  | jd ¡S rY   r\   r<   r   r   r   Úprevious_page_numberË   rP   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    )rM   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)   rM   r'   r,   r   r<   r   r   r   Ú	end_indexØ   s   zPage.end_indexN)r	   r
   r   r   rO   rQ   rW   rX   rZ   r[   r]   r^   r_   r`   r   r   r   r   r0   §   s    
r0   )Úcollections.abcÚcollectionsr5   rD   Úmathr   Údjango.utils.functionalr   Údjango.utils.inspectr   Údjango.utils.translationr   r&   ÚRuntimeWarningr   Ú	Exceptionr   r   r   r   ÚabcÚSequencer0   r   r   r   r   Ú<module>   s     