Ë
    ô%9j¯�  ã                   ó’  — 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 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„Z%d„ Z&d„ Z'd„ Z(d„ Z) edg d¢«      Z* edg d¢«      Z+ e+dddd¬«      Z, G d„ d«      Z- G d„ d e-«      Z. G d!„ d"e-«      Z/ G d#„ d$e-«      Z0y)&zk
Pagination serializers determine the structure of the output that should
be used for paginated responses.
é    N)Ú	b64decodeÚ	b64encode)Ú
namedtuple)Úparse)ÚInvalidPage)Ú	Paginator)ÚQ)Úloader)Ú	force_str)Úgettext_lazy)ÚRemovedInDRF317Warning)ÚcoreapiÚ
coreschema)ÚNotFound)ÚResponse)Úapi_settings)Úremove_query_paramÚreplace_query_paramFc                 ód   — 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Úrets       úU/var/www/html/truck-me/venv/lib/python3.12/site-packages/rest_framework/pagination.pyÚ_positive_intr      s:   € ô ˆnÓ
€CØ
ˆQ‚w�3˜!’8¡Ü‹lÐÙÜ�3˜ÓÐØ€Jó    c                 ó&   — | |z  r| |z  dz   S | |z  S )zD
    Returns 'a' divided by 'b', with any remainder rounded up.
    é   © )ÚaÚbs     r   Ú_divide_with_ceilr%   '   s"   € ð 	ˆ1‚uØ�Q‘˜!‰|Ðà�‰6€Mr   c                 óô  — | dk\  sJ ‚|| k\  sJ ‚|dk  rt        t        d|dz   «      «      S d| dz
  | | dz   |h}| dk  r"|j                  d«       |j                  d«       | |dz
  k\  r(|j                  |dz
  «       |j                  |dz
  «       t        |«      D �cg c]  }d|cxk  r|k  rn n|‘Œ }}| dkD  r|j	                  dd«       | |dz
  k  r|j	                  t        |«      dz
  d«       |S c c}w )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!   é   é   é   é   r   N)ÚlistÚrangeÚaddÚsortedÚinsertÚlen)ÚcurrentÚfinalÚincludedÚidxs       r   Ú_get_displayed_page_numbersr5   1   s  € ð$ �aŠ<Ðˆ<Ø�GÒÐÐà�‚zÜ”E˜!˜U Q™YÓ'Ó(Ð(ð �7˜Q‘; ¨°1©°eÐ<€Hð �!‚|Ø�‰�QŒØ�‰�QŒØ�%˜!‘)ÒØ�‰�U˜Q‘YÔØ�‰�U˜Q‘YÔô ˜hÓ'öØØˆsÔ�eÕò 	ð€Hð ð �‚{Ø�‰˜˜4Ô Ø�˜‘ÒØ�‰œ˜H›¨Ñ)¨4Ô0Ø€Oùòs   ÂC5c                 ó|   — g }| D ]4  }|€t         }nt         ||«      |||k(  d¬«      }|j                  |«       Œ6 |S )zg
    Given a list of page numbers and `None` page breaks,
    return a list of `PageLink` objects.
    F©ÚurlÚnumberÚ	is_activeÚis_break)Ú
PAGE_BREAKÚPageLinkÚappend)Úpage_numbersr1   Úurl_funcÚ
page_linksÚpage_numberÚ	page_links         r   Ú_get_page_linksrD   d   s[   € ð
 €JØ#ò 
%ˆØÐÜ"‰Iä Ù˜[Ó)Ø"Ø&¨'Ñ1Øô	ˆIð 	×Ñ˜)Õ$ð
%ð Ðr   c                 óP   — d„ }t        | D �cg c]
  } ||«      ‘Œ c}«      S c c}w )z�
    Given an order_by tuple such as `('-created', 'uuid')` reverse the
    ordering and return a new tuple, eg. `('created', '-uuid')`.
    c                 ó8   — | j                  d«      r| dd  S d| z   S )Nú-r!   )Ú
startswith)Úxs    r   Úinvertz!_reverse_ordering.<locals>.invert}   s"   € ØŸ™ SÔ)ˆq��ˆuÐ6¨s°Q©wÐ6r   )Útuple)Úordering_tuplerJ   Úitems      r   Ú_reverse_orderingrN   x   s&   € ò
7ô ¨>Ö: 4‘&˜•,Ò:Ó;Ð;ùÒ:s   �#ÚCursor©ÚoffsetÚreverseÚpositionr=   r7   Tc                   ó<   — e Zd ZdZd
d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
y)ÚBasePaginationFNc                 ó   — t        d«      ‚)Nz(paginate_queryset() must be implemented.©ÚNotImplementedError©ÚselfÚquerysetÚrequestÚviews       r   Úpaginate_querysetz BasePagination.paginate_querysetŒ   s   € Ü!Ð"LÓMÐMr   c                 ó   — t        d«      ‚)Nz-get_paginated_response() must be implemented.rW   ©rZ   Údatas     r   Úget_paginated_responsez%BasePagination.get_paginated_response�   s   € Ü!Ð"QÓRÐRr   c                 ó   — |S ©Nr"   ©rZ   Úschemas     r   Úget_paginated_response_schemaz,BasePagination.get_paginated_response_schema’   s   € Øˆr   c                 ó   — t        d«      ‚)Nz7to_html() must be implemented to display page controls.rW   ©rZ   s    r   Úto_htmlzBasePagination.to_html•   s   € Ü!Ð"[Ó\Ð\r   c                 ó   — |d   S )NÚresultsr"   r`   s     r   Úget_resultszBasePagination.get_results˜   s   € Ø�I‰Ðr   c                 ó`   — t         €J d«       ‚t         �t        j                  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   ©rZ   r]   s     r   Úget_schema_fieldsz BasePagination.get_schema_fields›   s/   € ÜÐ"Ð\Ð$\Ó\Ð"ÜÐÜ�M‰MÐ_ÔawÔxØˆ	r   c                 ó   — g S rd   r"   rs   s     r   Úget_schema_operation_parametersz.BasePagination.get_schema_operation_parameters¡   s   € Øˆ	r   rd   )Ú__name__Ú
__module__Ú__qualname__Údisplay_page_controlsr^   rb   rg   rj   rm   rt   rv   r"   r   r   rU   rU   ‰   s.   „ Ø!ÐóNòSòò]òòór   rU   c                   ó´   — 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	„Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)Ú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                 ó   — || _         | j                  |«      }|sy| j                  ||«      }| j                  ||«      }	 |j	                  |«      | _        |j                  dkD  r| j                  �d| _        t        | j                  «      S # t
        $ r6}| j                  j                  |t        |«      ¬«      }t        |«      ‚d}~ww xY w)z“
        Paginate a queryset if required, either returning a
        page object, or `None` if pagination is not configured for this view.
        N)rB   Úmessager!   T)r\   Úget_page_sizeÚdjango_paginator_classÚget_page_numberr}   r   Úinvalid_page_messageÚformatÚstrr   Ú	num_pagesÚtemplaterz   r+   )	rZ   r[   r\   r]   Ú	page_sizeÚ	paginatorrB   ÚexcÚmsgs	            r   r^   z&PageNumberPagination.paginate_querysetÆ   sË   € ð
 ˆŒØ×&Ñ& wÓ/ˆ	ÙØà×/Ñ/°¸)ÓDˆ	Ø×*Ñ*¨7°IÓ>ˆð	 Ø!Ÿ™ {Ó3ˆDŒIð ×Ñ Ò" t§}¡}Ð'@à)-ˆDÔ&ä�D—I‘I‹Ðøô ò 	 Ø×+Ñ+×2Ñ2Ø'´°S³ð 3ó ˆCô ˜3“-Ðûð		 ús   ÁB Â	CÂ1CÃCc                 óŒ   — |j                   j                  | j                  «      xs d}|| j                  v r|j                  }|S ©Nr!   )Úquery_paramsÚgetÚpage_query_paramÚlast_page_stringsr‰   )rZ   r\   rŒ   rB   s       r   r…   z$PageNumberPagination.get_page_numberá   sB   € Ø×*Ñ*×.Ñ.¨t×/DÑ/DÓEÒJÈˆØ˜$×0Ñ0Ñ0Ø#×-Ñ-ˆKØÐr   c                 ó–   — t        | j                  j                  j                  | j	                  «       | j                  «       |dœ«      S ©N©ÚcountÚnextÚpreviousrl   )r   r}   rŒ   r˜   Úget_next_linkÚget_previous_linkr`   s     r   rb   z+PageNumberPagination.get_paginated_responseç   sB   € ÜØ—Y‘Y×(Ñ(×.Ñ.Ø×&Ñ&Ó(Ø×.Ñ.Ó0Øñ	
ó ð 	r   c           
      óž   — dddgdddœddd	d
j                  | j                  ¬«      dœddd	dj                  | j                  ¬«      dœ|dœdœS )NÚobjectr˜   rl   Ú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“   re   s     r   rg   z2PageNumberPagination.get_paginated_response_schemaï   sŠ   € àØ  )Ð,ð &Ø"ñð
 %Ø $Ø#ØV×]Ñ]Ø)-×)>Ñ)>ð  ^ó  @ñ	ð %Ø $Ø#ØV×]Ñ]Ø)-×)>Ñ)>ð  ^ó  @ñ	ð "ñ'ñ
ð 	
r   c                 ó  — | j                   rWt        j                  t        t        «      5  t        |j                  | j                      d| j                  ¬«      cd d d «       S | j                  S # 1 sw Y   | j                  S xY w©NT)r   r   ©	Úpage_size_query_paramÚ
contextlibÚsuppressÚKeyErrorr   r   r‘   Úmax_page_sizer‹   ©rZ   r\   s     r   rƒ   z"PageNumberPagination.get_page_size
  óp   € Ø×%Ò%Ü×$Ñ$¤X¬zÓ:ñ Ü$Ø×(Ñ(¨×)CÑ)CÑDØØ×-Ñ-ô÷ñ ð �~‰~Ð÷ð �~‰~Ðúó   «/A0Á0Bc                 óÎ   — | j                   j                  «       sy | j                  j                  «       }| j                   j	                  «       }t        || j                  |«      S rd   )r}   Úhas_nextr\   Úbuild_absolute_uriÚnext_page_numberr   r“   ©rZ   r8   rB   s      r   r›   z"PageNumberPagination.get_next_link  sN   € Ø�y‰y×!Ñ!Ô#ØØ�l‰l×-Ñ-Ó/ˆØ—i‘i×0Ñ0Ó2ˆÜ" 3¨×(=Ñ(=¸{ÓKÐKr   c                 ó  — | j                   j                  «       sy | j                  j                  «       }| j                   j	                  «       }|dk(  rt        || j                  «      S t        || j                  |«      S r�   )r}   Úhas_previousr\   r¸   Úprevious_page_numberr   r“   r   rº   s      r   rœ   z&PageNumberPagination.get_previous_link  si   € Ø�y‰y×%Ñ%Ô'ØØ�l‰l×-Ñ-Ó/ˆØ—i‘i×4Ñ4Ó6ˆØ˜!ÒÜ% c¨4×+@Ñ+@ÓAÐAÜ" 3¨×(=Ñ(=¸{ÓKÐKr   c                 ó(  ‡ ‡— ‰ j                   j                  «       Šˆˆ fd„}‰ j                  j                  }‰ j                  j                  j
                  }t        ||«      }t        |||«      }‰ j                  «       ‰ j                  «       |dœS )Nc                 óh   •— | dk(  rt        ‰‰j                  «      S t        ‰‰j                  | «      S r�   )r   r“   r   )rB   Úbase_urlrZ   s    €€r   Úpage_number_to_urlzAPageNumberPagination.get_html_context.<locals>.page_number_to_url'  s3   ø€ Ø˜aÒÜ)¨(°D×4IÑ4IÓJÐJä*¨8°T×5JÑ5JÈKÓXÐXr   ©Úprevious_urlÚnext_urlrA   )
r\   r¸   r}   r9   rŒ   r‰   r5   rD   rœ   r›   )rZ   rÁ   r1   r2   r?   rA   rÀ   s   `     @r   Úget_html_contextz%PageNumberPagination.get_html_context$  sƒ   ù€ Ø—<‘<×2Ñ2Ó4ˆõ	Yð —)‘)×"Ñ"ˆØ—	‘	×#Ñ#×-Ñ-ˆÜ2°7¸EÓBˆÜ$ \°7Ð<NÓOˆ
ð !×2Ñ2Ó4Ø×*Ñ*Ó,Ø$ñ
ð 	
r   c                 ó‚   — t        j                  | j                  «      }| j                  «       }|j	                  |«      S rd   ©r
   Úget_templaterŠ   rÅ   Úrender©rZ   rŠ   Úcontexts      r   rj   zPageNumberPagination.to_html8  ó3   € Ü×&Ñ& t§}¡}Ó5ˆØ×'Ñ'Ó)ˆØ�‰˜wÓ'Ð'r   c                 óÞ  — t         €J d«       ‚t         �t        j                  dt        «       t        €J d«       ‚t        j
                  | j                  ddt	        j                  dt        | j                  «      ¬«      ¬«      g}| j                  �Z|j                  t        j
                  | j                  ddt	        j                  d	t        | j                  «      ¬«      ¬«      «       |S )
Nro   rp   ú9coreschema must be installed to use `get_schema_fields()`FÚqueryÚPage©ÚtitleÚdescription©Únamer©   Úlocationrf   ú	Page size)r   rq   rr   r   r   ÚFieldr“   ÚIntegerr   Úpage_query_descriptionr®   r>   Úpage_size_query_description©rZ   r]   Úfieldss      r   rt   z&PageNumberPagination.get_schema_fields=  sØ   € ÜÐ"Ð\Ð$\Ó\Ð"ÜÐÜ�M‰MÐ_ÔawÔxÜÐ%ÐbÐ'bÓbÐ%ä�M‰MØ×*Ñ*ØØ Ü!×)Ñ)Ø Ü )¨$×*EÑ*EÓ Fôô	ð

ˆð ×%Ñ%Ð1Ø�M‰MÜ—‘Ø×3Ñ3Ø"Ø$Ü%×-Ñ-Ø)Ü$-¨d×.NÑ.NÓ$Oôô	ô
ð ˆr   c                 óÚ   — | j                   ddt        | j                  «      ddidœg}| j                  �6|j	                  | j                  ddt        | j
                  «      ddidœ«       |S ©NFrÏ   r¢   rŸ   ©rÕ   r©   ÚinrÓ   rf   )r“   r   rÚ   r®   r>   rÛ   ©rZ   r]   Ú
parameterss      r   rv   z4PageNumberPagination.get_schema_operation_parameters[  s‡   € ð ×-Ñ-Ø!ØÜ(¨×)DÑ)DÓEà˜Iðñð

ˆ
ð ×%Ñ%Ð1Ø×Ñà ×6Ñ6Ø %Ø!Ü#,¨T×-MÑ-MÓ#Nà 	ðñô
ð Ðr   rd   )rw   rx   ry   Ú__doc__r   Ú	PAGE_SIZEr‹   ÚDjangoPaginatorr„   r“   Ú_rÚ   r®   rÛ   r²   r”   rŠ   r†   r^   r…   rb   rg   rƒ   r›   rœ   rÅ   rj   rt   rv   r"   r   r   r|   r|   ¥   s˜   „ ñð ×&Ñ&€Ià,Ðð ÐÙÐOÓPÐð !ÐÙ"#Ð$KÓ"LÐð €Mà!Ðà7€Há˜_Ó-Ðóò6òò
ò6òLòLò
ò((ò
ó<r   r|   c                   ó¢   — 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„Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚLimitOffsetPaginationzœ
    A limit/offset based style. For example:

    http://api.example.org/accounts/?limit=100
    http://api.example.org/accounts/?offset=400&limit=100
    Úlimitr~   rQ   z3The initial index from which to return the results.Nr€   c                 ó¸  — || _         | j                  |«      | _        | j                  €y | j                  |«      | _        | j                  |«      | _        | j                  | j                  kD  r| j                  �d| _        | j                  dk(  s| j                  | j                  kD  rg S t        || j                  | j                  | j                  z    «      S )NTr   )
r\   Ú	get_limitrê   Ú	get_countr˜   Ú
get_offsetrQ   rŠ   rz   r+   rY   s       r   r^   z'LimitOffsetPagination.paginate_queryset…  s©   € ØˆŒØ—^‘^ GÓ,ˆŒ
Ø�:‰:ÐØà—^‘^ HÓ-ˆŒ
Ø—o‘o gÓ.ˆŒØ�:‰:˜Ÿ
™
Ò" t§}¡}Ð'@Ø)-ˆDÔ&à�:‰:˜Š?˜dŸk™k¨D¯J©JÒ6ØˆIÜ�H˜TŸ[™[¨¯©°t·z±zÑ)AÐBÓCÐCr   c                 ón   — t        | j                  | j                  «       | j                  «       |dœ«      S r–   )r   r˜   r›   rœ   r`   s     r   rb   z,LimitOffsetPagination.get_paginated_response”  s6   € ÜØ—Z‘ZØ×&Ñ&Ó(Ø×.Ñ.Ó0Øñ	
ó ð 	r   c                 óÊ   — dddgdddœddd	d
j                  | j                  | j                  ¬«      dœddd	dj                  | j                  | j                  ¬«      dœ|dœdœS )Nrž   r˜   rl   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_paramre   s     r   rg   z3LimitOffsetPagination.get_paginated_response_schemaœ  sš   € àØ  )Ð,ð &Ø"ñð
 %Ø $Ø#Øf×mÑmØ%)×%<Ñ%<È$×J`ÑJ`ð  nó  bñ	ð %Ø $Ø#Øf×mÑmØ%)×%<Ñ%<È$×J`ÑJ`ð  nó  bñ	ð "ñ'ñ
ð 	
r   c                 ó  — | j                   rWt        j                  t        t        «      5  t        |j                  | j                      d| j                  ¬«      cd d d «       S | j                  S # 1 sw Y   | j                  S xY wr¬   )	rô   r¯   r°   r±   r   r   r‘   Ú	max_limitÚdefault_limitr³   s     r   rì   zLimitOffsetPagination.get_limit·  sr   € Ø×!Ò!Ü×$Ñ$¤X¬zÓ:ñ Ü$Ø×(Ñ(¨×)?Ñ)?Ñ@ØØŸ>™>ô÷ñ ð ×!Ñ!Ð!÷ð ×!Ñ!Ð!úrµ   c                 ór   — 	 t        |j                  | j                     «      S # t        t        f$ r Y yw xY w©Nr   )r   r‘   ró   r±   r   r³   s     r   rî   z LimitOffsetPagination.get_offsetÁ  sA   € ð	Ü Ø×$Ñ$ T×%<Ñ%<Ñ=óð øô œ*Ð%ò 	Ùð	ús   ‚!$ ¤6µ6c                 ó&  — | j                   | j                  z   | j                  k\  ry | j                  j	                  «       }t        || j                  | j                  «      }| j                   | j                  z   }t        || j                  |«      S rd   )rQ   rê   r˜   r\   r¸   r   rô   ró   ©rZ   r8   rQ   s      r   r›   z#LimitOffsetPagination.get_next_linkÉ  so   € Ø�;‰;˜Ÿ™Ñ# t§z¡zÒ1Øà�l‰l×-Ñ-Ó/ˆÜ! # t×'=Ñ'=¸t¿z¹zÓJˆà—‘˜tŸz™zÑ)ˆÜ" 3¨×(?Ñ(?ÀÓHÐHr   c                 ó\  — | j                   dk  ry | j                  j                  «       }t        || j                  | j
                  «      }| j                   | j
                  z
  dk  rt        || j                  «      S | j                   | j
                  z
  }t        || j                  |«      S rù   )rQ   r\   r¸   r   rô   rê   r   ró   rû   s      r   rœ   z'LimitOffsetPagination.get_previous_linkÓ  sŠ   € Ø�;‰;˜!ÒØà�l‰l×-Ñ-Ó/ˆÜ! # t×'=Ñ'=¸t¿z¹zÓJˆà�;‰;˜Ÿ™Ñ# qÒ(Ü% c¨4×+BÑ+BÓCÐCà—‘˜tŸz™zÑ)ˆÜ" 3¨×(?Ñ(?ÀÓHÐHr   c                 óê  ‡ ‡‡— ‰ j                   j                  «       Š‰ j                  r~t        ‰ j                  ‰ j                  «      dz   Št        ‰ j
                  ‰ j                  z
  ‰ j                  «      t        ‰ j                  ‰ j                  «      z   }t        |d«      }ndŠd}‰|kD  r|Šˆˆˆ fd„}t        ‰|«      }t        |‰|«      }‰ j                  «       ‰ j                  «       |dœS )Nr!   c                 ó¦   •— | dk(  rt        ‰‰j                  «      S ‰j                  | ‰z
  ‰j                  z  z   }t	        ‰‰j                  |«      S r�   )r   ró   rQ   rê   r   )rB   rQ   rÀ   r1   rZ   s     €€€r   rÁ   zBLimitOffsetPagination.get_html_context.<locals>.page_number_to_urlø  sO   ø€ Ø˜aÒÜ)¨(°D×4KÑ4KÓLÐLàŸ™¨°wÑ)>À$Ç*Á*Ñ(LÑM�Ü*¨8°T×5LÑ5LÈfÓUÐUr   rÂ   )r\   r¸   rê   r%   rQ   r˜   Úmaxr5   rD   rœ   r›   )rZ   r2   rÁ   r?   rA   rÀ   r1   s   `    @@r   rÅ   z&LimitOffsetPagination.get_html_contextà  sÛ   ú€ Ø—<‘<×2Ñ2Ó4ˆà�:Š:Ü'¨¯©°T·Z±ZÓ@À1ÑDˆGô " $§*¡*¨t¯{©{Ñ":¸D¿J¹JÓGÜ! $§+¡+¨t¯z©zÓ:ñ;ð ô
 ˜˜q“M‰EàˆGØˆEà�UŠ?ØˆGö	Vô 3°7¸EÓBˆÜ$ \°7Ð<NÓOˆ
ð !×2Ñ2Ó4Ø×*Ñ*Ó,Ø$ñ
ð 	
r   c                 ó‚   — t        j                  | j                  «      }| j                  «       }|j	                  |«      S rd   rÇ   rÊ   s      r   rj   zLimitOffsetPagination.to_html  rÌ   r   c                 ód   — 	 |j                  «       S # t        t        f$ r t        |«      cY S w xY w)zZ
        Determine an object count, supporting either querysets or regular lists.
        )r˜   ÚAttributeErrorÚ	TypeErrorr0   )rZ   r[   s     r   rí   zLimitOffsetPagination.get_count  s2   € ð	!Ø—>‘>Ó#Ð#øÜ¤	Ð*ò 	!Ü�x“=Ò ð	!ús   ‚ ’/®/c                 ó¢  — t         €J d«       ‚t         �t        j                  dt        «       t        €J d«       ‚t        j
                  | j                  ddt	        j                  dt        | j                  «      ¬«      ¬«      t        j
                  | j                  ddt	        j                  d	t        | j                  «      ¬«      ¬«      gS )
Nro   rp   rÎ   FrÏ   ÚLimitrÑ   rÔ   ÚOffset)r   rq   rr   r   r   rØ   rô   rÙ   r   Úlimit_query_descriptionró   Úoffset_query_descriptionrs   s     r   rt   z'LimitOffsetPagination.get_schema_fields  s¼   € ÜÐ"Ð\Ð$\Ó\Ð"ÜÐÜ�M‰MÐ_ÔawÔxÜÐ%ÐbÐ'bÓbÐ%ä�M‰MØ×+Ñ+ØØ Ü!×)Ñ)Ø!Ü )¨$×*FÑ*FÓ Gôô	ô �M‰MØ×,Ñ,ØØ Ü!×)Ñ)Ø"Ü )¨$×*GÑ*GÓ Hôô	ð
ð 	
r   c                 ó¢   — | 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â   s      r   rv   z5LimitOffsetPagination.get_schema_operation_parameters0  sm   € ð ×.Ñ.Ø!ØÜ(¨×)EÑ)EÓFà˜Iðñð ×/Ñ/Ø!ØÜ(¨×)FÑ)FÓGà˜Iðñð
ˆ
ð( Ðr   rd   )rw   rx   ry   rä   r   rå   r÷   rô   rç   r  ró   r  rö   rŠ   r^   rb   rg   rì   rî   r›   rœ   rÅ   rj   rí   rt   rv   r"   r   r   ré   ré   v  s‚   „ ñð !×*Ñ*€MØÐÙÐ GÓHÐØ!ÐÙ Ð!VÓWÐØ€IØ7€HóDòò
ò6"òòIòIò&
òP(ò
!ò
ó4r   ré   c                   óÆ   — 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
„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)Ú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.htmlNr~   iè  c                 óˆ  — || _         | j                  |«      | _        | j                  sy |j                  «       | _        | j                  |||«      | _        | j                  |«      | _        | j                  €d\  }}}n| j                  \  }}}|r# |j                  t        | j                  «      Ž }n |j                  | j                  Ž }t        |«      dk7  rŽ| j                  d   }|j                  d«      }|j                  d«      }	| j                  j                  |k7  r|	dz   |i}
n|	dz   |i}
t        di |
¤Ž}|r|r|r|t        di |	dz   di¤Žz  }|j!                  |«      }t#        |||| j                  z   d	z    «      }t#        |d | j                   «      | _        t'        |«      t'        | j$                  «      kD  r"d}| j)                  |d
   | j                  «      }nd}d }|rat#        t+        | j$                  «      «      | _        |d uxs |dkD  | _        || _        | j,                  r|| _        | j.                  rE|| _        n=|| _        |d uxs |dkD  | _        | j,                  r|| _        | j.                  r|| _        | j.                  s| j,                  r| j4                  �d| _        | j$                  S )N)r   FNÚNoner   rG   Ú__ltÚ__gtÚ__isnullTr!   éÿÿÿÿFr"   )r\   rƒ   r‹   r¸   rÀ   Úget_orderingÚorderingÚdecode_cursorr  Úorder_byrN   rˆ   rH   ÚlstriprR   r	   Úfilterr+   r}   r0   Ú_get_position_from_instanceÚreversedr·   r¼   Únext_positionÚprevious_positionrŠ   rz   )rZ   r[   r\   r]   rQ   rR   Úcurrent_positionÚorderÚis_reversedÚ
order_attrÚkwargsÚfilter_queryrl   Úhas_following_positionÚfollowing_positions                  r   r^   z"CursorPagination.paginate_querysetd  s©  € ØˆŒØ×+Ñ+¨GÓ4ˆŒØ�~Š~Øà×2Ñ2Ó4ˆŒØ×)Ñ)¨'°8¸TÓBˆŒà×(Ñ(¨Ó1ˆŒØ�;‰;ÐØ2BÑ/ˆV�WÑ.à26·+±+Ñ/ˆV�WÐ.ñ Ø(�x×(Ñ(Ô*;¸D¿M¹MÓ*JÐK‰Hà(�x×(Ñ(¨$¯-©-Ð8ˆHô ÐÓ  FÒ*Ø—M‘M !Ñ$ˆEØ×*Ñ*¨3Ó/ˆKØŸ™ cÓ*ˆJð �{‰{×"Ñ" kÒ1Ø$ vÑ-Ð/?Ð@‘à$ vÑ-Ð/?Ð@�ä™;˜v™;ˆLñ ¡±Ø¤Ñ D Z°*Ñ%<¸dÐ$CÑ DÑD�Ø—‘ |Ó4ˆHô
 �x  v°·±Ñ'>ÀÑ'BÐCÓDˆÜ˜  $§.¡.Ð1Ó2ˆŒ	ô ˆw‹<œ#˜dŸi™i›.Ò(Ø%)Ð"Ø!%×!AÑ!AÀ'È"Á+ÈtÏ}É}Ó!]Ñà%*Ð"Ø!%Ðáô œX d§i¡iÓ0Ó1ˆDŒIð .°TÐ9ÒJ¸vÈ¹zˆDŒMØ 6ˆDÔØ�}Š}Ø%5�Ô"Ø× Ò Ø);�Õ&ð 3ˆDŒMØ!1¸Ð!=Ò NÀ6ÈAÁ:ˆDÔØ�}Š}Ø%7�Ô"Ø× Ò Ø)9�Ô&ð ×Ò §¢°D·M±MÐ4MØ)-ˆDÔ&à�y‰yÐr   c                 ó  — | j                   rWt        j                  t        t        «      5  t        |j                  | j                      d| j                  ¬«      cd d d «       S | j                  S # 1 sw Y   | j                  S xY wr¬   r­   r³   s     r   rƒ   zCursorPagination.get_page_size¶  r´   rµ   c                 ó  — | j                   sy | j                  re| j                  rY| j                  j                  rC| j                  j                  dk7  r*| j                  | j                  d   | j                  «      }n| j                  }d}d}t        | j                  «      D ]0  }| j                  || j                  «      }||k7  r|d u} n	|}|dz  }Œ2 | j                  rq|so| j                  s| j                  }d }nT| j                  j                  rd}| j                  }n/| j                  j                  | j                  z   }| j                  }| j                  s| j                  }t        |d¬«      }| j                  |«      S )Nr   r  Fr!   rP   )r·   r}   r  rR   rQ   r  r  r  r  r¼   r‹   r  rO   Úencode_cursor©rZ   ÚcomparerQ   Úhas_item_with_unique_positionrM   rS   r  s          r   r›   zCursorPagination.get_next_linkÀ  s]  € Ø�}Š}Øà�9Š9˜Ÿš¨¯©×)<Ò)<ÀÇÁ×ASÑASÐWXÒAXð ×6Ñ6°t·y±yÀ±}ÀdÇmÁmÓT‰Gà×(Ñ(ˆGØˆà(-Ð%Ü˜TŸY™YÓ'ò 	ˆDØ×7Ñ7¸¸d¿m¹mÓLˆHØ˜7Ò"ð 19ÀÐ0DÐ-Ùð
 ˆGØ�a‰K‰Fð	ð �9Š9Ñ:à×$Ò$ð Ÿ™�Ø‘Ø—‘×$Ò$ð �Ø×1Ñ1‘ð Ÿ™×+Ñ+¨d¯n©nÑ<�Ø×1Ñ1�à�yŠyØ×)Ñ)ˆHä˜v¨u¸xÔHˆØ×!Ñ! &Ó)Ð)r   c                 ó  — | j                   sy | j                  re| j                  rY| j                  j                  sC| j                  j                  dk7  r*| j                  | j                  d   | j                  «      }n| j                  }d}d}| j                  D ]0  }| j                  || j                  «      }||k7  r|d u} n	|}|dz  }Œ2 | j                  rq|so| j                  s| j                  }d }nT| j                  j                  r0| j                  j                  | j                  z   }| j                  }nd}| j                  }| j                  s| j                  }t        |d¬«      }| j                  |«      S )Nr   Fr!   TrP   )r¼   r}   r  rR   rQ   r  r  r  r·   r‹   r  rO   r'  r(  s          r   rœ   z"CursorPagination.get_previous_linkõ  sX  € Ø× Ò Øà�9Š9˜Ÿš¨T¯[©[×-@Ò-@ÀTÇ[Á[×EWÑEWÐ[\ÒE\ð ×6Ñ6°t·y±yÀ±|ÀTÇ]Á]ÓS‰Gà×,Ñ,ˆGØˆà(-Ð%Ø—I‘Iò 	ˆDØ×7Ñ7¸¸d¿m¹mÓLˆHØ˜7Ò"ð 19ÀÐ0DÐ-Ùð
 ˆGØ�a‰K‰Fð	ð �9Š9Ñ:à—=’=ð Ÿ™�Ø‘Ø—‘×$Ò$ð Ÿ™×+Ñ+¨d¯n©nÑ<�Ø×-Ñ-‘ð �Ø×-Ñ-�à�yŠyØ×-Ñ-ˆHä˜v¨t¸hÔGˆØ×!Ñ! &Ó)Ð)r   c                 ó¨  — | j                   }t        |dg «      D �cg c]  }t        |d«      r|‘Œ }}|r#|d   } |«       }|j                  |||«      }|r|}|€J d«       ‚d|vsJ d«       ‚t	        |t
        t        t        f«      s*J dj                  t        |«      j                  ¬«      «       ‚t	        |t
        «      r|fS t        |«      S c c}w )	zV
        Return a tuple of strings, that may be used in an `order_by` method.
        Úfilter_backendsr  r   zXUsing 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  ÚgetattrÚhasattrr  Ú
isinstancerˆ   r+   rK   r‡   r¢   rw   )	rZ   r\   r[   r]   r  Ú
filter_clsÚordering_filtersÚfilter_instanceÚordering_from_filters	            r   r  zCursorPagination.get_ordering*  s  € ð —=‘=ˆô *1°Ð7HÈ"Ó)Mö
Ø%Ü�z >Ô2ò ð
Ðð 
ñ
 ð *¨!Ñ,ˆJÙ(›lˆOØ#2×#?Ñ#?ÀÈÐSWÓ#XÐ Ù#Ø/�àÐ#ð 	
ð'ó	
Ð#ð ˜8Ñ#ð 	
ðLó	
Ð#ô ˜(¤S¬$´Ð$6Ô7ð 	
ØH×OÑOÜ˜(“^×,Ñ,ð Pó ó	
Ð7ô �h¤Ô$Ø�;ÐÜ�X‹ÐùòA
s   œCc                 ó  — |j                   j                  | j                  «      }|€y	 t        |j	                  d«      «      j                  d«      }t        j                  |d¬«      }|j                  ddg«      d   }t        || j                  ¬«      }|j                  d	dg«      d   }t        t        |«      «      }|j                  d
dg«      d   }t!        |||¬«      S # t        t        f$ r t        | j                  «      ‚w xY w)zL
        Given a request with a cursor, return a `Cursor` instance.
        NÚasciiT)Úkeep_blank_valuesÚoÚ0r   )r   ÚrÚprP   )r‘   r’   Úcursor_query_paramr   ÚencodeÚdecoder   Úparse_qsr   Úoffset_cutoffÚboolr   r  r   r   Úinvalid_cursor_messagerO   )rZ   r\   ÚencodedÚquerystringÚtokensrQ   rR   rS   s           r   r  zCursorPagination.decode_cursorT  sø   € ð
 ×&Ñ&×*Ñ*¨4×+BÑ+BÓCˆØˆ?Øð	8Ü# G§N¡N°7Ó$;Ó<×CÑCÀGÓLˆKÜ—^‘^ KÀ4ÔHˆFà—Z‘Z  c UÓ+¨AÑ.ˆFÜ" 6°$×2DÑ2DÔEˆFà—j‘j  s eÓ,¨QÑ/ˆGÜœ3˜w›<Ó(ˆGà—z‘z #¨ vÓ.¨qÑ1ˆHô ˜V¨W¸xÔHÐHøô œ:Ð&ò 	8Ü˜4×6Ñ6Ó7Ð7ð	8ús   ªB-C% Ã%%D
c                 ón  — i }|j                   dk7  rt        |j                   «      |d<   |j                  rd|d<   |j                  �|j                  |d<   t	        j
                  |d¬«      }t        |j                  d«      «      j                  d«      }t        | j                  | j                  |«      S )	zM
        Given a Cursor instance, return an url with encoded cursor.
        r   r9  Ú1r;  r<  T)Údoseqr7  )rQ   rˆ   rR   rS   r   Ú	urlencoder   r>  r?  r   rÀ   r=  )rZ   r  rF  rE  rD  s        r   r'  zCursorPagination.encode_cursorm  s—   € ð ˆØ�=‰=˜AÒÜ˜fŸm™mÓ,ˆF�3‰KØ�>Š>ØˆF�3‰KØ�?‰?Ð&Ø Ÿ/™/ˆF�3‰Kä—o‘o f°DÔ9ˆÜ˜K×.Ñ.¨wÓ7Ó8×?Ñ?ÀÓHˆÜ" 4§=¡=°$×2IÑ2IÈ7ÓSÐSr   c                 óŒ   — |d   j                  d«      }t        |t        «      r||   }nt        ||«      }|€d S t	        |«      S )Nr   rG   )r  r1  Údictr/  rˆ   )rZ   Úinstancer  Ú
field_nameÚattrs        r   r  z,CursorPagination._get_position_from_instance}  sI   € Ø˜a‘[×'Ñ'¨Ó,ˆ
Ü�h¤Ô%Ø˜JÑ'‰Dä˜8 ZÓ0ˆDØ�|ˆtÐ2¬¨T«Ð2r   c                 óX   — t        | j                  «       | j                  «       |dœ«      S )N©r™   rš   rl   )r   r›   rœ   r`   s     r   rb   z'CursorPagination.get_paginated_response…  s/   € ÜØ×&Ñ&Ó(Ø×.Ñ.Ó0Øñ
ó ð 	r   c           	      ó”   — ddgddddj                  | j                  ¬«      dœdddd	j                  | j                  ¬«      dœ|d
œdœS )Nrž   rl   r¤   Tr¥   zAhttp://api.example.org/accounts/?{cursor_query_param}=cD00ODY%3D")r=  r¦   zBhttp://api.example.org/accounts/?{cursor_query_param}=cj0xJnA9NDg3rQ  r¨   )r‡   r=  re   s     r   rg   z.CursorPagination.get_paginated_response_schemaŒ  sz   € àØ"˜ð %Ø $Ø#Øb×iÑiØ+/×+BÑ+Bð  jó  Dñ	ð %Ø $Ø#Øc×jÑjØ+/×+BÑ+Bð  kó  Dñ	ð "ññ
ð 	
r   c                 óD   — | j                  «       | j                  «       dœS )N)rÃ   rÄ   )rœ   r›   ri   s    r   rÅ   z!CursorPagination.get_html_context£  s$   € à ×2Ñ2Ó4Ø×*Ñ*Ó,ñ
ð 	
r   c                 ó‚   — t        j                  | j                  «      }| j                  «       }|j	                  |«      S rd   rÇ   rÊ   s      r   rj   zCursorPagination.to_html©  rÌ   r   c                 óÞ  — t         €J d«       ‚t         �t        j                  dt        «       t        €J d«       ‚t        j
                  | j                  ddt	        j                  dt        | j                  «      ¬«      ¬«      g}| j                  �Z|j                  t        j
                  | j                  ddt	        j                  d	t        | j                  «      ¬«      ¬«      «       |S )
Nro   rp   rÎ   FrÏ   rO   rÑ   rÔ   r×   )r   rq   rr   r   r   rØ   r=  ÚStringr   Úcursor_query_descriptionr®   r>   rÙ   rÛ   rÜ   s      r   rt   z"CursorPagination.get_schema_fields®  sØ   € ÜÐ"Ð\Ð$\Ó\Ð"ÜÐÜ�M‰MÐ_ÔawÔxÜÐ%ÐbÐ'bÓbÐ%ä�M‰MØ×,Ñ,ØØ Ü!×(Ñ(Ø"Ü )¨$×*GÑ*GÓ Hôô	ð

ˆð ×%Ñ%Ð1Ø�M‰MÜ—‘Ø×3Ñ3Ø"Ø$Ü%×-Ñ-Ø)Ü$-¨d×.NÑ.NÓ$Oôô	ô
ð ˆr   c                 óÚ   — | j                   ddt        | j                  «      ddidœg}| j                  �6|j	                  | j                  ddt        | j
                  «      ddidœ«       |S )NFrÏ   r¢   r¤   rà   rŸ   )r=  r   rW  r®   r>   rÛ   râ   s      r   rv   z0CursorPagination.get_schema_operation_parametersÌ  s‡   € ð ×/Ñ/Ø!ØÜ(¨×)FÑ)FÓGà˜Hðñð

ˆ
ð ×%Ñ%Ð1Ø×Ñà ×6Ñ6Ø %Ø!Ü#,¨T×-MÑ-MÓ#Nà 	ðñô
ð Ðr   rd   )rw   rx   ry   rä   r=  rç   rW  r   rå   r‹   rC  r  rŠ   r®   rÛ   r²   rA  r^   rƒ   r›   rœ   r  r  r'  r  rb   rg   rÅ   rj   rt   rv   r"   r   r   r  r  H  s«   „ ñð
 "ÐÙ Ð!?Ó@ÐØ×&Ñ&€IÙÐ/Ó0ÐØ€HØA€Hð !ÐÙ"#Ð$KÓ"LÐð €Mð €MóPòdò3*òj3*òj(òTIò2Tò 3òò
ò.
ò(ò
ó<r   r  )FN)1rä   r¯   rq   Úbase64r   r   Úcollectionsr   Úurllibr   Údjango.core.paginatorr   r   ræ   Údjango.db.modelsr	   Ú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%   r5   rD   rN   rO   r=   r<   rU   r|   ré   r  r"   r   r   ú<module>rg     s»   ðñó
 Û ß 'Ý "Ý å -Ý >Ý Ý "Ý +Ý 6å 1ß 5Ý .Ý ,Ý 0ß Mó	òò0òfò(<ñ 
�HÒ?Ó	@€Ù�jÒ"LÓM€á˜$ t°uÀtÔL€
÷ñ ô8N˜>ô NôbO˜Nô Oôd\�~õ \r   