o
     Þhc6  ã                   @   sü   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d„ Zdd„ ZG dd„ dƒZG dd„ deƒZG dd„ dejƒZG dd„ deƒZ dS )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                 C   s   |   dd¡  dd¡S )zK
    Double brackets in regex of url_path for escape string formatting
    Ú{z{{Ú}z}})Úreplace)Úurl_path© r   úV/var/www/html/premium_crap/venv/lib/python3.10/site-packages/rest_framework/routers.pyÚescape_curly_brackets"   s   r   c                 C   s
   t j| Ž S )zX
    Takes an iterable of iterables, returns a single iterable containing all items
    )Ú	itertoolsÚchain)Úlist_of_listsr   r   r   Úflatten)   s   
r!   c                   @   sB   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zedd„ ƒZ	dS )Ú
BaseRouterc                 C   s
   g | _ d S ©N)Úregistry©Úselfr   r   r   Ú__init__1   s   
zBaseRouter.__init__Nc                 C   s^   |d u r	|   |¡}|  |¡rd|› d|› d�}t|ƒ‚| j |||f¡ t| dƒr-| `d S d S )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Úmsgr   r   r   Úregister4   s   

ÿ
ÿzBaseRouter.registerc                    s   t ‡ fdd„| jD ƒƒS )z;
        Check if `basename` is already registered
        c                 3   s   � | ]
\}}}|ˆ kV  qd S r#   r   )Ú.0Ú_prefixÚ_viewsetr0   ©Únew_basenamer   r   Ú	<genexpr>G   s   € z3BaseRouter.is_already_registered.<locals>.<genexpr>)Úanyr$   )r&   r7   r   r6   r   r+   C   s   z BaseRouter.is_already_registeredc                 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&   r/   r   r   r   r*   I   s   zBaseRouter.get_default_basenamec                 C   r:   )zO
        Return a list of URL patterns, given the registered viewsets.
        zget_urls must be overriddenr<   r%   r   r   r   Úget_urlsP   s   zBaseRouter.get_urlsc                 C   s   t | dƒs
|  ¡ | _| jS )Nr)   )r-   r>   r)   r%   r   r   r   ÚurlsV   s   

zBaseRouter.urlsr#   )
Ú__name__Ú
__module__Ú__qualname__r'   r2   r+   r*   r>   Úpropertyr?   r   r   r   r   r"   0   s    
r"   c                	       s¨   e Zd Zeddddœddddid	�ed
ddi d�eddddddœddddid	�edddi d�gZd&‡ fdd„	Zdd„ Zdd„ Zdd„ Z	dd „ Z
d'd"d#„Zd$d%„ Z‡  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)rG   ÚputÚpatchÚdeletez{basename}-detailTÚInstancez.^{prefix}/{lookup}/{url_path}{trailing_slash}$c                    sª   |rdnd| _ || _|rd| _d| _t| _n8d| _d| _t| _g }| jD ]&}|j}|d dkr5|d	d … }|d
 dkrA|d d
… }| 	|j
|d�¡ q$|| _tƒ  ¡  d S )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   r,   Ú_replaceÚsuperr'   )r&   rZ   Úuse_regex_pathÚ_routesÚrouteÚ	url_param©Ú	__class__r   r   r'   Š   s&   
zSimpleRouter.__init__c                 C   s*   t |ddƒ}|dusJ dƒ‚|jjj ¡ S )r;   Ú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&   r/   rh   r   r   r   r*   £   s   z!SimpleRouter.get_default_basenamec                    sÚ   t tdd„ ˆjD ƒƒƒ‰ | ¡ }‡ fdd„|D ƒ}|r&d}t|d |¡ ƒ‚dd„ |D ƒ}dd„ |D ƒ}g }ˆjD ]1‰tˆtƒrPˆjrP|‡‡fdd„|D ƒ7 }q9tˆtƒreˆjse|‡‡fd	d„|D ƒ7 }q9| 	ˆ¡ q9|S )
z
        Augment `self.routes` with any dynamically generated routes.

        Returns a list of the Route namedtuple.
        c                 S   s    g | ]}t |tƒr|j ¡ ‘qS r   )Ú
isinstancer   r   Úvalues)r3   rd   r   r   r   Ú
<listcomp>¸   s     z+SimpleRouter.get_routes.<locals>.<listcomp>c                    s   g | ]
}|j ˆ v r|j ‘qS r   )r@   ©r3   Úaction)Úknown_actionsr   r   rp   ¼   s
    
ÿzZCannot use the @action decorator on the following methods, as they are existing routes: %sz, c                 S   s   g | ]}|j r|‘qS r   ©r   rq   r   r   r   rp   Æ   ó    c                 S   s   g | ]}|j s|‘qS r   rt   rq   r   r   r   rp   Ç   ru   c                    ó   g | ]}ˆ  ˆ |¡‘qS r   ©Ú_get_dynamic_routerq   ©rd   r&   r   r   rp   Ì   ó    c                    rv   r   rw   rq   ry   r   r   rp   Î   rz   )
rE   r!   r_   Úget_extra_actionsr   Újoinrn   r   r   r,   )r&   r/   Úextra_actionsÚnot_allowedr1   Údetail_actionsÚlist_actionsr_   r   )rs   rd   r&   r   Ú
get_routes°   s$   
ÿ
zSimpleRouter.get_routesc                 C   sL   |j  ¡ }| |j¡ t|jƒ}t|j d|¡|j	|j
 d|j¡|j|d�S )Nz
{url_path}z
{url_name}r   )r   ÚcopyrL   Úkwargsr   r   r   r   r   r   r   Úurl_namer   )r&   rd   rr   r   r   r   r   r   rx   Ô   s   

ûzSimpleRouter._get_dynamic_routec                 C   s,   i }|  ¡ D ]\}}t||ƒr|||< q|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.
        )Úitemsr-   )r&   r/   Ú
method_mapÚbound_methodsÚmethodrr   r   r   r   Úget_method_mapâ   s   
€zSimpleRouter.get_method_maprT   c                 C   sZ   t |ddƒ}t |ddƒp|}d}| jst |ddƒ}|du r$t |d| jƒ}| jj|||d�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)ri   r[   r]   r\   Úformat)r&   r/   r�   rŠ   rŒ   r�   r   r   r   Úget_lookup_regexî   s   ýzSimpleRouter.get_lookup_regexc              	   C   sú   g }| j D ]u\}}}|  |¡}|  |¡}|D ]c}|  ||j¡}|s"q|jj||| jd�}	|sP| jt	u r@|	d dkr?|	dd… }	n|	dd… dkrPd|	dd…  }	|j
 ¡ }
|
 ||jd	œ¡ |j|fi |
¤Ž}|jj|d
�}| | j|	||d�¡ qq|S )zQ
        Use the registered viewsets to generate a list of URL patterns.
        )r.   ÚlookuprZ   r   rS   rW   Né   z^/rV   )r0   r   ©r0   ©r   )r$   r’   r�   r‰   r   r   r‘   rZ   r^   r   r   r‚   rL   r   Úas_viewr   r,   )r&   Úretr.   r/   r0   r“   r_   rd   r   Úregexr   Úviewr   r   r   r   r>   
  s<   

ý

€
þß#zSimpleRouter.get_urls)TT)rT   )r@   rA   rB   r   r   r_   r'   r*   r�   rx   r‰   r’   r>   Ú__classcell__r   r   rf   r   rD   ]   sR    þøüüöüÝ+$
rD   c                   @   s$   e Zd ZdZdZdZdZdd„ ZdS )ÚAPIRootViewz7
    The default basic root view for DefaultRouter
    TNc              	   O   sj   i }|j j}| j ¡ D ]%\}}|r|d | }zt||||| d¡d�||< W q ty0   Y qw t|ƒS )Nú:r‘   )Úargsrƒ   Úrequestr‘   )Úresolver_matchÚ	namespaceÚapi_root_dictr…   r	   rG   r   r   )r&   rŸ   rž   rƒ   r˜   r¡   Úkeyr„   r   r   r   rG   B  s"   ûþzAPIRootView.get)r@   rA   rB   Ú__doc__Ú_ignore_model_permissionsÚschemar¢   rG   r   r   r   r   rœ   :  s    rœ   c                       sR   e Zd ZdZdZdZdZdZeZe	Z
eZ‡ fdd„Zddd„Z‡ fd	d
„Z‡  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                    s8   d|v r|  d¡| _nttjƒ| _tƒ j|i |¤Ž d S )NÚroot_renderers)Úpopr¨   rE   r   ÚDEFAULT_RENDERER_CLASSESra   r'   )r&   rž   rƒ   rf   r   r   r'   e  s   zDefaultRouter.__init__c                 C   s@   i }| j d j}| jD ]\}}}|j|d�||< q| jj|d�S )z+
        Return a basic root view.
        r   r•   )r¢   )r_   r   r$   r‘   rœ   r—   )r&   Úapi_urlsr¢   Ú	list_namer.   r/   r0   r   r   r   Úget_api_root_viewl  s
   zDefaultRouter.get_api_root_viewc                    sH   t ƒ  ¡ }| jr| j|d�}td|| jd�}| |¡ | 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«   rT   r–   )	ra   r>   Úinclude_root_viewr­   r   Úroot_view_namer,   Úinclude_format_suffixesr   )r&   r?   rš   Úroot_urlrf   r   r   r>   w  s   

zDefaultRouter.get_urlsr#   )r@   rA   rB   r¤   r®   r°   r¯   Údefault_schema_renderersrœ   r   ÚAPISchemaViewr
   r'   r­   r>   r›   r   r   rf   r   r§   X  s    
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"   rD   ÚAPIViewrœ   r§   r   r   r   r   Ú<module>   s*    - ^