§
    ¥”jc6  ã                   óN  — 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 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                 óV   — |                       dd¦  «                              dd¦  «        S )zK
    Double brackets in regex of url_path for escape string formatting
    Ú{z{{Ú}z}})Úreplace)Úurl_paths    úe/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/rest_framework/routers.pyÚescape_curly_bracketsr   "   s*   € ð ×Ò˜C Ñ&Ô&×.Ò.¨s°DÑ9Ô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                   óD   — e Zd Zd„ Zdd„Zd„ Zd„ Zd„ Zed„ ¦   «         Z	dS )	Ú
BaseRouterc                 ó   — g | _         d S ©N)Úregistry©Úselfs    r   Ú__init__zBaseRouter.__init__1   s   € ØˆŒˆˆr   Nc                 óð   — |€|                       |¦  «        }|                      |¦  «        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Úmsgs        r   ÚregisterzBaseRouter.register4   s®   € ØÐØ×0Ò0°Ñ9Ô9ˆHà×%Ò% hÑ/Ô/ð 	,ðO¨Hð Oð OØDKðOð Oð OˆCå& sÑ+Ô+Ð+àŒ×Ò˜f g¨xÐ8Ñ9Ô9Ð9õ �4˜Ñ!Ô!ð 	Ø�
�
�
ð	ð 	r   c                 óD   ‡— t          ˆfd„| j        D ¦   «         ¦  «        S )z;
        Check if `basename` is already registered
        c              3   ó,   •K  — | ]\  }}}|‰k    V — Œd S r(   © )Ú.0Ú_prefixÚ_viewsetr6   Únew_basenames       €r   ú	<genexpr>z3BaseRouter.is_already_registered.<locals>.<genexpr>G   s/   øè è € Ð]Ð]Ñ0K°¸À8�8˜|Ò+Ð]Ð]Ð]Ð]Ð]Ð]r   )Ú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Ô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                 ób   — t          | d¦  «        s|                      ¦   «         | _        | j        S )Nr/   )r3   rG   r/   r*   s    r   ÚurlszBaseRouter.urlsV   s+   € å�t˜WÑ%Ô%ð 	)ØŸš™œˆDŒJØŒzÐr   r(   )
Ú__name__Ú
__module__Ú__qualname__r,   r8   r1   r0   rG   ÚpropertyrI   r;   r   r   r&   r&   0   sˆ   € € € € € ðð ð ðð ð ð ð^ð ^ð ^ðMð Mð MðAð Að Að ðð ñ „Xðð ð 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dnd| _         || _        |rd| _        d| _        t          | _        n‰d| _        d| _        t          | _        g }| j        D ]^}|j        }|d         dk    r
|d	d …         }|d
         dk    r
|d d
…         }| 	                    | 
                    |¬¦  «        ¦  «         Œ_|| _        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   r2   Ú_replaceÚsuperr,   )r+   rf   Úuse_regex_pathÚ_routesÚrouteÚ	url_paramÚ	__class__s         €r   r,   zSimpleRouter.__init__Š   sî   ø€ Ø%3Ð;˜c˜c¸ˆÔØ(ˆŒØð 	"Ø!XˆDÔØ*2ˆDÔ'Ý$ˆDŒNˆNà!UˆDÔØ*/ˆDÔ'Ý!ˆDŒNàˆGØœð >ð >�Ø!œI�	Ø˜Q”< 3Ò&Ð&Ø )¨!¨"¨"¤�IØ˜R”= CÒ'Ð'Ø )¨#¨2¨#¤�Ià—’˜uŸ~š~°)˜~Ñ<Ô<Ñ=Ô=Ð=Ð=Ø!ˆDŒKå‰Œ×ÒÑÔÐÐÐr   c                 ó‚   — t          |dd¦  «        }|€
J d¦   «         ‚|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£   sH   € õ
 ˜7 J°Ñ5Ô5ˆàÐ#Ð#ð &8Ñ#Ô#Ð#ð Œ~Ô#Ô/×5Ò5Ñ7Ô7Ð7r   c                 ó&  ‡ ‡‡	— t          t          d„ ‰ j        D ¦   «         ¦  «        ¦  «        Š|                     ¦   «         }ˆfd„|D ¦   «         }|r'd}t	          |d                     |¦  «        z  ¦  «        ‚d„ |D ¦   «         }d„ |D ¦   «         }g }‰ j        D ]uŠ	t          ‰	t          ¦  «        r‰	j        r|ˆ	ˆ fd„|D ¦   «         z  }Œ1t          ‰	t          ¦  «        r‰	j        s|ˆ	ˆ fd„|D ¦   «         z  }Œ`| 	                    ‰	¦  «         Œv|S )	z
        Augment `self.routes` with any dynamically generated routes.

        Returns a list of the Route namedtuple.
        c                 ój   — g | ]0}t          |t          ¦  «        ¯|j                             ¦   «         ‘Œ1S r;   )Ú
isinstancer   r   Úvalues)r<   rp   s     r   ú
<listcomp>z+SimpleRouter.get_routes.<locals>.<listcomp>¸   s8   € Ð%rÐ%rÐ%rÀÕYcÐdiÕkpÑYqÔYqÐ%r e¤m×&:Ò&:Ñ&<Ô&<Ð%rÐ%rÐ%rr   c                 ó0   •— g | ]}|j         ‰v ¯|j         ‘ŒS r;   )rJ   )r<   ÚactionÚknown_actionss     €r   r~   z+SimpleRouter.get_routes.<locals>.<listcomp>¼   s2   ø€ ð 
ð 
ð 
Ø &ØŒ -Ð/Ð/ð ŒOØ/Ð/Ð/r   zZCannot use the @action decorator on the following methods, as they are existing routes: %sz, c                 ó    — g | ]}|j         ¯	|‘ŒS r;   ©r   ©r<   r€   s     r   r~   z+SimpleRouter.get_routes.<locals>.<listcomp>Æ   s   € ÐNÐNÐN VÀÄÐN˜&ÐNÐNÐNr   c                 ó    — g | ]}|j         °	|‘ŒS r;   rƒ   r„   s     r   r~   z+SimpleRouter.get_routes.<locals>.<listcomp>Ç   s   € ÐPÐPÐP 6À&Ä-ÐP˜ÐPÐPÐPr   c                 ó<   •— g | ]}‰                      ‰|¦  «        ‘ŒS r;   ©Ú_get_dynamic_route©r<   r€   rp   r+   s     €€r   r~   z+SimpleRouter.get_routes.<locals>.<listcomp>Ì   s)   ø€ Ð_Ð_Ð_Àf˜4×2Ò2°5¸&ÑAÔAÐ_Ð_Ð_r   c                 ó<   •— g | ]}‰                      ‰|¦  «        ‘ŒS r;   r‡   r‰   s     €€r   r~   z+SimpleRouter.get_routes.<locals>.<listcomp>Î   s)   ø€ Ð]Ð]Ð]Àf˜4×2Ò2°5¸&ÑAÔAÐ]Ð]Ð]r   )
rP   r$   rk   Úget_extra_actionsr   Újoinr|   r   r   r2   )
r+   r5   Úextra_actionsÚnot_allowedr7   Údetail_actionsÚlist_actionsrk   r�   rp   s
   `       @@r   Ú
get_routeszSimpleRouter.get_routes°   sp  øøø€ õ �WÐ%rÐ%rÈ$Ì+Ð%rÑ%rÔ%rÑsÔsÑtÔtˆØ×1Ò1Ñ3Ô3ˆð
ð 
ð 
ð 
Ø*7ð
ñ 
ô 
ˆð ð 	Eð>ˆCå& s¨T¯YªY°{Ñ-CÔ-CÑ'CÑDÔDÐDð OÐN¨}ÐNÑNÔNˆØPÐP¨]ÐPÑPÔPˆàˆØ”[ð 	%ð 	%ˆEÝ˜%¥Ñ.Ô.ð %°5´<ð %ØÐ_Ð_Ð_Ð_Ð_ÐP^Ð_Ñ_Ô_Ñ_��Ý˜E¥<Ñ0Ô0ð %¸¼ð %ØÐ]Ð]Ð]Ð]Ð]ÐP\Ð]Ñ]Ô]Ñ]��à—’˜eÑ$Ô$Ð$Ð$àˆr   c                 ó:  — |j                              ¦   «         }|                     |j        ¦  «         t	          |j        ¦  «        }t          |j                             d|¦  «        |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ˆåØ”	×!Ò! ,°Ñ9Ô9Ø”NØ”×#Ò# L°&´/ÑBÔBØ”<Ø!ð
ñ 
ô 
ð 	
r   c                 óh   — i }|                      ¦   «         D ]\  }}t          ||¦  «        r|||<   Œ|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â   sK   € ð ˆØ(×.Ò.Ñ0Ô0ð 	/ð 	/‰NˆF�FÝ�w Ñ'Ô'ð /Ø(.�˜fÑ%øØÐr   r`   c                 óè   — t          |dd¦  «        }t          |dd¦  «        p|}d}| j        st          |dd¦  «        }|€t          |d| 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ÔEÐUÈÐØˆØŒð 	Lå" 7Ð,DÀdÑKÔKˆLØÐå" 7Ð,@À$ÔB]Ñ^Ô^ˆLØÔ!×(Ò(Ø'Ø-Ø%ð )ñ 
ô 
ð 	
r   c           	      ó¤  — g }| j         D �]D\  }}}|                      |¦  «        }|                      |¦  «        }|D �]}|                      ||j        ¦  «        }|sŒ!|j                             ||| j        ¬¦  «        }	|s@| j        t          u r|	d         dk    r
|	dd…         }	n|	dd…         dk    rd|	dd…         z   }	|j
                             ¦   «         }
|
                     ||j        d	œ¦  «          |j        |fi |
¤Ž}|j                             |¬
¦  «        }|                     |                      |	||¬¦  «        ¦  «         �Œ�ŒF|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
  s£  € ð ˆà)-¬ð %	Cñ %	CÑ%ˆF�G˜XØ×*Ò*¨7Ñ3Ô3ˆFØ—_’_ WÑ-Ô-ˆFàð !Cñ !C�ð ×-Ò-¨g°u´}ÑEÔE�Øð Øð œ	×(Ò(Ø!Ø!Ø#'Ô#6ð )ñ ô �ð ð 0Ø”~­Ð-Ð-Ø  œ8 sš?˜?Ø$)¨!¨"¨"¤I˜EøØ˜r ˜rœ dÒ*Ð*Ø # e¨A¨B¨B¤i¡˜à"Ô-×2Ò2Ñ4Ô4�
Ø×!Ò!Ø (Ø#œlð#ð #ñ ô ð ð
 '�w” wÐ=Ð=°*Ð=Ð=�Ø”z×(Ò(°(Ð(Ñ;Ô;�Ø—
’
˜4Ÿ>š>¨%°¸D˜>ÑAÔAÑBÔBÐBÑBñC!CðF ˆ
r   )TT)r`   )rJ   rK   rL   r   r   rk   r,   r0   r‘   rˆ   r›   r¥   rG   Ú__classcell__©rr   s   @r   rO   rO   ]   sb  ø€ € € € € ð 	ˆØ-àØ ðð ð #ØØ  &Ð)ð		
ñ 		
ô 		
ð 	ˆØ8Ø(ØØð		
ñ 	
ô 	
ð 	ˆØ6à!ØØ)Ø#ð	ð ð %ØØ  *Ð-ð	
ñ 	
ô 	
ð 	ˆØAØ(ØØð		
ñ 	
ô 	
ðG)€FðVð ð ð ð ð ð28ð 8ð 8ð"ð "ð "ðH
ð 
ð 
ð
ð 
ð 
ð
ð 
ð 
ð 
ð8-ð -ð -ð -ð -ð -ð -r   rO   c                   ó$   — e Zd ZdZdZdZdZd„ ZdS )ÚAPIRootViewz7
    The default basic root view for DefaultRouter
    TNc           
      ó  — i }|j         j        }| j                             ¦   «         D ]J\  }}|r|dz   |z   }	 t	          |||||                     d¦  «        ¬¦  «        ||<   Œ;# t          $ r Y ŒGw xY wt          |¦  «        S )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ˆ	Ø!Ô/×5Ò5Ñ7Ô7ð 	ð 	‰MˆC�Øð 6Ø$ s™?¨XÑ5�ð
Ý"ØØØ!Ø#Ø!Ÿ:š: hÑ/Ô/ðñ ô ��C‘�øõ "ð ð ð à�ðøøøõ ˜‰}Œ}Ðs   ¸*A#Á#
A0Á/A0)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|                      d¦  «        | _        nt          t          j        ¦  «        | _         t          ¦   «         j        |i |¤Ž d S )NÚroot_renderers)ÚpoprÁ   rP   r   ÚDEFAULT_RENDERER_CLASSESrm   r,   )r+   rµ   r”   rr   s      €r   r,   zDefaultRouter.__init__e  s[   ø€ Ø˜vÐ%Ð%Ø"(§*¢*Ð-=Ñ">Ô">ˆDÔÐå"&¥|Ô'LÑ"MÔ"MˆDÔØ�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ð)Ð)r   c                 ó®   — i }| j         d         j        }| j        D ]\  }}}|                     |¬¦  «        ||<   Œ | 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  si   € ð ˆØ”K ”NÔ'ˆ	Ø)-¬ð 	Hð 	HÑ%ˆF�G˜XØ$-×$4Ò$4¸hÐ$4Ñ$GÔ$GˆM˜&Ñ!Ð!àÔ×'Ò'°mÐ'ÑDÔDÐDr   c                 ó  •— t          ¦   «                              ¦   «         }| j        rB|                      |¬¦  «        }t	          d|| 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  s�   ø€ õ
 ‰wŒw×ÒÑ!Ô!ˆàÔ!ð 	"Ø×)Ò)°4Ð)Ñ8Ô8ˆDÝ˜B ¨4Ô+>Ð?Ñ?Ô?ˆHØ�KŠK˜Ñ!Ô!Ð!àÔ'ð 	0Ý)¨$Ñ/Ô/ˆ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  s›   ø€ € € € € ðð ð ÐØ"ÐØ€NØ#ÐØ€KØ€MØ%€Oð*ð *ð *ð *ð *ð	Eð 	Eð 	Eð 	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Ð 7Ð 7Ð 7Ð 7Ð 7Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à  Ð  Ð  Ð  Ð  Ð  Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø =Ð =Ð =Ð =Ð =Ð =àˆ
�7ÐNÐNÐNÑOÔO€Øˆz˜.Ð*QÐ*QÐ*QÑRÔR€ð:ð :ð :ð+ð +ð +ð*ð *ð *ð *ð *ñ *ô *ð *ðZZð Zð Zð Zð Z�:ñ Zô Zð Zðzð ð ð ð �%”-ñ ô ð ð<.ð .ð .ð .ð .�Lñ .ô .ð .ð .ð .r   