o
    cZh;                     @   s   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d Zdd Zdd ZedZG dd dZG dd dZdS )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                 C   s   | j jj }t|jS N)_metaZconcrete_modelr   name)modelmeta r   X/var/www/html/lang_env/lib/python3.10/site-packages/rest_framework/schemas/generators.pyget_pk_name   s   

r   c                 C   s*   ddl m} t| dd}|duot||S )zT
    Return `True` if the given view callback is a REST framework view/viewset.
    r   )APIViewclsN)Zrest_framework.viewsr   getattr
issubclass)callbackr   r   r   r   r   is_api_view   s   r   c                 C   s(   | \}}}dddddd |d}|fS )Nr               )GETPOSTPUTPATCHDELETE   )get)endpointpathmethodr   Zmethod_priorityr   r   r   endpoint_ordering$   s   
r)   z/<(?:(?P<converter>[^>:]+):)?(?P<parameter>\w+)>c                   @   s<   e Zd ZdZdddZdddZdd	 Zd
d Zdd ZdS )EndpointEnumeratorzR
    A class to determine the available API endpoints that a project exposes.
    Nc                 C   s>   |d u r|d u rt j}t|trt|}n|}|j}|| _d S r   )r   ZROOT_URLCONF
isinstancestrr   Zurlpatternspatterns)selfr-   urlconfurlsr   r   r   __init__9   s   


zEndpointEnumerator.__init__ c                 C   s   |du r| j }g }|D ]A}|t|j }t|tr:| |}|j}| ||r9| |D ]}|||f}	|	|	 q,qt|t
rL| j|j|d}
||
 qt|tdS )zZ
        Return a list of all available API endpoints by inspecting the URL conf.
        N)r-   prefix)key)r-   r,   patternr+   r   get_path_from_regexr   should_include_endpointget_allowed_methodsappendr   get_api_endpointsZurl_patternsextendsortedr)   )r.   r-   r3   Zapi_endpointsr5   
path_regexr'   r   r(   r&   Znested_endpointsr   r   r   r:   H   s*   




z$EndpointEnumerator.get_api_endpointsc                 C   s   t |}ttd|S )zG
        Given a URL conf regex, return a URI template string.
        z{\g<parameter>})r   resub_PATH_PARAMETER_COMPONENT_RE)r.   r=   r'   r   r   r   r6   d   s   z&EndpointEnumerator.get_path_from_regexc                 C   sT   t |sdS |jjdu rdS d|jv r|jd du rdS |ds&|dr(dS dS )zI
        Return `True` if the given endpoint should be included.
        FNschemaz	.{format}z
.{format}/T)r   r   rA   
initkwargsendswith)r.   r'   r   r   r   r   r7   q   s   
z*EndpointEnumerator.should_include_endpointc                 C   sL   t |drt|j}t|jj}dd ||@ D }n| j}dd |D S )zL
        Return a list of the valid HTTP methods for this endpoint.
        actionsc                 S   s   g | ]}|  qS r   )upper.0r(   r   r   r   
<listcomp>   s    z:EndpointEnumerator.get_allowed_methods.<locals>.<listcomp>c                 S   s   g | ]}|d vr|qS ))OPTIONSHEADr   rF   r   r   r   rH      s    )hasattrsetrD   r   http_method_namesallowed_methods)r.   r   rD   rM   methodsr   r   r   r8      s   


z&EndpointEnumerator.get_allowed_methods)NN)Nr2   )	__name__
__module____qualname____doc__r1   r:   r6   r7   r8   r   r   r   r   r*   5   s    

r*   c                   @   sR   e Zd ZeZdZdddZdd Zdd Zddd	Z	d
d Z
dddZdd ZdS )BaseSchemaGeneratorNc                 C   sL   |r| ds|d7 }tj| _|| _|| _|| _|| _|| _|| _	d | _
d S )N/)rC   r   ZSCHEMA_COERCE_PATH_PKcoerce_path_pkr-   r/   titledescriptionversionurl	endpoints)r.   rW   rZ   rX   r-   r/   rY   r   r   r   r1      s   
zBaseSchemaGenerator.__init__c                 C   s,   | j d u r| | j| j}| | _ d S d S r   )r[   endpoint_inspector_clsr-   r/   r:   )r.   Z	inspectorr   r   r   _initialise_endpoints   s   
z)BaseSchemaGenerator._initialise_endpointsc                 C   sX   g }g }| j D ] \}}}| |||}| |||}|| ||||f q||fS )zY
        Generate (path, method, view) given (path, method, callback) for paths.
        )r[   create_viewcoerce_pathr9   )r.   requestpathsZview_endpointsr'   r(   r   viewr   r   r   _get_paths_and_endpoints   s   
z,BaseSchemaGenerator._get_paths_and_endpointsc                 C   s   |j di t|di }d|_i |_d|_d|_t|dd|_t|dd}|dur9|dkr1d|_n||	 |_|durCt
|||_|S )zC
        Given a callback, return an actual view instance.
        rB   r   NrD   rI   metadata)r   r   argskwargsZformat_kwargr`   Z
action_mapactionr%   lowerr
   )r.   r   r(   r`   rb   rD   r   r   r   r^      s   zBaseSchemaGenerator.create_viewc                 C   sH   | j rd|vr	|S tt|dddd}|rt|}nd}|dd| 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}ZquerysetNr   idz{%s})rV   r   r   replace)r.   r'   r(   rb   r   
field_namer   r   r   r_      s   
zBaseSchemaGenerator.coerce_pathFc                 C   s   t d)Nz0.get_schema() must be implemented in subclasses.)NotImplementedError)r.   r`   publicr   r   r   
get_schema   s   zBaseSchemaGenerator.get_schemac              
   C   s>   |j du rdS z	||j  W dS  tjttfy   Y dS w )zY
        Return `True` if the incoming request has the correct view permissions.
        NTF)r`   Zcheck_permissionsr	   ZAPIExceptionr   r   )r.   r'   r(   rb   r   r   r   has_view_permissions   s   
z(BaseSchemaGenerator.has_view_permissions)NNNNNNr   )NF)rP   rQ   rR   r*   r\   rV   r1   r]   rc   r^   r_   rn   ro   r   r   r   r   rT      s    


rT   )rS   r>   	importlibr   Zdjango.confr   Zdjango.contrib.admindocs.viewsr   Zdjango.core.exceptionsr   Zdjango.httpr   Zdjango.urlsr   r   Zrest_frameworkr	   Zrest_framework.requestr
   Zrest_framework.settingsr   Zrest_framework.utils.model_metar   r   r   r)   compiler@   r*   rT   r   r   r   r   <module>   s(    
]