o
    <g                     @   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   H/var/www/html/venv/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ededed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   …z"That page number is not an integerzThat page number is less than 1zThat page contains no results)invalid_pagemin_page
no_resultsr   TNc                 C   sL   || _ |   t|| _t|| _|| _|d u r| j| _d S | j|B | _d S N)object_list_check_object_list_is_orderedintper_pageorphansallow_empty_first_pagedefault_error_messageserror_messages)selfr   r   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__8   s   
zPaginator.__iter__c              	   C   sv   zt |tr| stt|}W n ttfy!   t| jd w |dk r-t| jd || j	kr9t| jd |S )z'Validate the given 1-based page number.r      r   r   )

isinstancefloat
is_integer
ValueErrorr   	TypeErrorr   r   r   	num_pages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_pageJ   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"   W   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   r1   `   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.r0   N)getattrr   callableinspect	isbuiltinr   len)r   cr   r   r   r0   i   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%   )r0   r   maxr   r   r   )r   hitsr   r   r   r+   q   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!   y   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)
r7   r   hasattrformatrB   	__class__r	   warningswarnr   )r   rA   obj_list_reprr   r   r   r      s   


z'Paginator._check_object_list_is_orderedr%   rC      )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.
        rK   Nr%   )r.   r+   r!   r?   ELLIPSIS)r   r-   rL   rM   r   r   r   get_elided_page_range   s   
$zPaginator.get_elided_page_range)r   TN)r%   )r	   r
   r   _rN   r   r    r$   r.   r/   r"   r1   r   r0   r+   propertyr!   r   rO   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 )r4   c                 C   s   || _ || _|| _d S r   )r   r-   	paginator)r   r   r-   rR   r   r   r   r       s   
zPage.__init__c                 C   s   d| j | jjf S )Nz<Page %s of %s>r-   rR   r+   r@   r   r   r   __repr__      zPage.__repr__c                 C   s
   t | jS r   )r;   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   rS   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   rW   zPage.has_previousc                 C   s   |   p|  S r   )r_   r]   r@   r   r   r   has_other_pages   s   zPage.has_other_pagesc                 C   s   | j | jd S r^   rR   r.   r-   r@   r   r   r   next_page_number   rU   zPage.next_page_numberc                 C   s   | j | jd S r^   ra   r@   r   r   r   previous_page_number   rU   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%   )rR   r0   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-   rR   r+   r0   r   r@   r   r   r   	end_index   s   zPage.end_indexN)r	   r
   r   r    rT   rV   r\   r]   r_   r`   rb   rc   rd   re   r   r   r   r   r4      s    
r4   )collections.abccollectionsr9   rH   mathr   django.utils.functionalr   django.utils.inspectr   django.utils.translationr   rP   RuntimeWarningr   	Exceptionr   r   r   r   abcSequencer4   r   r   r   r   <module>   s     