o
     ÞhýŽ  ã                   @   s`  d Z ddlZddlZddlmZm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 dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ ddlmZ ddlmZ ddl m!Z!m"Z" d)dd„Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'edg d¢ƒZ(edg d¢ƒZ)e)dddd d�Z*G d!d"„ d"ƒZ+G d#d$„ d$e+ƒZ,G d%d&„ d&e+ƒZ-G d'd(„ d(e+ƒZ.dS )*zk
Pagination serializers determine the structure of the output that should
be used for paginated responses.
é    N)Ú	b64decodeÚ	b64encode)Ú
namedtuple)Úparse)ÚInvalidPage)Ú	Paginator)Úloader)Ú	force_str)Úgettext_lazy)ÚRemovedInDRF317Warning)ÚcoreapiÚ
coreschema)ÚNotFound)ÚResponse)Úapi_settings)Úremove_query_paramÚreplace_query_paramFc                 C   s4   t | ƒ}|dk s|dkr|rtƒ ‚|rt||ƒS |S )z7
    Cast a string to a strictly positive integer.
    r   )ÚintÚ
ValueErrorÚmin)Úinteger_stringÚstrictÚcutoffÚret© r   úY/var/www/html/premium_crap/venv/lib/python3.10/site-packages/rest_framework/pagination.pyÚ_positive_int   s   
r   c                 C   s   | | r
| | d S | | S )zD
    Returns 'a' divided by 'b', with any remainder rounded up.
    é   r   )ÚaÚbr   r   r   Ú_divide_with_ceil&   s   r    c                    sÚ   | dksJ ‚ˆ | ksJ ‚ˆ dkrt tdˆ d ƒƒS d| d | | d ˆ h}| dkr2| d¡ | d¡ | ˆ d krF| ˆ d ¡ | ˆ d ¡ ‡ fdd„t|ƒD ƒ}| dkr[| dd¡ | ˆ d k rk| t|ƒd d¡ |S )	aŒ  
    This utility function determines a list of page numbers to display.
    This gives us a nice contextually relevant set of page numbers.

    For example:
    current=14, final=16 -> [1, None, 13, 14, 15, 16]

    This implementation gives one page to each side of the cursor,
    or two pages to the side when the cursor is at the edge, then
    ensures that any breaks between non-continuous page numbers never
    remove only a single page.

    For an alternative implementation which gives two pages to each side of
    the cursor, eg. as in GitHub issue list pagination, see:

    https://gist.github.com/tomchristie/321140cebb1c4a558b15
    r   é   é   é   é   c                    s(   g | ]}d |  k rˆ krn n|‘qS )r   r   )Ú.0Úidx©Úfinalr   r   Ú
<listcomp>V   s
    ÿz/_get_displayed_page_numbers.<locals>.<listcomp>N)ÚlistÚrangeÚaddÚsortedÚinsertÚlen)Úcurrentr(   Úincludedr   r'   r   Ú_get_displayed_page_numbers0   s&   


ÿr2   c                 C   sB   g }| D ]}|du rt }nt||ƒ|||kdd�}| |¡ q|S )zg
    Given a list of page numbers and `None` page breaks,
    return a list of `PageLink` objects.
    NF©ÚurlÚnumberÚ	is_activeÚis_break)Ú
PAGE_BREAKÚPageLinkÚappend)Úpage_numbersr0   Úurl_funcÚ
page_linksÚpage_numberÚ	page_linkr   r   r   Ú_get_page_linksc   s   ür@   c                    s   dd„ ‰ t ‡ fdd„| D ƒƒS )z�
    Given an order_by tuple such as `('-created', 'uuid')` reverse the
    ordering and return a new tuple, eg. `('created', '-uuid')`.
    c                 S   s   |   d¡r| dd … S d|  S )Nú-r   )Ú
startswith)Úxr   r   r   Úinvert|   s   z!_reverse_ordering.<locals>.invertc                    s   g | ]}ˆ |ƒ‘qS r   r   )r%   Úitem©rD   r   r   r)      s    z%_reverse_ordering.<locals>.<listcomp>)Útuple)Úordering_tupler   rF   r   Ú_reverse_orderingw   s   rI   ÚCursor©ÚoffsetÚreverseÚpositionr9   r3   Tc                   @   sJ   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚBasePaginationFNc                 C   ó   t dƒ‚)Nz(paginate_queryset() must be implemented.©ÚNotImplementedError©ÚselfÚquerysetÚrequestÚviewr   r   r   Úpaginate_queryset‹   ó   z BasePagination.paginate_querysetc                 C   rP   )Nz-get_paginated_response() must be implemented.rQ   ©rT   Údatar   r   r   Úget_paginated_responseŽ   rY   z%BasePagination.get_paginated_responsec                 C   s   |S ©Nr   ©rT   Úschemar   r   r   Úget_paginated_response_schema‘   ó   z,BasePagination.get_paginated_response_schemac                 C   rP   )Nz7to_html() must be implemented to display page controls.rQ   ©rT   r   r   r   Úto_html”   rY   zBasePagination.to_htmlc                 C   s   |d S )NÚresultsr   rZ   r   r   r   Úget_results—   rY   zBasePagination.get_resultsc                 C   s(   t d usJ dƒ‚t d urt dt¡ g S )Nú6coreapi must be installed to use `get_schema_fields()`úCCoreAPI compatibility is deprecated and will be removed in DRF 3.17)r   ÚwarningsÚwarnr   ©rT   rW   r   r   r   Úget_schema_fieldsš   s   z BasePagination.get_schema_fieldsc                 C   s   g S r]   r   rj   r   r   r   Úget_schema_operation_parameters    ra   z.BasePagination.get_schema_operation_parametersr]   )Ú__name__Ú
__module__Ú__qualname__Údisplay_page_controlsrX   r\   r`   rc   re   rk   rl   r   r   r   r   rO   ˆ   s    
rO   c                   @   s    e Zd ZdZejZeZdZ	e
dƒZdZe
dƒZdZd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dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚPageNumberPaginationzÒ
    A simple page number based style that supports page numbers as
    query parameters. For example:

    http://api.example.org/accounts/?page=4
    http://api.example.org/accounts/?page=4&page_size=100
    Úpagez.A page number within the paginated result set.Nú%Number of results to return per page.)Úlastú&rest_framework/pagination/numbers.htmlzInvalid page.c           	   
   C   sš   || _ |  |¡}|sdS |  ||¡}|  ||¡}z| |¡| _W n ty: } z| jj|t|ƒd�}t	|ƒ‚d}~ww |j
dkrH| jdurHd| _t| jƒS )z“
        Paginate a queryset if required, either returning a
        page object, or `None` if pagination is not configured for this view.
        N)r>   Úmessager   T)rV   Úget_page_sizeÚdjango_paginator_classÚget_page_numberrr   r   Úinvalid_page_messageÚformatÚstrr   Ú	num_pagesÚtemplaterp   r*   )	rT   rU   rV   rW   Ú	page_sizeÚ	paginatorr>   ÚexcÚmsgr   r   r   rX   Å   s$   
ÿ€ü
z&PageNumberPagination.paginate_querysetc                 C   s&   |j  | j¡pd}|| jv r|j}|S ©Nr   )Úquery_paramsÚgetÚpage_query_paramÚlast_page_stringsr}   )rT   rV   r€   r>   r   r   r   ry   à   s   
z$PageNumberPagination.get_page_numberc                 C   s    t | jjj|  ¡ |  ¡ |dœƒS ©N©ÚcountÚnextÚpreviousrd   )r   rr   r€   rŠ   Úget_next_linkÚget_previous_linkrZ   r   r   r   r\   æ   s   üz+PageNumberPagination.get_paginated_responsec              
   C   sH   dddgdddœddd	d
j | jd�dœddd	dj | jd�dœ|dœdœS )NÚobjectrŠ   rd   Úintegeré{   ©ÚtypeÚexampleÚstringTÚuriz5http://api.example.org/accounts/?{page_query_param}=4)r†   ©r“   Únullabler{   r”   z5http://api.example.org/accounts/?{page_query_param}=2r‰   ©r“   ÚrequiredÚ
properties)r{   r†   r^   r   r   r   r`   î   s,   þÿüÿüíýz2PageNumberPagination.get_paginated_response_schemac                 C   óP   | j r%t tt¡� t|j| j  d| jd�W  d   ƒ S 1 s w   Y  | jS ©NT)r   r   ©	Úpage_size_query_paramÚ
contextlibÚsuppressÚKeyErrorr   r   r„   Úmax_page_sizer   ©rT   rV   r   r   r   rw   	  ó   
ý ÿz"PageNumberPagination.get_page_sizec                 C   s0   | j  ¡ sd S | j ¡ }| j  ¡ }t|| j|ƒS r]   )rr   Úhas_nextrV   Úbuild_absolute_uriÚnext_page_numberr   r†   ©rT   r4   r>   r   r   r   r�     s
   


z"PageNumberPagination.get_next_linkc                 C   sD   | j  ¡ sd S | j ¡ }| j  ¡ }|dkrt|| jƒS t|| j|ƒS rƒ   )rr   Úhas_previousrV   r§   Úprevious_page_numberr   r†   r   r©   r   r   r   rŽ     s   


z&PageNumberPagination.get_previous_linkc                    sT   ˆj  ¡ ‰ ‡ ‡fdd„}ˆjj}ˆjjj}t||ƒ}t|||ƒ}ˆ ¡ ˆ 	¡ |dœS )Nc                    s"   | dkr
t ˆ ˆjƒS tˆ ˆj| ƒS rƒ   )r   r†   r   )r>   ©Úbase_urlrT   r   r   Úpage_number_to_url&  s   zAPageNumberPagination.get_html_context.<locals>.page_number_to_url©Úprevious_urlÚnext_urlr=   )
rV   r§   rr   r5   r€   r}   r2   r@   rŽ   r�   )rT   r®   r0   r(   r;   r=   r   r¬   r   Úget_html_context#  s   


ýz%PageNumberPagination.get_html_contextc                 C   ó   t  | j¡}|  ¡ }| |¡S r]   ©r   Úget_templater~   r²   Úrender©rT   r~   Úcontextr   r   r   rc   7  ó   
zPageNumberPagination.to_htmlc              
   C   s’   t d usJ dƒ‚t d urt dt¡ td usJ dƒ‚t j| jddtjdt| j	ƒd�d�g}| j
d urG| t j| j
ddtjd	t| jƒd�d�¡ |S )
Nrf   rg   ú9coreschema must be installed to use `get_schema_fields()`FÚqueryÚPage©ÚtitleÚdescription©Únamerš   Úlocationr_   ú	Page size)r   rh   ri   r   r   ÚFieldr†   ÚIntegerr	   Úpage_query_descriptionrŸ   r:   Úpage_size_query_description©rT   rW   Úfieldsr   r   r   rk   <  ó6   þüÿ
þüÿz&PageNumberPagination.get_schema_fieldsc                 C   sN   | j ddt| jƒddidœg}| jd ur%| | jddt| jƒddidœ¡ |S ©NFr»   r“   r�   ©rÁ   rš   Úinr¿   r_   )r†   r	   rÆ   rŸ   r:   rÇ   ©rT   rW   Ú
parametersr   r   r   rl   Z  ó&   ÿûÿ
ÿûÿz4PageNumberPagination.get_schema_operation_parametersr]   )rm   rn   ro   Ú__doc__r   Ú	PAGE_SIZEr   ÚDjangoPaginatorrx   r†   Ú_rÆ   rŸ   rÇ   r£   r‡   r~   rz   rX   ry   r\   r`   rw   r�   rŽ   r²   rc   rk   rl   r   r   r   r   rq   ¤   s.    	

	rq   c                   @   s˜   e Zd ZdZejZdZedƒZ	dZ
edƒZdZdZd 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d„ ZdS )!ÚLimitOffsetPaginationzœ
    A limit/offset based style. For example:

    http://api.example.org/accounts/?limit=100
    http://api.example.org/accounts/?offset=400&limit=100
    Úlimitrs   rL   z3The initial index from which to return the results.Nru   c                 C   sˆ   || _ |  |¡| _| jd u rd S |  |¡| _|  |¡| _| j| jkr*| jd ur*d| _| jdks5| j| jkr7g S t	|| j| j| j … ƒS )NTr   )
rV   Ú	get_limitrÖ   Ú	get_countrŠ   Ú
get_offsetrL   r~   rp   r*   rS   r   r   r   rX   „  s   
z'LimitOffsetPagination.paginate_querysetc                 C   s   t | j|  ¡ |  ¡ |dœƒS rˆ   )r   rŠ   r�   rŽ   rZ   r   r   r   r\   “  s   üz,LimitOffsetPagination.get_paginated_responsec                 C   sP   dddgdddœddd	d
j | j| jd�dœddd	dj | j| jd�dœ|dœdœS )Nr�   rŠ   rd   r�   r‘   r’   r•   Tr–   zEhttp://api.example.org/accounts/?{offset_param}=400&{limit_param}=100)Úoffset_paramÚlimit_paramr—   zEhttp://api.example.org/accounts/?{offset_param}=200&{limit_param}=100r‰   r™   )r{   Úoffset_query_paramÚlimit_query_paramr^   r   r   r   r`   ›  s,   þÿüÿüíýz3LimitOffsetPagination.get_paginated_response_schemac                 C   rœ   r�   )	rÝ   r    r¡   r¢   r   r   r„   Ú	max_limitÚdefault_limitr¤   r   r   r   r×   ¶  r¥   zLimitOffsetPagination.get_limitc              	   C   s,   z	t |j| j ƒW S  ttfy   Y dS w ©Nr   )r   r„   rÜ   r¢   r   r¤   r   r   r   rÙ   À  s   
ÿÿz LimitOffsetPagination.get_offsetc                 C   sJ   | j | j | jkrd S | j ¡ }t|| j| jƒ}| j | j }t|| j|ƒS r]   )rL   rÖ   rŠ   rV   r§   r   rÝ   rÜ   ©rT   r4   rL   r   r   r   r�   È  s   
z#LimitOffsetPagination.get_next_linkc                 C   s^   | j dkrd S | j ¡ }t|| j| jƒ}| j | j dkr"t|| jƒS | j | j }t|| j|ƒS rà   )rL   rV   r§   r   rÝ   rÖ   r   rÜ   rá   r   r   r   rŽ   Ò  s   

z'LimitOffsetPagination.get_previous_linkc                    sž   ˆj  ¡ ‰ ˆjr(tˆjˆjƒd ‰tˆjˆj ˆjƒtˆjˆjƒ }t|dƒ}nd‰d}ˆ|kr2|‰‡ ‡‡fdd„}tˆ|ƒ}t|ˆ|ƒ}ˆ 	¡ ˆ 
¡ |dœS )Nr   c                    s6   | dkr
t ˆ ˆjƒS ˆj| ˆ ˆj  }tˆ ˆj|ƒS rƒ   )r   rÜ   rL   rÖ   r   )r>   rL   ©r­   r0   rT   r   r   r®   ÷  s   zBLimitOffsetPagination.get_html_context.<locals>.page_number_to_urlr¯   )rV   r§   rÖ   r    rL   rŠ   Úmaxr2   r@   rŽ   r�   )rT   r(   r®   r;   r=   r   râ   r   r²   ß  s&   
ÿÿ
ýz&LimitOffsetPagination.get_html_contextc                 C   r³   r]   r´   r·   r   r   r   rc     r¹   zLimitOffsetPagination.to_htmlc              	   C   s*   z|  ¡ W S  ttfy   t|ƒ Y S w )zZ
        Determine an object count, supporting either querysets or regular lists.
        )rŠ   ÚAttributeErrorÚ	TypeErrorr/   )rT   rU   r   r   r   rØ     s
   
ÿzLimitOffsetPagination.get_countc              	   C   s|   t d usJ dƒ‚t d urt dt¡ td usJ dƒ‚t j| jddtjdt| j	ƒd�d�t j| j
ddtjd	t| jƒd�d�gS )
Nrf   rg   rº   Fr»   ÚLimitr½   rÀ   ÚOffset)r   rh   ri   r   r   rÄ   rÝ   rÅ   r	   Úlimit_query_descriptionrÜ   Úoffset_query_descriptionrj   r   r   r   rk     s.   þü	þüöz'LimitOffsetPagination.get_schema_fieldsc                 C   s<   | j ddt| jƒddidœ| jddt| jƒddidœg}|S rË   )rÝ   r	   rè   rÜ   ré   rÎ   r   r   r   rl   /  s    ÿû
ÿûöz5LimitOffsetPagination.get_schema_operation_parametersr]   )rm   rn   ro   rÑ   r   rÒ   rß   rÝ   rÔ   rè   rÜ   ré   rÞ   r~   rX   r\   r`   r×   rÙ   r�   rŽ   r²   rc   rØ   rk   rl   r   r   r   r   rÕ   u  s*    


(	rÕ   c                   @   s¸   e Zd ZdZdZedƒZejZ	edƒZ
dZdZdZedƒZdZd	Zd&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 d!„ Zd"d#„ Zd$d%„ ZdS )'ÚCursorPaginationzÐ
    The cursor pagination implementation is necessarily complex.
    For an overview of the position/offset style we use, see this post:
    https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api
    ÚcursorzThe pagination cursor value.zInvalid cursorz-createdz0rest_framework/pagination/previous_and_next.htmlNrs   iè  c                 C   sÚ  || _ |  |¡| _| jsd S | ¡ | _|  |||¡| _|  |¡| _| jd u r,d\}}}n| j\}}}|r=|j	t
| jƒŽ }n|j	| jŽ }|d urq| jd }| d¡}| d¡}	| jj|krc|	d |i}
n|	d |i}
|jd
i |
¤Ž}t|||| j d … ƒ}t|d | j… ƒ| _t|ƒt| jƒkr�d}|  |d | j¡}nd	}d }|rÄtt| jƒƒ| _|d up²|dk| _|| _| jr½|| _| jrÃ|| _n|| _|d upÎ|dk| _| jrÖ|| _| jrÜ|| _| jsâ| jrê| jd urêd| _| jS )N)r   FNr   rA   Ú__ltÚ__gtr   TéÿÿÿÿFr   )rV   rw   r   r§   r­   Úget_orderingÚorderingÚdecode_cursorrë   Úorder_byrI   rB   ÚlstriprM   Úfilterr*   rr   r/   Ú_get_position_from_instanceÚreversedr¦   rª   Únext_positionÚprevious_positionr~   rp   )rT   rU   rV   rW   rL   rM   Úcurrent_positionÚorderÚis_reversedÚ
order_attrÚkwargsrd   Úhas_following_positionÚfollowing_positionr   r   r   rX   c  s\   




€z"CursorPagination.paginate_querysetc                 C   rœ   r�   rž   r¤   r   r   r   rw   °  r¥   zCursorPagination.get_page_sizec                 C   sð   | j sd S | jr | jr | jjr | jjdkr |  | jd | j¡}n| j}d}d}t| jƒD ]}|  || j¡}||kr=d} n|}|d7 }q,| jrf|sf| j	sR| j
}d }n| jjr\d}| j}n
| jj| j
 }| j}| jsl| j}t|d|d�}|  |¡S )Nr   rî   FTr   rK   )r¦   rr   rë   rM   rL   rõ   rð   r÷   rö   rª   r   rø   rJ   Úencode_cursor©rT   ÚcomparerL   Úhas_item_with_unique_positionrE   rN   rë   r   r   r   r�   º  s6    


zCursorPagination.get_next_linkc                 C   sì   | j sd S | jr | jr | jjs | jjdkr |  | jd | j¡}n| j}d}d}| jD ]}|  || j¡}||kr;d} n|}|d7 }q*| jrd|sd| jsP| j	}d }n| jjr_| jj| j	 }| j
}nd}| j
}| jsj| j}t|d|d�}|  |¡S )Nr   FTr   rK   )rª   rr   rë   rM   rL   rõ   rð   rø   r¦   r   r÷   rJ   r   r  r   r   r   rŽ   ï  s6    



z"CursorPagination.get_previous_linkc           	      C   s¢   | j }dd„ t|dg ƒD ƒ}|r"|d }|ƒ }| |||¡}|r"|}|dus*J dƒ‚d|vs2J dƒ‚t|tttfƒsEJ d	jt|ƒj	d
�ƒ‚t|tƒrM|fS t|ƒS )zV
        Return a tuple of strings, that may be used in an `order_by` method.
        c                 S   s   g | ]	}t |d ƒr|‘qS )rï   )Úhasattr)r%   Ú
filter_clsr   r   r   r)   ,  s    þÿz1CursorPagination.get_ordering.<locals>.<listcomp>Úfilter_backendsr   NzXUsing cursor pagination, but no ordering attribute was declared on the pagination class.Ú__z¶Cursor pagination does not support double underscore lookups for orderings. Orderings should be an unchanging, unique or nearly-unique field on the model, such as "-created" or "pk".z:Invalid ordering. Expected string or tuple, but got {type})r“   )
rð   Úgetattrrï   Ú
isinstancer|   r*   rG   r{   r“   rm   )	rT   rV   rU   rW   rð   Úordering_filtersr  Úfilter_instanceÚordering_from_filterr   r   r   rï   $  s0   
ÿ
ÿ
ÿÿÿ
zCursorPagination.get_orderingc              	   C   s¼   |j  | j¡}|du rdS z;t| d¡ƒ d¡}tj|dd�}| ddg¡d }t|| j	d�}| d	dg¡d }t
t|ƒƒ}| d
dg¡d }W n ttfyV   t| jƒ‚w t|||d�S )zL
        Given a request with a cursor, return a `Cursor` instance.
        NÚasciiT)Úkeep_blank_valuesÚoÚ0r   )r   ÚrÚprK   )r„   r…   Úcursor_query_paramr   ÚencodeÚdecoder   Úparse_qsr   Úoffset_cutoffÚboolr   rå   r   r   Úinvalid_cursor_messagerJ   )rT   rV   ÚencodedÚquerystringÚtokensrL   rM   rN   r   r   r   rñ   N  s   
ÿzCursorPagination.decode_cursorc                 C   sp   i }|j dkrt|j ƒ|d< |jrd|d< |jdur|j|d< tj|dd�}t| d	¡ƒ d	¡}t	| j
| j|ƒS )
zM
        Given a Cursor instance, return an url with encoded cursor.
        r   r  Ú1r  Nr  T)Údoseqr  )rL   r|   rM   rN   r   Ú	urlencoder   r  r  r   r­   r  )rT   rë   r  r  r  r   r   r   r   g  s   


zCursorPagination.encode_cursorc                 C   s:   |d   d¡}t|tƒr|| }t|ƒS t||ƒ}t|ƒS )Nr   rA   )ró   r	  Údictr  r|   )rT   Úinstancerð   Ú
field_nameÚattrr   r   r   rõ   w  s   

ÿz,CursorPagination._get_position_from_instancec                 C   s   t |  ¡ |  ¡ |dœƒS )N©r‹   rŒ   rd   )r   r�   rŽ   rZ   r   r   r   r\     s
   ýz'CursorPagination.get_paginated_responsec              	   C   s>   ddgddddj | jd�dœdddd	j | jd�dœ|d
œdœS )Nr�   rd   r•   Tr–   zAhttp://api.example.org/accounts/?{cursor_query_param}=cD00ODY%3D")r  r—   zBhttp://api.example.org/accounts/?{cursor_query_param}=cj0xJnA9NDg3r$  r™   )r{   r  r^   r   r   r   r`   †  s&   ÿüÿüñýz.CursorPagination.get_paginated_response_schemac                 C   s   |   ¡ |  ¡ dœS )N)r°   r±   )rŽ   r�   rb   r   r   r   r²   �  s   þz!CursorPagination.get_html_contextc                 C   r³   r]   r´   r·   r   r   r   rc   £  r¹   zCursorPagination.to_htmlc              
   C   s’   t d usJ dƒ‚t d urt dt¡ td usJ dƒ‚t j| jddtjdt| j	ƒd�d�g}| j
d urG| t j| j
ddtjd	t| jƒd�d�¡ |S )
Nrf   rg   rº   Fr»   rJ   r½   rÀ   rÃ   )r   rh   ri   r   r   rÄ   r  ÚStringr	   Úcursor_query_descriptionrŸ   r:   rÅ   rÇ   rÈ   r   r   r   rk   ¨  rÊ   z"CursorPagination.get_schema_fieldsc                 C   sN   | j ddt| jƒddidœg}| jd ur%| | jddt| jƒddidœ¡ |S )NFr»   r“   r•   rÌ   r�   )r  r	   r&  rŸ   r:   rÇ   rÎ   r   r   r   rl   Æ  rÐ   z0CursorPagination.get_schema_operation_parametersr]   )rm   rn   ro   rÑ   r  rÔ   r&  r   rÒ   r   r  rð   r~   rŸ   rÇ   r£   r  rX   rw   r�   rŽ   rï   rñ   r   rõ   r\   r`   r²   rc   rk   rl   r   r   r   r   rê   G  s4    
M
55*rê   )FN)/rÑ   r    rh   Úbase64r   r   Úcollectionsr   Úurllibr   Údjango.core.paginatorr   r   rÓ   Údjango.templater   Údjango.utils.encodingr	   Údjango.utils.translationr
   rÔ   Úrest_frameworkr   Úrest_framework.compatr   r   Úrest_framework.exceptionsr   Úrest_framework.responser   Úrest_framework.settingsr   Úrest_framework.utils.urlsr   r   r   r    r2   r@   rI   rJ   r9   r8   rO   rq   rÕ   rê   r   r   r   r   Ú<module>   s>    

3 R S