
    h/                     2   d Z ddlZddlmZ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 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)OrderedDict
namedtuple)ImproperlyConfigured)NoReverseMatch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    Y/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/rest_framework/routers.pyescape_curly_bracketsr   "   s$     C&..sD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                   6    e Zd Zd Zd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                  j                  |||f       t        | d      r| `y y N_urls)get_default_basenamer)   appendhasattrr/   )r+   prefixviewsetbasenames       r   registerzBaseRouter.register4   sG    009Hfgx89 4!
 "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+   r4   s     r   r0   zBaseRouter.get_default_basename=   s    
 ""KLLr   c                     t        d      )zO
        Return a list of URL patterns, given the registered viewsets.
        zget_urls must be overriddenr9   r*   s    r   get_urlszBaseRouter.get_urlsD   s     ""?@@r   c                 \    t        | d      s| j                         | _        | j                  S r.   )r2   r<   r/   r*   s    r   urlszBaseRouter.urlsJ   s#    tW%DJzzr   r(   )	__name__
__module____qualname__r,   r6   r0   r<   propertyr>    r   r   r&   r&   0   s,    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)rH   putpatchdeletez{basename}-detailTInstancez.^{prefix}/{lookup}/{url_path}{trailing_slash}$c                 8    |rdnd| _         t        | 	          y )N/ )trailing_slashsuperr,   )r+   rW   	__class__s     r   r,   zSimpleRouter.__init__~   s    %3cr   c                     t        |dd      }|J d       |j                  j                  j                  j	                         S )r8   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+   r4   r[   s      r   r0   z!SimpleRouter.get_default_basename   sK    
 7J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, )rF   r$   routes
isinstancer   r   valuesget_extra_actionsr?   r   joinr   r   _get_dynamic_router1   )r+   r4   routeknown_actionsextra_actionsactionnot_allowedmsgdetail_actionslist_actionsrb   s              r   
get_routeszSimpleRouter.get_routes   s    W$++%rYcdikpYqemm&:&:&<%rst113 +8
 &-/ OO
 
 >C&sTYY{-C'CDD 0=NV&NN-:P6&--PP[[ 	%E%.5<<P^_f4225&A__E<0P\]f4225&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   copyrM   kwargsr   r   r   r   r   r   r   url_namer   )r+   rh   rk   r   r   s        r   rg   zSimpleRouter._get_dynamic_route   s    %%**,
&--((9		!!,9NN##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.
        )itemsr2   )r+   r4   
method_mapbound_methodsmethodrk   s         r   get_method_mapzSimpleRouter.get_method_map   sA     (..0 	/NFFw'(.f%	/ r   c                     d}t        |dd      }t        |dd      xs |}t        |dd      }|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
        z5(?P<{lookup_prefix}{lookup_url_kwarg}>{lookup_value})lookup_fieldpklookup_url_kwargNlookup_value_regexz[^/.]+)lookup_prefixr~   lookup_value)r\   format)r+   r4   r   
base_regexr|   r~   r   s          r   get_lookup_regexzSimpleRouter.get_lookup_regex   s_     M
 w="7,>EUw(<hG  '-% ! 
 	
r   c           	      D   g }| j                   D ]  \  }}}| j                  |      }| j                  |      }|D ]  }| j                  ||j                        }|s"|j
                  j                  ||| j                        }	|s|	dd dk(  rd|	dd z   }	|j                  j                         }
|
j                  ||j                  d        |j                  |fi |
}|j                  j                  |      }|j                  t        |	||               |S )	zQ
        Use the registered viewsets to generate a list of URL patterns.
        )r3   lookuprW   N   z^/^)r5   r   r5   r   )r)   r   rp   rz   r   r   r   rW   r   rr   rM   r   as_viewr   r1   r   )r+   retr3   r4   r5   r   rb   rh   r   regexr   viewr   s                r   r<   zSimpleRouter.get_urls   s5    )- !	<%FGX**73F__W-F < --gu}}E 		((!!#'#6#6 )  %)t"3%)OE"--224
!! (#ll# 
 'ww=*=zz((((;

75$T:;;<	!	<F 
r   )T)rV   )r?   r@   rA   r   r   rb   r,   r0   rp   rg   rz   r   r<   __classcell__rY   s   @r   rE   rE   Q   s     	-  # &)		
 	8(		
 	6!)#	 % *-	
 	A(		
G)FV8"H


.)r   rE   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                    t               }|j                  j                  }| j                  j	                         D ]3  \  }}|r|dz   |z   }	 t        |||||j                  dd             ||<   5 t        |      S # t        $ r Y Lw xY w)N:r   )argsrs   requestr   )	r   resolver_match	namespaceapi_root_dictrv   r
   rH   r   r	   )r+   r   r   rs   r   r   keyrt   s           r   rH   zAPIRootView.get  s    m**44	!//557 	MC$s?X5
"!#!::h5C		 }	 " s   #A<<	BB)r?   r@   rA   __doc___ignore_model_permissionsschemar   rH   rC   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   rF   r   DEFAULT_RENDERER_CLASSESrX   r,   )r+   r   rs   rY   s      r   r,   zDefaultRouter.__init__;  sB    v%"(**-=">D"&|'L'L"MD$)&)r   c                     t               }| j                  d   j                  }| j                  D ]  \  }}}|j	                  |      ||<    | j
                  j                  |      S )z+
        Return a basic root view.
        r   r   )r   )r   rb   r   r)   r   r   r   )r+   api_urlsr   	list_namer3   r4   r5   s          r   get_api_root_viewzDefaultRouter.get_api_root_viewB  sn     $KKN''	)- 	H%FGX$-$4$4h$4$GM&!	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   z^$r   )	rX   r<   include_root_viewr   r   root_view_namer1   include_format_suffixesr   )r+   r>   r   root_urlrY   s       r   r<   zDefaultRouter.get_urlsM  sf    
 w!!!))4)8Dud1D1DEHKK!'')$/Dr   r(   )r?   r@   rA   r   r   r   r   default_schema_renderersr   r   APISchemaViewr   r,   r   r<   r   r   s   @r   r   r   .  sE     "N#KM%O*	E r   r   )!r   r!   collectionsr   r   django.core.exceptionsr   django.urlsr   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&   rE   APIViewr   r   rC   r   r   <module>r      s     / 7 /   , * 2 3 0 =7NO.*QR:+ B|: |~%-- <.L .r   