o aa@sddlZddlZddlZddlmZddlmZddlm Z ddl m Z Gddde ZGdd d eZGd d d eZGd d d eZGdddZGdddejjZdS)N)ceil)cached_property)method_has_no_args) gettext_lazyc@ eZdZdS)UnorderedObjectListWarningN__name__ __module__ __qualname__r r 7/usr/lib/python3/dist-packages/django/core/paginator.pyr rc@r) InvalidPageNrr r r r rrrc@r)PageNotAnIntegerNrr r r r rrrc@r) EmptyPageNrr r r r rrrc@seZdZedZ  dddZddZdd Zd d Zd d Z ddZ e ddZ e ddZ eddZddZd dddddZdS)! Paginatoru…rTcCs,||_|t||_t||_||_dSN) object_list_check_object_list_is_orderedintper_pageorphansallow_empty_first_page)selfrrrrr r r __init__ s    zPaginator.__init__ccs|jD]}||VqdSr) page_rangepage)r page_numberr r r __iter__(s zPaginator.__iter__c Cszt|tr |s tt|}Wnttfy ttdw|dkr+ttd||j kr@|dkr:|j r: |Sttd|S)z'Validate the given 1-based page number.z"That page number is not an integerzThat page number is less than 1zThat page contains no results) isinstancefloat is_integer ValueErrorr TypeErrorr_r num_pagesrrnumberr r r validate_number,s     zPaginator.validate_numbercCsFz||}Wntyd}Yn ty|j}Ynw||S)zj Return a valid page, even if the page argument isn't a number or isn't in range. r )r*rrr'rr(r r r get_page=s    zPaginator.get_pagecCsP||}|d|j}||j}||j|jkr|j}||j||||S)z7Return a Page object for the given 1-based page number.r )r*rrcount _get_pager)rr)bottomtopr r r rJs  zPaginator.pagecOst|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)rargskwargsr r r r-SszPaginator._get_pagecCs8t|jdd}t|rt|st|r|St|jS)z5Return the total number of objects, across all pages.r,N)getattrrcallableinspect isbuiltinrlen)rcr r r r,\s zPaginator.countcCs4|jdkr |js dStd|j|j}t||jS)z!Return the total number of pages.rr )r,rmaxrrr)rhitsr r r r'dszPaginator.num_pagescCstd|jdS)zk Return a 1-based range of pages for iterating through within a template for loop. r )ranger'rr r r rlszPaginator.page_rangecCsjt|jdd}|dur1|s3t|jdrd|jj|jjjnd|j}tjd|t dddSdSdS) zO Warn if self.object_list is unordered (typically a QuerySet). orderedNmodelz{} {}z{!r}zLPagination may yield inconsistent results with an unordered object_list: {}.) stacklevel) r3rhasattrformatr> __class__r warningswarnr)rr= obj_list_reprr r r rts    z'Paginator._check_object_list_is_orderedr r?) on_each_sideon_endsccs||}|j||dkr|jEdHdS|d||dkrr)rMr'r<r r r __repr__z Page.__repr__cCs t|jSr)r7rr<r r r __len__ z Page.__len__cCsBt|ttfstdt|jt|jtst|j|_|j|S)Nz0Page indices must be integers or slices, not %s.)r!rslicer%typer rlist)rindexr r r __getitem__s   zPage.__getitem__cCs|j|jjkSrrNr<r r r has_nextsz Page.has_nextcCs |jdkSNr )r)r<r r r has_previousrRzPage.has_previouscCs|p|Sr)rZrXr<r r r has_other_pagesszPage.has_other_pagescCs|j|jdSrYrMr*r)r<r r r next_page_numberrPzPage.next_page_numbercCs|j|jdSrYr\r<r r r previous_page_numberrPzPage.previous_page_numbercCs&|jjdkrdS|jj|jddS)z Return the 1-based index of the first object on this page, relative to total objects in the paginator. rr )rMr,rr)r<r r r start_indexs zPage.start_indexcCs$|j|jjkr |jjS|j|jjS)z{ Return the 1-based index of the last object on this page, relative to total objects found (hits). )r)rMr'r,rr<r r r end_indexszPage.end_indexN)r r r rrOrQrWrXrZr[r]r^r_r`r r r r r0s  r0)collections.abc collectionsr5rDmathrdjango.utils.functionalrdjango.utils.inspectrdjango.utils.translationrr&RuntimeWarningr ExceptionrrrrabcSequencer0r r r r s