Ë
    ¸2Úi³/  ã                   ó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    úM/var/www/html/acx/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                   ó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°Ó9ˆHØ�‰×Ñ˜f g¨xÐ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#   € ä�t˜WÔ%ØŸ™›ˆDŒJØ�z‰zÐ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   ø€ Ù%3™c¸ˆÔÜ‰ÑÕ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   € ô
 ˜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, )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ÀÔ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   Ú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Ø—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.
        )Úitemsr2   )r+   r4   Ú
method_mapÚbound_methodsÚmethodrk   s         r   Úget_method_mapzSimpleRouter.get_method_mapÁ   sA   € ð ˆØ(×.Ñ.Ó0ò 	/‰NˆF�FÜ�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  € ð ˆà)-¯©ó !	<Ñ%ˆF�G˜XØ×*Ñ*¨7Ó3ˆFØ—_‘_ WÓ-ˆFàò <�ð ×-Ñ-¨g°u·}±}ÓE�ÙØð Ÿ	™	×(Ñ(Ø!Ø!Ø#'×#6Ñ#6ð )ó �ñ  %¨¨ )¨tÒ"3Ø %¨¨ )™O�Eà"×-Ñ-×2Ñ2Ó4�
Ø×!Ñ!Ø (Ø#Ÿl™lñ#ô ð
 '�w—‘ wÑ=°*Ñ=�Ø—z‘z×(Ñ(°(Ð(Ó;�Ø—
‘
œ7 5¨$°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)€FõVò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 ]2  \  }}|r|dz   |z   }	 t        |||||j                  d«      ¬«      ||<   Œ4 t        |«      S # t        $ r Y ŒKw 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ò 	‰MˆC�ÙØ$ s™?¨XÑ5�ð
Ü"ØØØ!Ø#Ø!Ÿ:™: hÓ/ô��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Ó"MˆDÔÜ‰Ñ˜$Ð) &Ó)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   € ô $›ˆØ—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¥   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Ð)Ó8ˆDÜ˜u d°×1DÑ1DÔEˆHØ�K‰K˜Ô!à×'Ò'Ü)¨$Ó/ˆ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   