
    hc6                     2   S r SSKrSSKJr  SSKJr  SSKJr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Q5      r\" S/ SQ5      rS rS r " S S5      r " S S\5      r " S S\R<                  5      r " S S\5      r g)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    U R                  SS5      R                  SS5      $ )zC
Double brackets in regex of url_path for escape string formatting
{z{{}z}})replace)url_paths    H/var/www/html/env/lib/python3.13/site-packages/rest_framework/routers.pyescape_curly_bracketsr   "   s$     C&..sD99    c                 (    [         R                  " U 6 $ )zP
Takes an iterable of iterables, returns a single iterable containing all items
)	itertoolschain)list_of_listss    r   flattenr$   )   s     ??M**r   c                   F    \ rS rSrS rS
S jrS rS rS r\	S 5       r
S	rg)
BaseRouter0   c                     / U l         g N)registryselfs    r   __init__BaseRouter.__init__1   s	    r   Nc                     Uc  U R                  U5      nU R                  U5      (       a  SU SU S3n[        U5      eU R                  R	                  XU45        [        U S5      (       a  U ?g g )NzRouter with basename "zG" is already registered. Please provide a unique basename for viewset ""_urls)get_default_basenameis_already_registeredr   r*   appendhasattrr1   )r,   prefixviewsetbasenamemsgs        r   registerBaseRouter.register4   s    009H%%h//+H: 6DDK9AOC&s++fx89 4!!
 "r   c                 B   ^ [        U4S jU R                   5       5      $ )z+
Check if `basename` is already registered
c              3   2   >#    U  H  u  po3T:H  v   M     g 7fr)    ).0_prefix_viewsetr8   new_basenames       r   	<genexpr>3BaseRouter.is_already_registered.<locals>.<genexpr>G   s     ]}0K8|+}s   )anyr*   )r,   rB   s    `r   r3    BaseRouter.is_already_registeredC   s     ]t}}]]]r   c                     [        S5      e)Y
If `basename` is not specified, attempt to automatically determine
it from the viewset.
z'get_default_basename must be overriddenNotImplementedError)r,   r7   s     r   r2   BaseRouter.get_default_basenameI   s    
 ""KLLr   c                     [        S5      e)z?
Return a list of URL patterns, given the registered viewsets.
zget_urls must be overriddenrI   r+   s    r   get_urlsBaseRouter.get_urlsP   s     ""?@@r   c                 f    [        U S5      (       d  U R                  5       U l        U R                  $ )Nr1   )r5   rM   r1   r+   s    r   urlsBaseRouter.urlsV   s&    tW%%DJzzr   )r1   r*   r)   )__name__
__module____qualname____firstlineno__r-   r:   r3   r2   rM   propertyrP   __static_attributes__r>   r   r   r&   r&   0   s2    ^MA  r   r&   c            
          ^  \ rS rSr\" SSSS.SSSS	0S
9\" SSS0 S9\" SSSSSS.SSSS0S
9\" SSS0 S9/rS U 4S jjrS rS r	S r
S rS!S jrS rSrU =r$ )"SimpleRouter]   z^{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)r]   putpatchdeletez{basename}-detailTInstancez.^{prefix}/{lookup}/{url_path}{trailing_slash}$c                   > U(       a  SOSU l         X l        U(       a  SU l        SU l        [        U l        OzSU l        SU l        [        U l        / nU R                   HI  nUR                  nUS   S:X  a  US	S  nUS
   S:X  a  US S
 nUR                  UR                  US95        MK     X0l        [        TU ]1  5         g )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   r4   _replacesuperr-   )r,   rq   use_regex_path_routesroute	url_param	__class__s         r   r-   SimpleRouter.__init__   s    %3c(!XD*2D'$DN!UD*/D'!DNG!II	Q<3& )!"IR=C' )#2Iu~~)~<= % "Kr   c                     [        USS5      nUc   S5       eUR                  R                  R                  R	                  5       $ )rH   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,   r7   r   s      r   r2   !SimpleRouter.get_default_basename   sK    
 7J5# 	8 &8 	8# ~~##//5577r   c                    [        [        U R                   Vs/ s H4  n[        U[        5      (       d  M  UR
                  R                  5       PM6     sn5      5      nUR                  5       nU Vs/ s H!  nUR                  U;   d  M  UR                  PM#     nnU(       a  Sn[        USR                  U5      -  5      eU Vs/ s H  oUR                  (       d  M  UPM     nnU Vs/ s H  oUR                  (       a  M  UPM     n	n/ n
U R                   H  n[        U[        5      (       a6  UR                  (       a%  X Vs/ s H  oPR                  X%5      PM     sn-  n
MN  [        U[        5      (       a6  UR                  (       d%  X Vs/ s H  oPR                  X%5      PM     sn-  n
M  U
R                  U5        M     U
$ s  snf s  snf s  snf s  snf s  snf s  snf )zg
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, )r[   r$   rv   
isinstancer   r   valuesget_extra_actionsrR   r   joinr   r   _get_dynamic_router4   )r,   r7   r{   known_actionsextra_actionsactionnot_allowedr9   detail_actionslist_actionsrv   s              r   
get_routesSimpleRouter.get_routes   s    W$++%r+YcdikpYq&<emm&:&:&<+%rst113 +8
*7-/ FOO- 	 
 >C&sTYY{-C'CDD 0=N}V&}N-:P]6--]P[[E%..5<<P^_P^f225AP^__E<00P\]P\f225AP\]]e$ ! 5 &s
 OP
 `]s:   G	G	3GGGG+GGGG"c                 T   UR                   R                  5       nUR                  UR                  5        [	        UR
                  5      n[        UR                  R                  SU5      UR                  UR                  R                  SUR                  5      UR                  US9$ )Nz
{url_path}z
{url_name}r   )r   copyrb   kwargsr   r   r   r   r   r   r   url_namer   )r,   r{   r   r   r   s        r   r   SimpleRouter._get_dynamic_route   s    %%**,
&--((9		!!,9NN##L&//B<<!
 	
r   c                 h    0 nUR                  5        H  u  pE[        X5      (       d  M  XSU'   M     U$ )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.
)itemsr5   )r,   r7   
method_mapbound_methodsmethodr   s         r   get_method_mapSimpleRouter.get_method_map   s9     (..0NFw''(.f% 1 r   c                     [        USS5      n[        USS5      =(       d    UnSnU R                  (       d  [        USS5      nUc  [        USU R                  5      nU R                  R	                  UUUS9$ )aI  
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)r   rr   rt   rs   format)r,   r7   r   r   r   r   s         r   get_lookup_regexSimpleRouter.get_lookup_regex   s     w="7,>EU"7,DdKL"7,@$B]B]^L!!(('-% ) 
 	
r   c           
         / nU R                    GH:  u  p#nU R                  U5      nU R                  U5      nU GH
  nU R                  X7R                  5      nU(       d  M(  UR
                  R                  UUU R                  S9n	U(       d3  U R                  [        L a  U	S   S:X  a  U	SS n	OU	SS S:X  a  SU	SS -   n	UR                  R                  5       n
U
R                  UUR                  S	.5        UR                  " U40 U
D6nUR                  R                  US
9nUR!                  U R                  XUS95        GM     GM=     U$ )zA
Use the registered viewsets to generate a list of URL patterns.
)r6   lookuprq   r   rj   rn   N   z^/rm   )r8   r   r8   r   )r*   r   r   r   r   r   r   rq   ru   r   r   r   rb   r   as_viewr   r4   )r,   retr6   r7   r8   r   rv   r{   r   regexr   viewr   s                r   rM   SimpleRouter.get_urls
  sN    )-%FX**73F__W-F --g}}E 		((!!#'#6#6 )  ~~- 8s?$)!"IErd* #eABi"--224
!! (#ll# 
 w=*=zz((((;

4>>%D>ABC  	 *7N 
r   )rs   rt   ru   rr   rv   rq   )TT)rk   )rR   rS   rT   rU   r   r   rv   r-   r2   r   r   r   r   rM   rW   __classcell__r}   s   @r   rY   rY   ]   s     	-  # &)		
 	8(		
 	6!)#	 % *-	
 	A(		
G)FV28"H


8- -r   rY   c                   *    \ rS rSrSrSrSrSrS rSr	g)APIRootViewi:  z/
The default basic root view for DefaultRouter
TNc           
         0 nUR                   R                  nU R                  R                  5        H3  u  pgU(       a  US-   U-   n [	        UUUUUR                  S5      S9XF'   M5     [        U5      $ ! [         a     MO  f = f)N:r   )argsr   requestr   )resolver_match	namespaceapi_root_dictr   r
   r]   r   r	   )r,   r   r   r   r   r   keyr   s           r   r]   APIRootView.getB  s    **44	!//557MC$s?X5
"!#!::h/	 8 }	 " s   A55
BBr>   )
rR   rS   rT   rU   __doc___ignore_model_permissionsschemar   r]   rW   r>   r   r   r   r   :  s     !%FMr   r   c                   ^   ^  \ rS rSrSrSrSrSrSr\	r	\
r\rU 4S jrS
S jrU 4S jrS	rU =r$ )DefaultRouteriX  z
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                    > SU;   a  UR                  S5      U l        O[        [        R                  5      U l        [
        TU ]  " U0 UD6  g )Nroot_renderers)popr   r[   r   DEFAULT_RENDERER_CLASSESrx   r-   )r,   r   r   r}   s      r   r-   DefaultRouter.__init__e  sB    v%"(**-=">D"&|'L'L"MD$)&)r   c                     0 nU R                   S   R                  nU R                   H  u  pEnUR                  US9X$'   M     U R                  R                  US9$ )z
Return a basic root view.
r   r   )r   )rv   r   r*   r   r   r   )r,   api_urlsr   	list_namer6   r7   r8   s          r   get_api_root_viewDefaultRouter.get_api_root_viewl  sa     KKN''	)-%FX$-$4$4h$4$GM! *7 ''m'DDr   c                    > [         TU ]  5       nU R                  (       a4  U R                  US9n[	        SX R
                  S9nUR                  U5        U R                  (       a  [        U5      nU$ )z|
Generate the list of URL patterns, including a default root view
for the API, and appending `.json` style format suffixes.
)r   rk   r   )	rx   rM   include_root_viewr   r   root_view_namer4   include_format_suffixesr   )r,   rP   r   root_urlr}   s       r   rM   DefaultRouter.get_urlsw  sd    
 w!!!))4)8DB+>+>?HKK!'')$/Dr   )r   r)   )rR   rS   rT   rU   r   r   r   r   default_schema_renderersr   r   APISchemaViewr   r-   r   rM   rW   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&   rY   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   