
    h;                         S r SSK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Jr  SS	KJr  SS
KJr  SSKJr  SSKJr  S rS rS r\R4                  " S5      r " S S5      r " S S5      rg)z]
generators.py   # Top-down schema generation

See schemas.__init__.py for package overview.
    N)import_module)settings)simplify_regex)PermissionDenied)Http404)
URLPatternURLResolver)
exceptions)clone_request)api_settings)_get_pkc                 l    U R                   R                  R                   n[        U5      R                  $ N)_metaconcrete_modelr   name)modelmetas     S/var/www/html/env/lib/python3.13/site-packages/rest_framework/schemas/generators.pyget_pk_namer      s'    ;;%%++D4=    c                 T    SSK Jn  [        U SS5      nUSL=(       a    [        X!5      $ )zL
Return `True` if the given view callback is a REST framework view/viewset.
r   )APIViewclsN)rest_framework.viewsr   getattr
issubclass)callbackr   r   s      r   is_api_viewr      s)    
 -
(E4
(CtO9C!99r   c                 B    U u  pnSSSSSS.R                  US5      nU4$ )Nr               )GETPOSTPUTPATCHDELETE   )get)endpointpathmethodr   method_prioritys        r   endpoint_orderingr0   $   s=    %D( 
c&!n  r   z/<(?:(?P<converter>[^>:]+):)?(?P<parameter>\w+)>c                   >    \ rS rSrSrS
S jrSS jrS rS rS r	S	r
g)EndpointEnumerator5   zJ
A class to determine the available API endpoints that a project exposes.
Nc                     UcB  Uc  [         R                  n[        U[        5      (       a  [	        U5      nOUnUR
                  nXl        g r   )r   ROOT_URLCONF
isinstancestrr   urlpatternspatterns)selfr9   urlconfurlss       r   __init__EndpointEnumerator.__init__9   sF    "// '3''$W-''H r   c                    Uc  U R                   n/ nU H  nU[        UR                  5      -   n[        U[        5      (       ad  U R                  U5      nUR                  nU R                  Xg5      (       a/  U R                  U5       H  nXhU4n	UR                  U	5        M     M  M  [        U[        5      (       d  M  U R                  UR                  US9n
UR                  U
5        M     [        U[        S9$ )zJ
Return a list of all available API endpoints by inspecting the URL conf.
)r9   prefix)key)r9   r7   patternr6   r   get_path_from_regexr   should_include_endpointget_allowed_methodsappendr	   get_api_endpointsurl_patternsextendsortedr0   )r:   r9   r@   api_endpointsrB   
path_regexr-   r   r.   r,   nested_endpointss              r   rG   $EndpointEnumerator.get_api_endpointsH   s     }}HG#goo"66J':..//
;"++//??"&":":8"D$((#;%,,X6 #E @
 G[11#'#9#9$11% $: $  $$%56  " m):;;r   c                 P    [        U5      n[        R                  " [        SU5      $ )z7
Given a URL conf regex, return a URI template string.
z{\g<parameter>})r   resub_PATH_PARAMETER_COMPONENT_RE)r:   rL   r-   s      r   rC   &EndpointEnumerator.get_path_from_regexd   s%     j) vv24FMMr   c                     [        U5      (       d  gUR                  R                  c  gSUR                  ;   a  UR                  S   c  gUR	                  S5      (       d  UR	                  S5      (       a  gg)z9
Return `True` if the given endpoint should be included.
Fschemaz	.{format}z
.{format}/T)r   r   rU   
initkwargsendswith)r:   r-   r   s      r   rD   *EndpointEnumerator.should_include_endpointq   sj     8$$<<&x***""8,4==%%|)D)Dr   c                 L   [        US5      (       aV  [        UR                  5      n[        UR                  R                  5      nX#-   Vs/ s H  oDR                  5       PM     nnOUR                  5       R                  nU Vs/ s H  oDS;  d  M
  UPM     sn$ s  snf s  snf )z<
Return a list of the valid HTTP methods for this endpoint.
actions)OPTIONSHEAD)hasattrsetrZ   r   http_method_namesupperallowed_methods)r:   r   rZ   r_   r.   methodss         r   rE   &EndpointEnumerator.get_allowed_methods   s     8Y''(**+G #HLL$B$B C4;4OP4O&||~4OGPGlln44G%,RW6>Q0QWRR	 Q Ss   B	B!B!)r9   )NN)N )__name__
__module____qualname____firstlineno____doc__r=   rG   rC   rD   rE   __static_attributes__ r   r   r2   r2   5   s"    !<8N&Sr   r2   c                   R    \ rS rSr\rSrSS jrS rS r	SS jr
S rSS jrS	 rS
rg)BaseSchemaGenerator   Nc                     U(       a  UR                  S5      (       d  US-  n[        R                  U l        X@l        XPl        Xl        X0l        X`l        X l	        S U l
        g )N/)rW   r   SCHEMA_COERCE_PATH_PKcoerce_path_pkr9   r;   titledescriptionversionurl	endpoints)r:   rs   rv   rt   r9   r;   ru   s          r   r=   BaseSchemaGenerator.__init__   sP    s||C((3JC*@@ 
&r   c                     U R                   c<  U R                  U R                  U R                  5      nUR	                  5       U l         g g r   )rw   endpoint_inspector_clsr9   r;   rG   )r:   	inspectors     r   _initialise_endpoints)BaseSchemaGenerator._initialise_endpoints   s;    >>!33DMM4<<PI&88:DN "r   c                     / n/ nU R                    HN  u  pEnU R                  XeU5      nU R                  XEU5      nUR                  U5        UR                  XEU45        MP     X#4$ )zI
Generate (path, method, view) given (path, method, callback) for paths.
)rw   create_viewcoerce_pathrF   )r:   requestpathsview_endpointsr-   r.   r   views           r   _get_paths_and_endpoints,BaseSchemaGenerator._get_paths_and_endpoints   so     &*nn"D(##Hg>D##D$7DLL!!4"67	 '5 $$r   c           	      F   UR                   " S0 [        US0 5      D6nSUl        0 Ul        SUl        SUl        [        USS5      Ul        [        USS5      nUb2  US:X  a  SUl        O$UR                  UR                  5       5      Ul        Ub  [        X25      Ul        U$ )z3
Given a callback, return an actual view instance.
rV   rk   NrZ   r[   metadata)r   r   argskwargsformat_kwargr   
action_mapactionr+   lowerr   )r:   r   r.   r   r   rZ   s         r   r   BaseSchemaGenerator.create_view   s     ||BghbAB	 !(It<(It4"(%kk&,,.9(9DLr   c                     U R                   (       a  SU;  a  U$ [        [        USS5      SS5      nU(       a  [        U5      nOSnUR                  SSU-  5      $ )z
Coerce {pk} path arguments into the name of the model field,
where possible. This is cleaner for an external representation.
(Ie. "this is an identifier", not "this is a database primary key")
z{pk}querysetNr   idz{%s})rr   r   r   replace)r:   r-   r.   r   r   
field_names         r   r   BaseSchemaGenerator.coerce_path   sX     ""fD&8Kj$7$G$U+JJ||FFZ$788r   c                     [        S5      e)Nz0.get_schema() must be implemented in subclasses.)NotImplementedError)r:   r   publics      r   
get_schemaBaseSchemaGenerator.get_schema   s    !"TUUr   c                     UR                   c  g UR                  UR                   5        g! [        R                  [        [
        4 a     gf = f)zI
Return `True` if the incoming request has the correct view permissions.
TF)r   check_permissionsr
   APIExceptionr   r   )r:   r-   r.   r   s       r   has_view_permissions(BaseSchemaGenerator.has_view_permissions   sO     <<	""4<<0  ''2BC 		s   , AA)rr   rt   rw   r9   rs   rv   r;   ru   )NNNNNNr   )NF)re   rf   rg   rh   r2   rz   rr   r=   r|   r   r   r   r   r   rj   rk   r   r   rm   rm      s3    /
 N;
%.9Vr   rm   )ri   rP   	importlibr   django.confr   django.contrib.admindocs.viewsr   django.core.exceptionsr   django.httpr   django.urlsr   r	   rest_frameworkr
   rest_framework.requestr   rest_framework.settingsr   rest_framework.utils.model_metar   r   r   r0   compilerR   r2   rm   rk   r   r   <module>r      sk   
 
 #   9 3  / % 0 0 3
:	  "zz6  
ZS ZSz] ]r   