ó
    |chýŽ  ã                   ó‚  • S r SSKrSSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
Jr  SSK
Jr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJrJr  SSKJr  SSKJr  SSKJr  SSK J!r!J"r"  S$S jr#S r$S r%S r&S r'\" S/ SQ5      r(\" S/ SQ5      r)\)" SSSSS9r* " S S5      r+ " S S\+5      r, " S  S!\+5      r- " S" S#\+5      r.g)%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                 óz   • [        U 5      nUS:  d  US:X  a  U(       a
  [        5       eU(       a  [        X25      $ U$ )z/
Cast a string to a strictly positive integer.
r   )ÚintÚ
ValueErrorÚmin)Úinteger_stringÚstrictÚcutoffÚrets       Úb/var/www/djangovue.mamus.xyz/django/venv/lib/python3.13/site-packages/rest_framework/pagination.pyÚ_positive_intr      s8   € ô ˆnÓ
€CØ
ˆQƒw�3˜!“8¦Ü‹lÐÞÜ�3ÓÐØ€Jó    c                 ó*   • X-  (       a  X-  S-   $ X-  $ )z<
Returns 'a' divided by 'b', with any remainder rounded up.
é   © )ÚaÚbs     r   Ú_divide_with_ceilr$   &   s   € ð 	‡uØ‘˜!‰|Ðà‰6€Mr   c                 ó
  • U S:¼  d   eX:¼  d   eUS::  a  [        [        SUS-   5      5      $ SU S-
  X S-   U1nU S::  a"  UR                  S5        UR                  S5        XS-
  :¼  a(  UR                  US-
  5        UR                  US-
  5        [        U5       Vs/ s H  nSUs=:  a  U::  d  M  O  M  UPM     nnU S:”  a  UR	                  SS5        XS-
  :  a  UR	                  [        U5      S-
  S5        U$ s  snf )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_numbersr4   0   s  € ð$ �a‹<Ðˆ<ØÓÐÐà�ƒzÜ”E˜!˜U Q™YÓ'Ó(Ð(ð �7˜Q‘; °1©°eÐ<€Hð �!ƒ|Ø�‰�QŒØ�‰�QŒØ˜!‘)ÓØ�‰�U˜Q‘YÔØ�‰�U˜Q‘YÔô ˜hÔ'óÚ'�ØˆsÕ�eÑó 	Ùõ 	Ñ'ð ð ð �ƒ{Ø�‰˜˜4Ô Ø˜‘ÓØ�‰œ˜H›¨Ñ)¨4Ô0Ø€Oùòs   ÂD Â4D Â8D c                 óz   • / nU  H2  nUc  [         nO[        U" U5      UXA:H  SS9nUR                  U5        M4     U$ )z[
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_numbersr0   Úurl_funcÚ
page_linksÚpage_numberÚ	page_links         r   Ú_get_page_linksrC   c   sT   € ð
 €JÛ#ˆØÑÜ"‰Iä Ù˜[Ó)Ø"Ø&Ñ1Øñ	ˆIð 	×Ñ˜)Ö$ñ $ð Ðr   c                 óT   • S n[        U  Vs/ s H
  o!" U5      PM     sn5      $ s  snf )z�
Given an order_by tuple such as `('-created', 'uuid')` reverse the
ordering and return a new tuple, eg. `('created', '-uuid')`.
c                 óB   • U R                  S5      (       a  U SS  $ SU -   $ )NÚ-r    )Ú
startswith)Úxs    r   ÚinvertÚ!_reverse_ordering.<locals>.invert|   s%   € ØŸ™ S×)Ñ)ˆq��ˆuÐ6¨s°Q©wÐ6r   )Útuple)Úordering_tuplerI   Úitems      r   Ú_reverse_orderingrN   w   s*   € ò
7ô ©>Ó:ª> 4�&˜–,©>Ñ:Ó;Ð;ùÒ:s   �%ÚCursor©ÚoffsetÚreverseÚpositionr<   r6   Tc                   óF   • \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rSrg)ÚBasePaginationéˆ   FNc                 ó   • [        S5      e)Nz(paginate_queryset() must be implemented.©ÚNotImplementedError©ÚselfÚquerysetÚrequestÚviews       r   Úpaginate_querysetÚ BasePagination.paginate_queryset‹   s   € Ü!Ð"LÓMÐMr   c                 ó   • [        S5      e)Nz-get_paginated_response() must be implemented.rX   ©r[   Údatas     r   Úget_paginated_responseÚ%BasePagination.get_paginated_responseŽ   s   € Ü!Ð"QÓRÐRr   c                 ó   • U$ ©Nr!   ©r[   Úschemas     r   Úget_paginated_response_schemaÚ,BasePagination.get_paginated_response_schema‘   s   € Øˆr   c                 ó   • [        S5      e)Nz7to_html() must be implemented to display page controls.rX   ©r[   s    r   Úto_htmlÚBasePagination.to_html”   s   € Ü!Ð"[Ó\Ð\r   c                 ó   • US   $ )NÚresultsr!   rb   s     r   Úget_resultsÚBasePagination.get_results—   s   € Ø�I‰Ðr   c                 óf   • [         c   S5       e[         b  [        R                  " S[        5        / $ )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   ©r[   r^   s     r   Úget_schema_fieldsÚ BasePagination.get_schema_fieldsš   s/   € ÜÑ"Ð\Ð$\Ó\Ð"ÜÑÜ�MŠMÐ_ÔawÔxØˆ	r   c                 ó   • / $ rg   r!   ry   s     r   Úget_schema_operation_parametersÚ.BasePagination.get_schema_operation_parameters    s   € Øˆ	r   r!   rg   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Údisplay_page_controlsr_   rd   rj   rn   rr   rz   r}   Ú__static_attributes__r!   r   r   rU   rU   ˆ   s.   † Ø!ÐôNòSòò]òòõr   rU   c                   ó¾   • \ rS rSrSr\R                  r\r	Sr
\" S5      rSr\" S5      rSrSrSr\" S	5      rSS
 jrS rS rS rS rS rS rS rS rS rS rSrg)ÚPageNumberPaginationé¤   z¾
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                 ó¤  • X l         U R                  U5      nU(       d  gU R                  X5      nU R                  X%5      n UR	                  U5      U l        UR                  S:”  a  U R                  b  SU l        [        U R                  5      $ ! [
         a3  nU R                  R                  U[        U5      S9n[        U5      eSnAff = f)z{
Paginate a queryset if required, either returning a
page object, or `None` if pagination is not configured for this view.
N)rA   Úmessager    T)r]   Úget_page_sizeÚdjango_paginator_classÚget_page_numberrˆ   r   Úinvalid_page_messageÚformatÚstrr   Ú	num_pagesÚtemplaterƒ   r*   )	r[   r\   r]   r^   Ú	page_sizeÚ	paginatorrA   ÚexcÚmsgs	            r   r_   Ú&PageNumberPagination.paginate_querysetÅ   sÅ   € ð
 ŒØ×&Ñ& wÓ/ˆ	ÞØà×/Ñ/°ÓDˆ	Ø×*Ñ*¨7Ó>ˆð	 Ø!Ÿ™ {Ó3ˆDŒIð ×Ñ Ó" t§}¡}Ñ'@à)-ˆDÔ&ä�D—I‘I‹Ðøô ó 	 Ø×+Ñ+×2Ñ2Ø'´°S³ð 3ð ˆCô ˜3“-Ðûð		 ús   ÁB Â
CÂ.C
Ã
Cc                 ó˜   • UR                   R                  U R                  5      =(       d    SnX0R                  ;   a  UR                  nU$ ©Nr    )Úquery_paramsÚgetÚpage_query_paramÚlast_page_stringsr”   )r[   r]   r—   rA   s       r   r�   Ú$PageNumberPagination.get_page_numberà   s@   € Ø×*Ñ*×.Ñ.¨t×/DÑ/DÓE×JÈˆØ×0Ñ0Ó0Ø#×-Ñ-ˆKØÐr   c                 ó–   • [        U R                  R                  R                  U R	                  5       U R                  5       US.5      $ ©N©ÚcountÚnextÚpreviousrq   )r   rˆ   r—   r¥   Úget_next_linkÚget_previous_linkrb   s     r   rd   Ú+PageNumberPagination.get_paginated_responseæ   sB   € ÜØ—Y‘Y×(Ñ(×.Ñ.Ø×&Ñ&Ó(Ø×.Ñ.Ó0Øñ	
ó ð 	r   c                 ó’   • SSS/SSS.SSS	S
R                  U R                  S9S.SSS	SR                  U R                  S9S.US.S.$ )NÚobjectr¥   rq   Ú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Ÿ   rh   s     r   rj   Ú2PageNumberPagination.get_paginated_response_schemaî   sŠ   € àØ  )Ð,ð &Ø"ñð
 %Ø $Ø#ØV×]Ñ]Ø)-×)>Ñ)>ð  ^ð  @ñ	ð %Ø $Ø#ØV×]Ñ]Ø)-×)>Ñ)>ð  ^ð  @ñ	ð "ñ'ñ
ð 	
r   c                 ó  • U R                   (       aU  [        R                  " [        [        5         [        UR                  U R                      SU R                  S9sS S S 5        $ U R                  $ ! , (       d  f       U R                  $ = f©NT)r   r   ©	Úpage_size_query_paramÚ
contextlibÚsuppressÚKeyErrorr   r   r�   Úmax_page_sizer–   ©r[   r]   s     r   rŽ   Ú"PageNumberPagination.get_page_size	  ól   € Ø×%×%Ü×$Ò$¤X¬zÕ:Ü$Ø×(Ñ(¨×)CÑ)CÑDØØ×-Ñ-ñ÷ ;Ñ:ð �~‰~Ð÷ ;Ô:ð �~‰~Ðúó   ±,A3Á3
Bc                 óÖ   • U R                   R                  5       (       d  g U R                  R                  5       nU R                   R	                  5       n[        XR                  U5      $ rg   )rˆ   Úhas_nextr]   Úbuild_absolute_uriÚnext_page_numberr   rŸ   ©r[   r7   rA   s      r   r¨   Ú"PageNumberPagination.get_next_link  sO   € Ø�y‰y×!Ñ!×#Ñ#ØØ�l‰l×-Ñ-Ó/ˆØ—i‘i×0Ñ0Ó2ˆÜ" 3×(=Ñ(=¸{ÓKÐKr   c                 ó  • U R                   R                  5       (       d  g U R                  R                  5       nU R                   R	                  5       nUS:X  a  [        XR                  5      $ [        XR                  U5      $ rœ   )rˆ   Úhas_previousr]   rÈ   Úprevious_page_numberr   rŸ   r   rÊ   s      r   r©   Ú&PageNumberPagination.get_previous_link  sh   € Ø�y‰y×%Ñ%×'Ñ'ØØ�l‰l×-Ñ-Ó/ˆØ—i‘i×4Ñ4Ó6ˆØ˜!ÓÜ% c×+@Ñ+@ÓAÐAÜ" 3×(=Ñ(=¸{ÓKÐKr   c                 ó&  ^ ^• T R                   R                  5       mUU 4S jnT R                  R                  nT R                  R                  R
                  n[        X#5      n[        XBU5      nT R                  5       T R                  5       US.$ )Nc                 ój   >• U S:X  a  [        TTR                  5      $ [        TTR                  U 5      $ rœ   )r   rŸ   r   )rA   Úbase_urlr[   s    €€r   Úpage_number_to_urlÚAPageNumberPagination.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_urlr@   )
r]   rÈ   rˆ   r8   r—   r”   r4   rC   r©   r¨   )r[   rÓ   r0   r1   r>   r@   rÒ   s   `     @r   Úget_html_contextÚ%PageNumberPagination.get_html_context#  s   ù€ Ø—<‘<×2Ñ2Ó4ˆö	Yð —)‘)×"Ñ"ˆØ—	‘	×#Ñ#×-Ñ-ˆÜ2°7ÓBˆÜ$ \Ð<NÓOˆ
ð !×2Ñ2Ó4Ø×*Ñ*Ó,Ø$ñ
ð 	
r   c                 ó„   • [         R                  " U R                  5      nU R                  5       nUR	                  U5      $ rg   ©r	   Úget_templater•   rØ   Úrender©r[   r•   Úcontexts      r   rn   ÚPageNumberPagination.to_html7  ó3   € Ü×&Ò& t§}¡}Ó5ˆØ×'Ñ'Ó)ˆØ�‰˜wÓ'Ð'r   c                 óØ  • [         c   S5       e[         b  [        R                  " S[        5        [        c   S5       e[         R
                  " U R                  SS[        R                  " S[        U R                  5      S9S9/nU R                  bV  UR                  [         R
                  " U R                  SS[        R                  " S	[        U R                  5      S9S95        U$ )
Nru   rv   ú9coreschema must be installed to use `get_schema_fields()`FÚqueryÚPage©ÚtitleÚdescription©Únamer·   Úlocationri   ú	Page size)r   rw   rx   r   r   ÚFieldrŸ   ÚIntegerr
   Úpage_query_descriptionr½   r=   Úpage_size_query_description©r[   r^   Úfieldss      r   rz   Ú&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                 óÜ   • U R                   SS[        U R                  5      SS0S./nU R                  b6  UR	                  U R                  SS[        U R
                  5      SS0S.5        U$ ©NFrä   r°   r­   ©rê   r·   Úinrè   ri   )rŸ   r
   rï   r½   r=   rð   ©r[   r^   Ú
parameterss      r   r}   Ú4PageNumberPagination.get_schema_operation_parametersZ  s‡   € ð ×-Ñ-Ø!ØÜ(¨×)DÑ)DÓEà˜Iðñð

ˆ
ð ×%Ñ%Ñ1Ø×Ñà ×6Ñ6Ø %Ø!Ü#,¨T×-MÑ-MÓ#Nà 	ðñô
ð Ðr   )rƒ   rˆ   r]   rg   )r   r€   r�   r‚   Ú__doc__r   Ú	PAGE_SIZEr–   ÚDjangoPaginatorr�   rŸ   Ú_rï   r½   rð   rÁ   r    r•   r‘   r_   r�   rd   rj   rŽ   r¨   r©   rØ   rn   rz   r}   r„   r!   r   r   r†   r†   ¤   s˜   † ñð ×&Ñ&€Ià,Ðð ÐÙÐOÓPÐð !ÐÙ"#Ð$KÓ"LÐð €Mà!Ðà7€Há˜_Ó-Ðôò6òò
ò6òLòLò
ò((ò
õ<r   r†   c                   ó¬   • \ rS rSrSr\R                  rSr\	" S5      r
Sr\	" S5      rSrSrSS	 jrS
 rS rS rS rS rS rS rS rS rS rS rSrg)ÚLimitOffsetPaginationiu  zŒ
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                 ó¾  • X l         U R                  U5      U l        U R                  c  g U R                  U5      U l        U R                  U5      U l        U R                  U R                  :”  a  U R                  b  SU l        U R                  S:X  d  U R                  U R                  :”  a  / $ [        XR                  U R                  U R                  -    5      $ )NTr   )
r]   Ú	get_limitr  Ú	get_countr¥   Ú
get_offsetrQ   r•   rƒ   r*   rZ   s       r   r_   Ú'LimitOffsetPagination.paginate_queryset„  s¥   € ØŒØ—^‘^ GÓ,ˆŒ
Ø�:‰:ÑØà—^‘^ HÓ-ˆŒ
Ø—o‘o gÓ.ˆŒØ�:‰:˜Ÿ
™
Ó" t§}¡}Ñ'@Ø)-ˆDÔ&à�:‰:˜‹?˜dŸk™k¨D¯J©JÓ6ØˆIÜ�HŸ[™[¨¯©°t·z±zÑ)AÐBÓCÐCr   c                 ón   • [        U R                  U R                  5       U R                  5       US.5      $ r£   )r   r¥   r¨   r©   rb   s     r   rd   Ú,LimitOffsetPagination.get_paginated_response“  s6   € ÜØ—Z‘ZØ×&Ñ&Ó(Ø×.Ñ.Ó0Øñ	
ó ð 	r   c                 ó¾   • SSS/SSS.SSS	S
R                  U R                  U R                  S9S.SSS	SR                  U R                  U R                  S9S.US.S.$ )Nr¬   r¥   rq   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_paramrh   s     r   rj   Ú3LimitOffsetPagination.get_paginated_response_schema›  sš   € àØ  )Ð,ð &Ø"ñð
 %Ø $Ø#Øf×mÑmØ%)×%<Ñ%<È$×J`ÑJ`ð  nð  bñ	ð %Ø $Ø#Øf×mÑmØ%)×%<Ñ%<È$×J`ÑJ`ð  nð  bñ	ð "ñ'ñ
ð 	
r   c                 ó  • U R                   (       aU  [        R                  " [        [        5         [        UR                  U R                      SU R                  S9sS S S 5        $ U R                  $ ! , (       d  f       U R                  $ = fr»   )	r  r¾   r¿   rÀ   r   r   r�   Ú	max_limitÚdefault_limitrÂ   s     r   r  ÚLimitOffsetPagination.get_limit¶  sn   € Ø×!×!Ü×$Ò$¤X¬zÕ:Ü$Ø×(Ñ(¨×)?Ñ)?Ñ@ØØŸ>™>ñ÷ ;Ñ:ð ×!Ñ!Ð!÷ ;Ô:ð ×!Ñ!Ð!úrÅ   c                 ót   •  [        UR                  U R                     5      $ ! [        [        4 a     gf = f©Nr   )r   r�   r  rÀ   r   rÂ   s     r   r  Ú LimitOffsetPagination.get_offsetÀ  sA   € ð	Ü Ø×$Ñ$ T×%<Ñ%<Ñ=óð øô œ*Ð%ó 	Ùð	ús   ‚!$ ¤7¶7c                 ó$  • U R                   U R                  -   U R                  :¼  a  g U R                  R	                  5       n[        XR                  U R                  5      nU R                   U R                  -   n[        XR                  U5      $ rg   )rQ   r  r¥   r]   rÈ   r   r  r  ©r[   r7   rQ   s      r   r¨   Ú#LimitOffsetPagination.get_next_linkÈ  sk   € Ø�;‰;˜Ÿ™Ñ# t§z¡zÓ1Øà�l‰l×-Ñ-Ó/ˆÜ! #×'=Ñ'=¸t¿z¹zÓJˆà—‘˜tŸz™zÑ)ˆÜ" 3×(?Ñ(?ÀÓHÐHr   c                 óZ  • U R                   S::  a  g U R                  R                  5       n[        XR                  U R
                  5      nU R                   U R
                  -
  S::  a  [        XR                  5      $ U R                   U R
                  -
  n[        XR                  U5      $ r  )rQ   r]   rÈ   r   r  r  r   r  r  s      r   r©   Ú'LimitOffsetPagination.get_previous_linkÒ  s„   € Ø�;‰;˜!ÓØà�l‰l×-Ñ-Ó/ˆÜ! #×'=Ñ'=¸t¿z¹zÓJˆà�;‰;˜Ÿ™Ñ# qÓ(Ü% c×+BÑ+BÓCÐCà—‘˜tŸz™zÑ)ˆÜ" 3×(?Ñ(?ÀÓHÐHr   c                 óø  ^ ^^• T R                   R                  5       mT R                  (       a~  [        T R                  T R                  5      S-   m[        T R
                  T R                  -
  T R                  5      [        T R                  T R                  5      -   n[        US5      nOSmSnTU:”  a  UmUUU 4S jn[        TU5      n[        UTU5      nT R                  5       T R                  5       US.$ )Nr    c                 ó¨   >• U S:X  a  [        TTR                  5      $ TR                  U T-
  TR                  -  -   n[	        TTR                  U5      $ rœ   )r   r  rQ   r  r   )rA   rQ   rÒ   r0   r[   s     €€€r   rÓ   ÚBLimitOffsetPagination.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¥   Úmaxr4   rC   r©   r¨   )r[   r1   rÓ   r>   r@   rÒ   r0   s   `    @@r   rØ   Ú&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                 ó„   • [         R                  " U R                  5      nU R                  5       nUR	                  U5      $ rg   rÛ   rÞ   s      r   rn   ÚLimitOffsetPagination.to_html  rá   r   c                 óf   •  UR                  5       $ ! [        [        4 a    [        U5      s $ f = f)zJ
Determine an object count, supporting either querysets or regular lists.
)r¥   ÚAttributeErrorÚ	TypeErrorr/   )r[   r\   s     r   r  ÚLimitOffsetPagination.get_count  s2   € ð	!Ø—>‘>Ó#Ð#øÜ¤	Ð*ó 	!Ü�x“=Ò ð	!ús   ‚ ’0¯0c                 óš  • [         c   S5       e[         b  [        R                  " S[        5        [        c   S5       e[         R
                  " U R                  SS[        R                  " S[        U R                  5      S9S9[         R
                  " U R                  SS[        R                  " S	[        U R                  5      S9S9/$ )
Nru   rv   rã   Frä   ÚLimitræ   ré   ÚOffset)r   rw   rx   r   r   rí   r  rî   r
   Úlimit_query_descriptionr  Úoffset_query_descriptionry   s     r   rz   Ú'LimitOffsetPagination.get_schema_fields  s¼   € ÜÑ"Ð\Ð$\Ó\Ð"ÜÑÜ�MŠMÐ_ÔawÔxÜÑ%ÐbÐ'bÓbÐ%ä�MŠMØ×+Ñ+ØØ Ü!×)Ò)Ø!Ü )¨$×*FÑ*FÓ Gññ	ô �MŠMØ×,Ñ,ØØ Ü!×)Ò)Ø"Ü )¨$×*GÑ*GÓ Hññ	ð
ð 	
r   c                 ó¢   • U R                   SS[        U R                  5      SS0S.U R                  SS[        U R                  5      SS0S./nU$ rõ   )r  r
   r)  r  r*  rø   s      r   r}   Ú5LimitOffsetPagination.get_schema_operation_parameters/  sm   € ð ×.Ñ.Ø!ØÜ(¨×)EÑ)EÓFà˜Iðñð ×/Ñ/Ø!ØÜ(¨×)FÑ)FÓGà˜Iðñð
ˆ
ð( Ðr   )r¥   rƒ   r  rQ   r]   rg   )r   r€   r�   r‚   rû   r   rü   r  r  rþ   r)  r  r*  r  r•   r_   rd   rj   r  r  r¨   r©   rØ   rn   r  rz   r}   r„   r!   r   r   r   r   u  s‚   † ñð !×*Ñ*€MØÐÙÐ GÓHÐØ!ÐÙ Ð!VÓWÐØ€IØ7€HôDòò
ò6"òòIòIò&
òP(ò
!ò
õ4r   r   c                   óÐ   • \ rS rSrSrSr\" S5      r\R                  r
\" S5      rSrSrSr\" S	5      rSrS
rSS jrS rS rS rS rS rS rS rS rS rS rS rS rS rSr g)ÚCursorPaginationiG  zÀ
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                 óŠ  • X l         U R                  U5      U l        U R                  (       d  g UR                  5       U l        U R                  X!U5      U l        U R                  U5      U l        U R                  c  Su  pEnOU R                  u  pEnU(       a#  UR                  " [        U R                  5      6 nOUR                  " U R                  6 nUbl  U R                  S   nUR                  S5      nUR                  S5      n	U R                  R                  U:w  a  U	S-   U0n
OU	S-   U0n
UR                  " S
0 U
D6n[        XX@R                  -   S-    5      n[        US U R                   5      U l        [#        U5      [#        U R                   5      :”  a"  SnU R%                  US   U R                  5      nOS	nS nU(       am  [        ['        U R                   5      5      U l        US L=(       d    US:„  U l        XÀl        U R(                  (       a  X`l        U R*                  (       a  XÐl        OIXÀl        US L=(       d    US:„  U l        U R(                  (       a  XÐl        U R*                  (       a  X`l        U R*                  (       d  U R(                  (       a  U R0                  b  SU l        U R                   $ )N)r   FNr   rF   Ú__ltÚ__gtr    TéÿÿÿÿFr!   )r]   rŽ   r–   rÈ   rÒ   Úget_orderingÚorderingÚdecode_cursorr0  Úorder_byrN   rG   ÚlstriprR   Úfilterr*   rˆ   r/   Ú_get_position_from_instanceÚreversedrÇ   rÍ   Únext_positionÚprevious_positionr•   rƒ   )r[   r\   r]   r^   rQ   rR   Úcurrent_positionÚorderÚis_reversedÚ
order_attrÚkwargsrq   Úhas_following_positionÚfollowing_positions                 r   r_   Ú"CursorPagination.paginate_querysetc  sY  € ØŒØ×+Ñ+¨GÓ4ˆŒØ�~�~Øà×2Ñ2Ó4ˆŒØ×)Ñ)¨'¸TÓBˆŒà×(Ñ(¨Ó1ˆŒØ�;‰;ÑØ2BÑ/ˆVÑ.à26·+±+Ñ/ˆVÐ.ö Ø×(Ò(Ô*;¸D¿M¹MÓ*JÐK‰Hà×(Ò(¨$¯-©-Ð8ˆHð Ñ'Ø—M‘M !Ñ$ˆEØ×*Ñ*¨3Ó/ˆKØŸ™ cÓ*ˆJð �{‰{×"Ñ" kÓ1Ø$ vÑ-Ð/?Ð@‘à$ vÑ-Ð/?Ð@�à—’Ñ0¨Ñ0ˆ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ÔØ�}�}Ø%5Ô"Ø× × Ø);Ô&øð 3ŒMØ!1¸Ð!=× NÀ6ÈAÁ:ˆDÔØ�}�}Ø%7Ô"Ø× × Ø)9Ô&ð ×× §§°D·M±MÑ4MØ)-ˆDÔ&à�y‰yÐr   c                 ó  • U R                   (       aU  [        R                  " [        [        5         [        UR                  U R                      SU R                  S9sS S S 5        $ U R                  $ ! , (       d  f       U R                  $ = fr»   r¼   rÂ   s     r   rŽ   ÚCursorPagination.get_page_size°  rÄ   rÅ   c                 ój  • U R                   (       d  g U R                  (       ap  U R                  (       a_  U R                  R                  (       aD  U R                  R                  S:w  a*  U R                  U R                  S   U R                  5      nOU R                  nSnSn[        U R                  5       H.  nU R                  X@R                  5      nXQ:w  a  Sn  OUnUS-  nM0     U R                  (       a€  U(       dy  U R                  (       d  U R                  nS nOYU R                  R                  (       a  SnU R                  nO/U R                  R                  U R                  -   nU R                  nU R                  (       d  U R                  n[        USWS9nU R                  U5      $ )Nr   r4  FTr    rP   )rÇ   rˆ   r0  rR   rQ   r;  r6  r=  r<  rÍ   r–   r>  rO   Úencode_cursor©r[   ÚcomparerQ   Úhas_item_with_unique_positionrM   rS   r0  s          r   r¨   ÚCursorPagination.get_next_linkº  sO  € Ø�}�}Øà�9�9˜ŸŸ¨¯©×)<×)<ÀÇÁ×ASÑASÐWXÓAXð ×6Ñ6°t·y±yÀ±}ÀdÇmÁmÓT‰Gà×(Ñ(ˆGØˆà(-Ð%Ü˜TŸY™YÖ'ˆDØ×7Ñ7¸¿m¹mÓLˆHØÓ"ð 15Ð-Ùð
 ˆGØ�a‰KŠFñ (ð �9�9Ö:à×$×$ð Ÿ™�Ø‘Ø—‘×$×$ð �Ø×1Ñ1‘ð Ÿ™×+Ñ+¨d¯n©nÑ<�Ø×1Ñ1�à�y�yØ×)Ñ)ˆHä˜v¨u¸xÑHˆØ×!Ñ! &Ó)Ð)r   c                 óX  • U R                   (       d  g U R                  (       ap  U R                  (       a_  U R                  R                  (       dD  U R                  R                  S:w  a*  U R                  U R                  S   U R                  5      nOU R                  nSnSnU R                   H.  nU R                  X@R                  5      nXQ:w  a  Sn  OUnUS-  nM0     U R                  (       a€  U(       dy  U R                  (       d  U R                  nS nOYU R                  R                  (       a0  U R                  R                  U R                  -   nU R                  nOSnU R                  nU R                  (       d  U R                  n[        USWS9nU R                  U5      $ )Nr   FTr    rP   )rÍ   rˆ   r0  rR   rQ   r;  r6  r>  rÇ   r–   r=  rO   rJ  rK  s          r   r©   Ú"CursorPagination.get_previous_linkï  sJ  € Ø× × Øà�9�9˜ŸŸ¨T¯[©[×-@×-@ÀTÇ[Á[×EWÑEWÐ[\ÓE\ð ×6Ñ6°t·y±yÀ±|ÀTÇ]Á]ÓS‰Gà×,Ñ,ˆGØˆà(-Ð%Ø—I”IˆDØ×7Ñ7¸¿m¹mÓLˆHØÓ"ð 15Ð-Ùð
 ˆGØ�a‰KŠFñ ð �9�9Ö:à—=—=ð Ÿ™�Ø‘Ø—‘×$×$ð Ÿ™×+Ñ+¨d¯n©nÑ<�Ø×-Ñ-‘ð �Ø×-Ñ-�à�y�yØ×-Ñ-ˆHä˜v¨t¸hÑGˆØ×!Ñ! &Ó)Ð)r   c                 óâ  • U R                   n[        US/ 5       Vs/ s H  n[        US5      (       d  M  UPM     nnU(       a'  US   nU" 5       nUR                  XU5      nU(       a  UnUc   S5       eSU;  d   S5       e[	        U[
        [        [        45      (       d'   SR                  [        U5      R                  S95       e[	        U[
        5      (       a  U4$ [        U5      $ s  snf )	zF
Return a tuple of strings, that may be used in an `order_by` method.
Úfilter_backendsr5  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°   )r6  ÚgetattrÚhasattrr5  Ú
isinstancer“   r*   rK   r’   r°   r   )	r[   r]   r\   r^   r6  Ú
filter_clsÚordering_filtersÚfilter_instanceÚordering_from_filters	            r   r5  ÚCursorPagination.get_ordering$  s  € ð —=‘=ˆô *1°Ð7HÈ"Ô)Mó
Ú)M˜:Ü�z >×2÷ Ñ)Mð 	ð 
ö
 ð *¨!Ñ,ˆJÙ(›lˆOØ#2×#?Ñ#?ÀÐSWÓ#XÐ Þ#Ø/�àÑ#ð 	
ð'ó	
Ð#ð ˜8Ó#ð 	
ðLó	
Ð#ô ˜(¤S¬$´Ð$6×7Ñ7ð 	
ØH×OÑOÜ˜(“^×,Ñ,ð Pð ó	
Ð7ô �h¤×$Ñ$Ø�;ÐÜ�X‹ÐùòA
s
   œC,µC,c                 ó
  • UR                   R                  U R                  5      nUc  g [        UR	                  S5      5      R                  S5      n[        R                  " USS9nUR                  SS/5      S   n[        XPR                  S9nUR                  S	S/5      S   n[        [        U5      5      nUR                  S
S/5      S   n[!        XVUS9$ ! [        [        4 a    [        U R                  5      ef = f)z<
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   )r[   r]   ÚencodedÚquerystringÚtokensrQ   rR   rS   s           r   r7  ÚCursorPagination.decode_cursorN  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¸xÑHÐHøô œ:Ð&ó 	8Ü˜4×6Ñ6Ó7Ð7ð	8ús   «B'C Ã&Dc                 óx  • 0 nUR                   S:w  a  [        UR                   5      US'   UR                  (       a  SUS'   UR                  b  UR                  US'   [        R
                  " USS9n[        UR                  S5      5      R                  S5      n[        U R                  U R                  U5      $ )	z=
Given a Cursor instance, return an url with encoded cursor.
r   r_  Ú1ra  rb  T)Údoseqr]  )rQ   r“   rR   rS   r   Ú	urlencoder   rd  re  r   rÒ   rc  )r[   r0  rl  rk  rj  s        r   rJ  ÚCursorPagination.encode_cursorg  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                 óŠ   • US   R                  S5      n[        U[        5      (       a  X   nO[        X5      n[	        U5      $ )Nr   rF   )r9  rV  ÚdictrT  r“   )r[   Úinstancer6  Ú
field_nameÚattrs        r   r;  Ú,CursorPagination._get_position_from_instancew  s?   € Ø˜a‘[×'Ñ'¨Ó,ˆ
Ü�h¤×%Ñ%ØÑ'‰Dä˜8Ó0ˆDÜ�4‹yÐr   c                 óX   • [        U R                  5       U R                  5       US.5      $ )N©r¦   r§   rq   )r   r¨   r©   rb   s     r   rd   Ú'CursorPagination.get_paginated_response  s/   € ÜØ×&Ñ&Ó(Ø×.Ñ.Ó0Øñ
ó ð 	r   c           
      óˆ   • SS/SSSSR                  U R                  S9S.SSSS	R                  U R                  S9S.US
.S.$ )Nr¬   rq   r²   Tr³   zAhttp://api.example.org/accounts/?{cursor_query_param}=cD00ODY%3D")rc  r´   zBhttp://api.example.org/accounts/?{cursor_query_param}=cj0xJnA9NDg3rz  r¶   )r’   rc  rh   s     r   rj   Ú.CursorPagination.get_paginated_response_schema†  sz   € àØ"˜ð %Ø $Ø#Øb×iÑiØ+/×+BÑ+Bð  jð  Dñ	ð %Ø $Ø#Øc×jÑjØ+/×+BÑ+Bð  kð  Dñ	ð "ññ
ð 	
r   c                 óD   • U R                  5       U R                  5       S.$ )N)rÖ   r×   )r©   r¨   rm   s    r   rØ   Ú!CursorPagination.get_html_context�  s$   € à ×2Ñ2Ó4Ø×*Ñ*Ó,ñ
ð 	
r   c                 ó„   • [         R                  " U R                  5      nU R                  5       nUR	                  U5      $ rg   rÛ   rÞ   s      r   rn   ÚCursorPagination.to_html£  rá   r   c                 óØ  • [         c   S5       e[         b  [        R                  " S[        5        [        c   S5       e[         R
                  " U R                  SS[        R                  " S[        U R                  5      S9S9/nU R                  bV  UR                  [         R
                  " U R                  SS[        R                  " S	[        U R                  5      S9S95        U$ )
Nru   rv   rã   Frä   rO   ræ   ré   rì   )r   rw   rx   r   r   rí   rc  ÚStringr
   Úcursor_query_descriptionr½   r=   rî   rð   rñ   s      r   rz   Ú"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                 óÜ   • U R                   SS[        U R                  5      SS0S./nU R                  b6  UR	                  U R                  SS[        U R
                  5      SS0S.5        U$ )NFrä   r°   r²   rö   r­   )rc  r
   r„  r½   r=   rð   rø   s      r   r}   Ú0CursorPagination.get_schema_operation_parametersÆ  s‡   € ð ×/Ñ/Ø!ØÜ(¨×)FÑ)FÓGà˜Hðñð

ˆ
ð ×%Ñ%Ñ1Ø×Ñà ×6Ñ6Ø %Ø!Ü#,¨T×-MÑ-MÓ#Nà 	ðñô
ð Ðr   )rÒ   r0  rƒ   rÇ   rÍ   r=  r6  rˆ   r–   r>  r]   rg   )!r   r€   r�   r‚   rû   rc  rþ   r„  r   rü   r–   ri  r6  r•   r½   rð   rÁ   rg  r_   rŽ   r¨   r©   r5  r7  rJ  r;  rd   rj   rØ   rn   rz   r}   r„   r!   r   r   r/  r/  G  s«   † ñð
 "ÐÙ Ð!?Ó@ÐØ×&Ñ&€IÙÐ/Ó0ÐØ€HØA€Hð !ÐÙ"#Ð$KÓ"LÐð €Mð €MôKòZò3*òj3*òj(òTIò2Tò òò
ò.
ò(ò
õ<r   r/  )FN)/rû   r¾   rw   Ú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$   r4   rC   rN   rO   r<   r;   rU   r†   r   r/  r!   r   r   Ú<module>r•     s¸   ðñó
 Û ß 'Ý "Ý å -Ý >Ý "Ý +Ý 6å 1ß 5Ý .Ý ,Ý 0ß Mô	òò0òfò(<ñ 
�HÒ?Ó	@€Ù�jÒ"LÓM€á˜$ t°uÀtÑL€
÷ñ ô8N˜>ô NôbO˜Nô OôdW�~õ Wr   