Ë
    ûûàgc6  ã                   ó2  — d Z ddlZddlmZ ddlmZ ddlmZ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  edg d¢«      Z edg d¢«      Zd„ Zd„ Z G d„ d«      Z G d„ de«      Z G d„ dej<                  «      Z G d„ de«      Z y)aÜ  
Routers provide a convenient and consistent way of automatically
determining the URL conf for your API.

They are used by simply instantiating a Router class, and then registering
all the required ViewSets with that router.

For example, you might have a `urls.py` that looks something like this:

    router = routers.DefaultRouter()
    router.register('users', UserViewSet, 'user')
    router.register('accounts', AccountViewSet, 'account')

    urlpatterns = router.urls
é    N)Ú
namedtuple)ÚImproperlyConfigured)ÚNoReverseMatchÚpathÚre_path)Úviews)ÚResponse)Úreverse)ÚSchemaGenerator)Ú
SchemaView)Úapi_settings)Úformat_suffix_patternsÚRoute©ÚurlÚmappingÚnameÚdetailÚ
initkwargsÚDynamicRoute©r   r   r   r   c                 óF   — | j                  dd«      j                  dd«      S )zK
    Double brackets in regex of url_path for escape string formatting
    ú{z{{ú}z}})Úreplace)Úurl_paths    úT/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/rest_framework/routers.pyÚescape_curly_bracketsr   "   s$   € ð ×Ñ˜C Ó&×.Ñ.¨s°DÓ9Ð9ó    c                 ó&   — t        j                  | Ž S )zX
    Takes an iterable of iterables, returns a single iterable containing all items
    )Ú	itertoolsÚchain)Úlist_of_listss    r   Úflattenr$   )   s   € ô �?‰?˜MÐ*Ð*r   c                   ó<   — e Zd Zd„ Zdd„Zd„ Zd„ Zd„ Zed„ «       Z	y)	Ú
BaseRouterc                 ó   — g | _         y ©N)Úregistry©Úselfs    r   Ú__init__zBaseRouter.__init__1   s	   € Øˆ�r   Nc                 óÎ   — |€| j                  |«      }| j                  |«      rd|› d|› d�}t        |«      ‚| j                  j	                  |||f«       t        | d«      r| `y y )NzRouter with basename "zG" is already registered. Please provide a unique basename for viewset "ú"Ú_urls)Úget_default_basenameÚis_already_registeredr   r)   ÚappendÚhasattrr/   )r+   ÚprefixÚviewsetÚbasenameÚmsgs        r   ÚregisterzBaseRouter.register4   s|   € ØÐØ×0Ñ0°Ó9ˆHà×%Ñ% hÔ/Ø+¨H¨:ð 6DØDKÀ9ÈAðOˆCä& sÓ+Ð+à�‰×Ñ˜f g¨xÐ8Ô9ô �4˜Ô!Ø‘
ð "r   c                 ó@   ‡— t        ˆfd„| j                  D «       «      S )z;
        Check if `basename` is already registered
        c              3   ó0   •K  — | ]  \  }}}|‰k(  –— Œ y ­wr(   © )Ú.0Ú_prefixÚ_viewsetr6   Únew_basenames       €r   ú	<genexpr>z3BaseRouter.is_already_registered.<locals>.<genexpr>G   s   øè ø€ Ò]Ñ0K°¸À8�8˜|Õ+Ñ]ùs   ƒ)Úanyr)   )r+   r?   s    `r   r1   z BaseRouter.is_already_registeredC   s   ø€ ô Ó]ÈtÏ}É}Ô]Ó]Ð]r   c                 ó   — t        d«      ‚)úq
        If `basename` is not specified, attempt to automatically determine
        it from the viewset.
        z'get_default_basename must be overridden©ÚNotImplementedError)r+   r5   s     r   r0   zBaseRouter.get_default_basenameI   s   € ô
 "Ð"KÓLÐLr   c                 ó   — t        d«      ‚)zO
        Return a list of URL patterns, given the registered viewsets.
        zget_urls must be overriddenrD   r*   s    r   Úget_urlszBaseRouter.get_urlsP   s   € ô "Ð"?Ó@Ð@r   c                 ó\   — t        | d«      s| j                  «       | _        | j                  S )Nr/   )r3   rG   r/   r*   s    r   ÚurlszBaseRouter.urlsV   s#   € ä�t˜WÔ%ØŸ™›ˆDŒJØ�z‰zÐr   r(   )
Ú__name__Ú
__module__Ú__qualname__r,   r8   r1   r0   rG   ÚpropertyrI   r;   r   r   r&   r&   0   s2   „ òóò^òMòAð ñó ñr   r&   c            
       ó¾   ‡ — e Zd Z eddddœddddi¬	«       ed
ddi ¬«       eddddddœddddi¬	«       edddi ¬«      gZdˆ fd„	Zd„ Zd„ Zd„ Z	d„ Z
dd„Zd„ Zˆ xZS ) ÚSimpleRouterz^{prefix}{trailing_slash}$ÚlistÚcreate)ÚgetÚpostz{basename}-listFÚsuffixÚListr   z%^{prefix}/{url_path}{trailing_slash}$z{basename}-{url_name}r   z#^{prefix}/{lookup}{trailing_slash}$ÚretrieveÚupdateÚpartial_updateÚdestroy)rR   ÚputÚpatchÚdeletez{basename}-detailTÚInstancez.^{prefix}/{lookup}/{url_path}{trailing_slash}$c                 ór  •— |rdnd| _         || _        |rd| _        d| _        t        | _        nzd| _        d| _        t        | _        g }| j                  D ]I  }|j                  }|d   dk(  r|d	d  }|d
   dk(  r|d d
 }|j                  |j                  |¬«      «       ŒK || _        t        ‰| �1  «        y )Nú/Ú z5(?P<{lookup_prefix}{lookup_url_kwarg}>{lookup_value})z[^/.]+z2<{lookup_value}:{lookup_prefix}{lookup_url_kwarg}>Ústrr   ú^é   éÿÿÿÿú$)r   )Útrailing_slashÚ
_use_regexÚ_base_patternÚ_default_value_patternr   Ú	_url_confr   Úroutesr   r2   Ú_replaceÚsuperr,   )r+   rf   Úuse_regex_pathÚ_routesÚrouteÚ	url_paramÚ	__class__s         €r   r,   zSimpleRouter.__init__Š   sÁ   ø€ Ù%3™c¸ˆÔØ(ˆŒÙØ!XˆDÔØ*2ˆDÔ'Ü$ˆD�Nà!UˆDÔØ*/ˆDÔ'Ü!ˆDŒNàˆGØŸ™ò >�Ø!ŸI™I�	Ø˜Q‘< 3Ò&Ø )¨!¨" �IØ˜R‘= CÒ'Ø )¨#¨2 �Ià—‘˜uŸ~™~°)˜~Ó<Õ=ð>ð "ˆDŒKä‰ÑÕr   c                 óŠ   — t        |dd«      }|€J d«       ‚|j                  j                  j                  j	                  «       S )rC   ÚquerysetNz�`basename` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.)ÚgetattrÚmodelÚ_metaÚobject_nameÚlower)r+   r5   rt   s      r   r0   z!SimpleRouter.get_default_basename£   sK   € ô
 ˜7 J°Ó5ˆàÐ#ð 	8ð &8ó 	8Ð#ð �~‰~×#Ñ#×/Ñ/×5Ñ5Ó7Ð7r   c                 óT  — t        t        | j                  D �cg c]-  }t        |t        «      sŒ|j
                  j                  «       ‘Œ/ c}«      «      }|j                  «       }|D �cg c]  }|j                  |v r|j                  ‘Œ }}|rd}t        |dj                  |«      z  «      ‚|D �cg c]  }|j                  sŒ|‘Œ }}|D �cg c]  }|j                  rŒ|‘Œ }	}g }
| j                  D ]“  }t        |t        «      r0|j                  r$|
|D �cg c]  }| j                  ||«      ‘Œ c}z  }
ŒCt        |t        «      r0|j                  s$|
|	D �cg c]  }| j                  ||«      ‘Œ c}z  }
Œƒ|
j                  |«       Œ• |
S c c}w c c}w c c}w c c}w c c}w c c}w )z
        Augment `self.routes` with any dynamically generated routes.

        Returns a list of the Route namedtuple.
        zZCannot use the @action decorator on the following methods, as they are existing routes: %sz, )rP   r$   rk   Ú
isinstancer   r   ÚvaluesÚget_extra_actionsrJ   r   Újoinr   r   Ú_get_dynamic_router2   )r+   r5   rp   Úknown_actionsÚextra_actionsÚactionÚnot_allowedr7   Údetail_actionsÚlist_actionsrk   s              r   Ú
get_routeszSimpleRouter.get_routes°   s  € ô œWÈ$Ï+É+Ö%rÀÔYcÐdiÔkpÕYq e§m¡m×&:Ñ&:Õ&<Ò%rÓsÓtˆØ×1Ñ1Ó3ˆð +8ö
Ø &Ø�‰ -Ñ/ð �O‹Oð
ˆð 
ñ ð>ˆCä& s¨T¯Y©Y°{Ó-CÑ'CÓDÐDð 0=ÖN VÀÇÃš&ÐNˆÐNØ-:ÖP 6À&Ç-Ã-šÐPˆÐPàˆØ—[‘[ò 	%ˆEÜ˜%¤Ô.°5·<²<ØÐP^Ö_Àf˜4×2Ñ2°5¸&ÕAÒ_Ñ_‘Ü˜E¤<Ô0¸¿ºØÐP\Ö]Àf˜4×2Ñ2°5¸&ÕAÒ]Ñ]‘à—‘˜eÕ$ð	%ð ˆùò5 &sùò
ùò OùÚPùò
 `ùâ]s4   ™F¯FÁ*!FÂ2FÃFÃFÃ FÄF ÅF%c                 óZ  — |j                   j                  «       }|j                  |j                  «       t	        |j
                  «      }t        |j                  j                  d|«      |j                  |j                  j                  d|j                  «      |j                  |¬«      S )Nz
{url_path}z
{url_name}r   )r   ÚcopyrW   Úkwargsr   r   r   r   r   r   r   Úurl_namer   )r+   rp   r‚   r   r   s        r   r   zSimpleRouter._get_dynamic_routeÔ   s€   € Ø×%Ñ%×*Ñ*Ó,ˆ
Ø×Ñ˜&Ÿ-™-Ô(ä(¨¯©Ó9ˆäØ—	‘	×!Ñ! ,°Ó9Ø—N‘NØ—‘×#Ñ# L°&·/±/ÓBØ—<‘<Ø!ô
ð 	
r   c                 ó^   — i }|j                  «       D ]  \  }}t        ||«      sŒ|||<   Œ |S )zÀ
        Given a viewset, and a mapping of http methods to actions,
        return a new mapping which only includes any mappings that
        are actually implemented by the viewset.
        )Úitemsr3   )r+   r5   Ú
method_mapÚbound_methodsÚmethodr‚   s         r   Úget_method_mapzSimpleRouter.get_method_mapâ   sA   € ð ˆØ(×.Ñ.Ó0ò 	/‰NˆF�FÜ�w Õ'Ø(.�˜fÒ%ð	/ð Ðr   c                 óâ   — t        |dd«      }t        |dd«      xs |}d}| j                  st        |dd«      }|€t        |d| j                  «      }| j                  j	                  |||¬«      S )a�  
        Given a viewset, return the portion of URL regex that is used
        to match against a single instance.

        Note that lookup_prefix is not used directly inside REST rest_framework
        itself, but is required in order to nicely support nested router
        implementations, such as drf-nested-routers.

        https://github.com/alanjds/drf-nested-routers
        Úlookup_fieldÚpkÚlookup_url_kwargNÚlookup_value_converterÚlookup_value_regex)Úlookup_prefixr”   Úlookup_value)ru   rg   ri   rh   Úformat)r+   r5   r—   r’   r”   r˜   s         r   Úget_lookup_regexzSimpleRouter.get_lookup_regexî   s„   € ô ˜w¨¸Ó=ˆÜ" 7Ð,>ÀÓEÒUÈÐØˆØ�Šä" 7Ð,DÀdÓKˆLØÐä" 7Ð,@À$×B]ÑB]Ó^ˆLØ×!Ñ!×(Ñ(Ø'Ø-Ø%ð )ó 
ð 	
r   c           	      ó”  — g }| j                   D �]5  \  }}}| j                  |«      }| j                  |«      }|D �]  }| j                  ||j                  «      }|sŒ#|j
                  j                  ||| j                  ¬«      }	|s0| j                  t        u r|	d   dk(  r|	dd }	n|	dd dk(  rd|	dd z   }	|j                  j                  «       }
|
j                  ||j                  d	œ«        |j                  |fi |
¤Ž}|j                  j                  |¬
«      }|j!                  | j                  |	||¬«      «       �Œ	 �Œ8 |S )zQ
        Use the registered viewsets to generate a list of URL patterns.
        )r4   Úlookuprf   r   r_   rc   Né   z^/rb   )r6   r   ©r6   ©r   )r)   rš   r†   r�   r   r   r™   rf   rj   r   r   rˆ   rW   r   Úas_viewr   r2   )r+   Úretr4   r5   r6   rœ   rk   rp   r   Úregexr   Úviewr   s                r   rG   zSimpleRouter.get_urls
  sc  € ð ˆà)-¯©ó %	CÑ%ˆF�G˜XØ×*Ñ*¨7Ó3ˆFØ—_‘_ WÓ-ˆFàó !C�ð ×-Ñ-¨g°u·}±}ÓE�ÙØð Ÿ	™	×(Ñ(Ø!Ø!Ø#'×#6Ñ#6ð )ó �ñ Ø—~‘~¬Ñ-Ø  ™8 sš?Ø$)¨!¨" I™EØ˜r ˜ dÒ*Ø # e¨A¨B i¡˜à"×-Ñ-×2Ñ2Ó4�
Ø×!Ñ!Ø (Ø#Ÿl™lñ#ô ð
 '�w—‘ wÑ=°*Ñ=�Ø—z‘z×(Ñ(°(Ð(Ó;�Ø—
‘
˜4Ÿ>™>¨%°¸D˜>ÓAÖBòC!Cð	%	CðN ˆ
r   )TT)r`   )rJ   rK   rL   r   r   rk   r,   r0   r†   r   r�   rš   rG   Ú__classcell__©rr   s   @r   rO   rO   ]   s²   ø„ ñ 	Ø-àØ ñð #ØØ  &Ð)ô		
ñ 	Ø8Ø(ØØô		
ñ 	Ø6à!ØØ)Ø#ñ	ð %ØØ  *Ð-ô	
ñ 	ØAØ(ØØô		
ðG)€FõVò28ò"òH
ò
ó
ö8-r   rO   c                   ó"   — e Zd ZdZdZdZdZd„ Zy)ÚAPIRootViewz7
    The default basic root view for DefaultRouter
    TNc           
      ó  — i }|j                   j                  }| j                  j                  «       D ]2  \  }}|r|dz   |z   }	 t	        |||||j                  d«      ¬«      ||<   Œ4 t        |«      S # t        $ r Y ŒKw xY w)Nú:r™   )Úargsr‰   Úrequestr™   )Úresolver_matchÚ	namespaceÚapi_root_dictrŒ   r
   rR   r   r	   )r+   r«   rª   r‰   r¡   r­   ÚkeyrŠ   s           r   rR   zAPIRootView.getB  s–   € àˆØ×*Ñ*×4Ñ4ˆ	Ø!×/Ñ/×5Ñ5Ó7ò 	‰MˆC�ÙØ$ s™?¨XÑ5�ð
Ü"ØØØ!Ø#Ø!Ÿ:™: hÓ/ô��C’ð		ô ˜‹}Ðøô	 "ò áðús   Á"A3Á3	A?Á>A?)rJ   rK   rL   Ú__doc__Ú_ignore_model_permissionsÚschemar®   rR   r;   r   r   r§   r§   :  s   „ ñð !%ÐØ€FØ€Mór   r§   c                   óP   ‡ — e Zd ZdZdZdZdZdZeZe	Z
eZˆ fd„Zdd„Zˆ fd„Zˆ xZS )	ÚDefaultRouterz‘
    The default router extends the SimpleRouter, but also adds in a default
    API root view, and adds format suffix patterns to the URLs.
    Tzapi-rootNc                 ó–   •— d|v r|j                  d«      | _        nt        t        j                  «      | _        t        ‰| �  |i |¤Ž y )NÚroot_renderers)Úpopr¶   rP   r   ÚDEFAULT_RENDERER_CLASSESrm   r,   )r+   rª   r‰   rr   s      €r   r,   zDefaultRouter.__init__e  sB   ø€ Ø˜vÑ%Ø"(§*¡*Ð-=Ó">ˆDÕä"&¤|×'LÑ'LÓ"MˆDÔÜ‰Ñ˜$Ð) &Ó)r   c                 óÄ   — i }| j                   d   j                  }| j                  D ]  \  }}}|j                  |¬«      ||<   Œ | j                  j                  |¬«      S )z+
        Return a basic root view.
        r   rž   )r®   )rk   r   r)   r™   r§   r    )r+   Úapi_urlsr®   Ú	list_namer4   r5   r6   s          r   Úget_api_root_viewzDefaultRouter.get_api_root_viewl  sl   € ð ˆØ—K‘K ‘N×'Ñ'ˆ	Ø)-¯©ò 	HÑ%ˆF�G˜XØ$-×$4Ñ$4¸hÐ$4Ó$GˆM˜&Ò!ð	Hð ×Ñ×'Ñ'°mÐ'ÓDÐDr   c                 óà   •— t         ‰| �  «       }| j                  r;| j                  |¬«      }t	        d|| j
                  ¬«      }|j                  |«       | j                  rt        |«      }|S )z”
        Generate the list of URL patterns, including a default root view
        for the API, and appending `.json` style format suffixes.
        )rº   r`   rŸ   )	rm   rG   Úinclude_root_viewr¼   r   Úroot_view_namer2   Úinclude_format_suffixesr   )r+   rI   r£   Úroot_urlrr   s       €r   rG   zDefaultRouter.get_urlsw  sf   ø€ ô
 ‰wÑÓ!ˆà×!Ò!Ø×)Ñ)°4Ð)Ó8ˆDÜ˜B ¨4×+>Ñ+>Ô?ˆHØ�K‰K˜Ô!à×'Ò'Ü)¨$Ó/ˆDàˆr   r(   )rJ   rK   rL   r°   r¾   rÀ   r¿   Údefault_schema_renderersr§   r   ÚAPISchemaViewr   r,   r¼   rG   r¤   r¥   s   @r   r´   r´   X  sE   ø„ ñð ÐØ"ÐØ€NØ#ÐØ€KØ€MØ%€Oô*ó	E÷ð r   r´   )!r°   r!   Úcollectionsr   Údjango.core.exceptionsr   Údjango.urlsr   r   r   Úrest_frameworkr   Úrest_framework.responser	   Úrest_framework.reverser
   Úrest_framework.schemasr   Úrest_framework.schemas.viewsr   Úrest_framework.settingsr   Úrest_framework.urlpatternsr   r   r   r   r$   r&   rO   ÚAPIViewr§   r´   r;   r   r   ú<module>rÏ      sŠ   ðñó Ý "å 7ß 5Ñ 5å  Ý ,Ý *Ý 2Ý 3Ý 0Ý =á�7ÒNÓO€Ù˜.Ò*QÓR€ò:ò+÷*ñ *ôZZ�:ô Zôz�%—-‘-ô ô<.�Lõ .r   