
    >|h&                         d Z 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
ZddlmZ ddlmZ  G d	 d
      Zd Z G d d      Z G d dej&                        ZdedZ G d d      Zy)ak  Pagination feature

Two pagination modes are supported:

- Pagination inside the resource: the resource function is responsible for
  selecting requested range of items and setting total number of items.

- Post-pagination: the resource returns an iterator (typically a DB cursor) and
  a pager is provided to paginate the data and get the total number of items.
    N)deepcopy)wraps)request)FlaskParser   )unpack_tuple_responsec                   <    e Zd ZdZd Zed        Zed        Zd Zy)PaginationParameterszeHolds pagination arguments

    :param int page: Page number
    :param int page_size: Page size
    c                 .    || _         || _        d | _        y N)page	page_size
item_count)selfr   r   s      W/var/www/html/test/engine/venv/lib/python3.12/site-packages/flask_smorest/pagination.py__init__zPaginationParameters.__init__!   s    	"    c                 :    | j                   dz
  | j                  z  S )zReturn first item numberr   )r   r   r   s    r   
first_itemzPaginationParameters.first_item&   s     		A//r   c                 :    | j                   | j                  z   dz
  S )zReturn last item numberr   )r   r   r   s    r   	last_itemzPaginationParameters.last_item+   s     /!33r   c                 h    | j                   j                   d| j                  d| j                  dS )Nz(page=z,page_size=))	__class____name__r   r   r   s    r   __repr__zPaginationParameters.__repr__0   s5    ~~&&'TYYMT^^,>aA	
r   N)	r   
__module____qualname____doc__r   propertyr   r   r    r   r   r
   r
      s9    
 0 0 4 4
r   r
   c                 F      G  fddt         j                        }|S )z%Generate a PaginationParametersSchemac                   .   e Zd ZdZ G d d      Zej                  j                  W ej                  j                  d            Z
ej                  j                  W ej                  j                  dW              Zej                  d        Zy	)
I_pagination_parameters_schema_factory.<locals>.PaginationParametersSchemaz8Deserializes pagination params into PaginationParametersc                   (    e Zd ZdZej
                  Zy)N_pagination_parameters_schema_factory.<locals>.PaginationParametersSchema.MetaTN)r   r   r   orderedmaEXCLUDEunknownr"   r   r   Metar'   =   s    GjjGr   r,   r   )min)load_defaultvalidate)r-   maxc                     t        di |S )Nr"   )r
   )r   datakwargss      r   make_paginatorzX_pagination_parameters_schema_factory.<locals>.PaginationParametersSchema.make_paginatorI   s    '/$//r   N)r   r   r   r    r,   r)   fieldsIntegerr/   Ranger   r   	post_loadr4   )def_max_page_sizedef_pagedef_page_sizes   r   PaginationParametersSchemar%   :   s    F	! 	! yy  !BKK,=,=!,=,D ! 
 II%%&[[&&12C&D & 
	
 
	0 
	0r   r<   )r)   Schema)r:   r;   r9   r<   s   ``` r   %_pagination_parameters_schema_factoryr>   7   s     0 0RYY 0& &%r   c                   <    e Zd ZdZd Zed        Zed        Zd Zy)PagezpPager for simple types such as lists.

    Can be subclassed to provide a pager for a specific data object.
    c                 V    || _         || _        | j                  | j                  _        y)zCreate a Page instance

        :param sequence collection: Collection of items to page through
        :page PaginationParameters page_params: Pagination parameters
        N)
collectionpage_paramsr   )r   rB   rC   s      r   r   zPage.__init__V   s%     %&&*oo#r   c                     t        | j                  | j                  j                  | j                  j                  dz          S )Nr   )listrB   rC   r   r   r   s    r   itemsz
Page.items`   s=    OO  ++d.>.>.H.H1.L
 	
r   c                 ,    t        | j                        S r   )lenrB   r   s    r   r   zPage.item_counth   s    4??##r   c                 h    | j                   j                   d| j                  d| j                  dS )Nz(collection=z,page_params=r   )r   r   rB   rC   r   s    r   r   zPage.__repr__l   s8    ~~&&'4??-]4;K;K:NaQ	
r   N)	r   r   r   r    r   r!   rF   r   r   r"   r   r   r@   r@   P   s9    
6 
 
 $ $
r   r@   c                      e Zd ZdZej
                  j                         Zej
                  j                         Zej
                  j                         Z	ej
                  j                         Z
ej
                  j                         Zej
                  j                         Zej
                  j                         Z G d d      Zy)PaginationMetadataSchemazPagination metadata schema

    Used to serialize pagination metadata.
    Its main purpose is to document the pagination metadata.
    c                       e Zd ZdZy)PaginationMetadataSchema.MetaTN)r   r   r   r(   r"   r   r   r,   rM      s    r   r,   N)r   r   r   r    r)   r5   Inttotaltotal_pages
first_page	last_pager   previous_page	next_pager,   r"   r   r   rK   rK   s   s|     IIMMOE))--/KJ		I99==?DIIMMOM		I r   rK   zPagination metadata)descriptionschemac                   b    e Zd ZdZ e       ZdZddddZddddddZe	d	        Z
d
 Zd Zd Zy)PaginationMixinz*Extend Blueprint to add Pagination featurezX-Paginationr   
   d   )r   r   max_page_sizeNc                     | j                   d   }| j                   d   }| j                   d   }t        |||      dd j                  j                   fd}|S )a  Decorator adding pagination to the endpoint

        :param type[Page] pager: Page class used to paginate response data
        :param int page: Default requested page number (default: 1)
        :param int page_size: Default requested page size (default: 10)
        :param int max_page_size: Maximum page size (default: 100)

        If a :class:`Page <Page>` class is provided, it is used to paginate the
        data returned by the view function, typically a lazy database cursor.

        Otherwise, pagination is handled in the view function.

        The decorated function may return a tuple including status and/or
        headers, like a typical flask view function. It may not return a
        ``Response`` object.

        See :doc:`Pagination <pagination>`.
        r   r   r[   query)inrV   c                      t                fd       }t        t        |di             |_        t	        j
                        j                  id|j                  d<   |S )Nc                  f   	j                   j                  t        d      }||d<   t         | i |      \  }}} ||      j                  }	j
                  L|j                  *t        j                  dt        j                   dd       n	j                  |||      \  }}|||fS )	Nr]   )locationpagination_parameters)rC   zitem_count not set in endpoint .   )
stacklevel)PAGINATION_ARGUMENTS_PARSERparser   r   rF   PAGINATION_HEADER_NAMEr   warningswarnendpoint_set_pagination_metadata)
argsr3   rC   resultstatusheadersfuncpage_params_schemapagerr   s
         r   wrapperz<PaginationMixin.paginate.<locals>.decorator.<locals>.wrapper   s    ">>DD&' E 
 =6AF23 +@d@Uf@U*V' $"6{CIIF ..:"--5 =g>N>N=OqQ'(
 +/*G*G'+ vw..r   _apidoc)
parametersresponse
pagination)r   r   getattrru   http
HTTPStatusname)rq   rt   error_status_coderr   rs   rv   r   s   ` r   	decoratorz+PaginationMixin.paginate.<locals>.decorator   sd    4[/ /> 'ww	2'FGGO(%t7H'I'N'N-GOOL) Nr   )DEFAULT_PAGINATION_PARAMETERSr>   rf   DEFAULT_VALIDATION_STATUS)	r   rs   r   r   r[   r~   r}   rr   rv   s	   ``    @@@r   paginatezPaginationMixin.paginate   s    & <55f=D::;GI  >>OMB)]

 (


 !<<VV)	 )	V r   c                     i }||d<   |dk(  rd|d<   nB|dz
  |z  dz   }d}|}||d<   ||d<   ||d<   | |k  r| |d<   | |kD  r| dz
  |d<   | |k  r| dz   |d	<   t               j                  |      S )
zBuild pagination metadata from page, page size and item count

        Override this to use another pagination metadata structure
        rO   r   rP   r   rQ   rR   r   rS   rT   )rK   dump)r   r   r   page_metadata
page_countrQ   rR   s          r   _make_pagination_metadataz)PaginationMixin._make_pagination_metadata   s     !+g?+,M-( &>i71<JJ"I+5M-(*4M,')2M+&y (,f%*$59AXM/2)#15M+.')..}==r   c                     |i }t        j                  | j                  |j                  |j                  |j
                              || j                  <   ||fS )zeAdd pagination metadata to headers

        Override this to set pagination data another way
        )jsondumpsr   r   r   r   rh   )r   rC   rn   rp   s       r   rl   z(PaginationMixin._set_pagination_metadata  sZ    
 ?G/3zz**  +"7"79O9O0
++,
 wr   c                     |j                  di       j                  | j                  |j                  j                  dk\  rdi       yt
        i       y)zjDocument pagination metadata header

        Override this to document custom pagination metadata
        rp      
PAGINATIONN)
setdefaultupdaterh   openapi_versionmajorPAGINATION_HEADER)r   specresp_docs      r   _document_pagination_metadataz-PaginationMixin._document_pagination_metadata  sU    
 	Ir*11++++11Q6 !	

 +		
r   c                   |j                  d      }|ry|j                  dg       j                  |d          |j                  di       j                  |d          |j                  dg       }|D ]  }| j	                  ||d   |           |S )Nrx   rv   	responsesrw   success_status_codes)getr   appendr   r   )r   docdoc_infor   r3   	operationr   success_status_codes           r   _prepare_pagination_docz'PaginationMixin._prepare_pagination_doc"  s    LL.	NN<,33Il4KLNN;+229Z3HI#+<<0F#K '; #22#k*+>? 
r   r   )r   r   r   r    r   rf   rh   r   r   staticmethodr   rl   r   r   r"   r   r   rX   rX      s[    4"-- , ./RRU$V!O44t Ob > >4

r   rX   )r    rz   r   ri   copyr   	functoolsr   flaskr   marshmallowr)   webargs.flaskparserr   utilsr   r
   r>   r@   r=   rK   r   rX   r"   r   r   <module>r      sm   	        + (
 
:&2 
  
Fryy ( )& ` `r   