
    Nwg;                         d Z ddl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mZ dd	lmZ dd
lmZ ddlmZ ddlmZ d Zd Zd Z ej4                  d      Z G d d      Z G d d      Zy)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    | j                   j                  j                   }t        |      j                  S N)_metaconcrete_modelr   name)modelmetas     X/var/www/horilla/myenv/lib/python3.12/site-packages/rest_framework/schemas/generators.pyget_pk_namer      s'    ;;%%++D4=    c                 L    ddl m} t        | dd      }|duxr t        ||      S )zT
    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                 D    | \  }}}ddddddj                  |d      }|fS )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                   2    e Zd ZdZddZd	dZd Zd Zd Zy)
EndpointEnumeratorzR
    A class to determine the available API endpoints that a project exposes.
    Nc                     |<|t         j                  }t        |t              rt	        |      }n|}|j
                  }|| _        y r   )r   ROOT_URLCONF
isinstancestrr   urlpatternspatterns)selfr8   urlconfurlss       r   __init__zEndpointEnumerator.__init__9   sE    "// '3'$W-''H r   c                    || j                   }g }|D ]  }|t        |j                        z   }t        |t              r]| j                  |      }|j                  }| j                  ||      s[| j                  |      D ]  }|||f}	|j                  |	        t        |t              s| j                  |j                  |      }
|j                  |
        t        |t              S )zZ
        Return a list of all available API endpoints by inspecting the URL conf.
        )r8   prefix)key)r8   r6   patternr5   r   get_path_from_regexr   should_include_endpointget_allowed_methodsappendr	   get_api_endpointsurl_patternsextendsortedr0   )r9   r8   r>   api_endpointsr@   
path_regexr-   r   r.   r,   nested_endpointss              r   rE   z$EndpointEnumerator.get_api_endpointsH   s     }}H 	7G#goo"66J':.//
;"++//h?"&":":8"D 7$(&(#;%,,X67 G[1#'#9#9$11% $: $  $$%56	7" m):;;r   c                 N    t        |      }t        j                  t        d|      S )zG
        Given a URL conf regex, return a URI template string.
        z{\g<parameter>})r   resub_PATH_PARAMETER_COMPONENT_RE)r9   rJ   r-   s      r   rA   z&EndpointEnumerator.get_path_from_regexd   s%     j) vv24FMMr   c                     t        |      sy|j                  j                  yd|j                  v r|j                  d   y|j	                  d      s|j	                  d      ryy)zI
        Return `True` if the given endpoint should be included.
        Fschemaz	.{format}z
.{format}/T)r   r   rQ   
initkwargsendswith)r9   r-   r   s      r   rB   z*EndpointEnumerator.should_include_endpointq   sa     8$<<&x***""8,4==%|)Dr   c                 6   t        |d      rUt        |j                        }t        |j                  j                        }||z  D cg c]  }|j                          }}n|j                         j                  }|D cg c]	  }|dvs| c}S c c}w c c}w )zL
        Return a list of the valid HTTP methods for this endpoint.
        actions)OPTIONSHEAD)hasattrsetrU   r   http_method_namesupperallowed_methods)r9   r   rU   rZ   r.   methodss         r   rC   z&EndpointEnumerator.get_allowed_methods   s     8Y'(**+G #HLL$B$B C4;>O4OP&v||~PGPlln44G%,R6>Q0QRR	 Q Ss   B 	B
B)NN)N )	__name__
__module____qualname____doc__r<   rE   rA   rB   rC    r   r   r2   r2   5   s"    !<8N&Sr   r2   c                   D    e Zd ZeZdZd	dZd Zd Zd
dZ	d Z
ddZd Zy)BaseSchemaGeneratorNc                     |r|j                  d      s|dz  }t        j                  | _        || _        || _        || _        || _        || _        || _	        d | _
        y )N/)rS   r   SCHEMA_COERCE_PATH_PKcoerce_path_pkr8   r:   titledescriptionversionurl	endpoints)r9   rj   rm   rk   r8   r:   rl   s          r   r<   zBaseSchemaGenerator.__init__   sY    s||C(3JC*@@ 
&r   c                     | j                   <| j                  | j                  | j                        }|j	                         | _         y y r   )rn   endpoint_inspector_clsr8   r:   rE   )r9   	inspectors     r   _initialise_endpointsz)BaseSchemaGenerator._initialise_endpoints   s;    >>!33DMM4<<PI&88:DN "r   c                     g }g }| j                   D ]Q  \  }}}| j                  |||      }| j                  |||      }|j                  |       |j                  |||f       S ||fS )zY
        Generate (path, method, view) given (path, method, callback) for paths.
        )rn   create_viewcoerce_pathrD   )r9   requestpathsview_endpointsr-   r.   r   views           r   _get_paths_and_endpointsz,BaseSchemaGenerator._get_paths_and_endpoints   s~     &*nn 	8"D&(##Hfg>D##D&$7DLL!!4"67		8 n$$r   c           	      B    |j                   di t        |di       }d|_        i |_        d|_        d|_        t        |dd      |_        t        |dd      }|1|dk(  rd|_        n$|j                  |j                               |_        |t        ||      |_        |S )zC
        Given a callback, return an actual view instance.
        rR   rc   NrU   rV   metadata)r   r   argskwargsformat_kwargrv   
action_mapactionr+   lowerr   )r9   r   r.   rv   ry   rU   s         r   rt   zBaseSchemaGenerator.create_view   s     x||BghbAB	 !(It<(It4"(%kk&,,.9(&9DLr   c                     | j                   rd|vr|S t        t        |dd      dd      }|rt        |      }nd}|j                  dd|z        S )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})ri   r   r   replace)r9   r-   r.   ry   r   
field_names         r   ru   zBaseSchemaGenerator.coerce_path   sX     ""fD&8Kj$7$G$U+JJ||FFZ$788r   c                     t        d      )Nz0.get_schema() must be implemented in subclasses.)NotImplementedError)r9   rv   publics      r   
get_schemazBaseSchemaGenerator.get_schema   s    !"TUUr   c                     |j                   y	 |j                  |j                          y# t        j                  t        t
        f$ r Y yw xY w)zY
        Return `True` if the incoming request has the correct view permissions.
        TF)rv   check_permissionsr
   APIExceptionr   r   )r9   r-   r.   ry   s       r   has_view_permissionsz(BaseSchemaGenerator.has_view_permissions   sO     <<	""4<<0  ''2BC 		s   + AA)NNNNNNr   )NF)r_   r`   ra   r2   rp   ri   r<   rr   rz   rt   ru   r   r   rc   r   r   re   re      s3    /
 N;
%.9Vr   re   )rb   rM   	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   compilerO   r2   re   rc   r   r   <module>r      sm   
 
 #   9 3  / % 0 0 3
:	  *rzz6  
ZS ZSz] ]r   