
    _}dg;                         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j        d          Z G d d          Z G 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                 L    | j         j        j         }t          |          j        S N)_metaconcrete_modelr   name)modelmetas     `/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/rest_framework/schemas/generators.pyget_pk_namer      s    ;%+D4==    c                 X    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)rest_framework.viewsr   getattr
issubclass)callbackr   r   s      r   is_api_viewr      s@    
 -,,,,,
(E4
(
(CtO9C!9!99r   c                 L    | \  }}}dddddd                     |d          }|fS )Nr               )GETPOSTPUTPATCHDELETE   )get)endpointpathmethodr   method_prioritys        r   endpoint_orderingr0   $   sF    %D&(  
c&!nn  r   z/<(?:(?P<converter>[^>:]+):)?(?P<parameter>\w+)>c                   4    e Zd ZdZd	dZd
dZd Zd Zd ZdS )EndpointEnumeratorzR
    A class to determine the available API endpoints that a project exposes.
    Nc                     |<|t           j        }t          |t                    rt	          |          }n|}|j        }|| _        d S r   )r   ROOT_URLCONF
isinstancestrr   urlpatternspatterns)selfr8   urlconfurlss       r   __init__zEndpointEnumerator.__init__9   sP    "/ '3'' $W--'H r    c                    || j         }g }|D ]}|t          |j                  z   }t          |t                    re|                     |          }|j        }|                     ||          r2|                     |          D ]}|||f}	|	                    |	           t          |t                    r1|                     |j        |          }
|                    |
           t          |t                    S )zZ
        Return a list of all available API endpoints by inspecting the URL conf.
        N)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_endpointsrA   
path_regexr-   r   r.   r,   nested_endpointss              r   rF   z$EndpointEnumerator.get_api_endpointsH   s!    }H 	7 	7G#go"6"66J':.. 7//
;;"+//h?? 7"&":":8"D"D 7 7$(&(#;%,,X6666G[11 7#'#9#9$1% $: $ $  $$%5666m):;;;;r   c                 V    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   rK   r-   s      r   rB   z&EndpointEnumerator.get_path_from_regexd   s)     j)) v24FMMMr   c                     t          |          sdS |j        j        dS d|j        v r|j        d         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   rR   
initkwargsendswith)r9   r-   r   s      r   rC   z*EndpointEnumerator.should_include_endpointq   s{     8$$ 	5<&5x***"8,4u==%% 	|)D)D 	5tr   c                     t          |d          r=t          |j                  }t          |j        j                  }d ||z  D             }n|                                j        }d |D             S )zL
        Return a list of the valid HTTP methods for this endpoint.
        actionsc                 6    g | ]}|                                 S  )upper.0r.   s     r   
<listcomp>z:EndpointEnumerator.get_allowed_methods.<locals>.<listcomp>   s     PPP&v||~~PPPr   c                     g | ]}|d v|	S ))OPTIONSHEADrX   rZ   s     r   r\   z:EndpointEnumerator.get_allowed_methods.<locals>.<listcomp>   s#    RRR6>Q0Q0Q0Q0Q0Qr   )hasattrsetrV   r   http_method_namesallowed_methods)r9   r   rV   rb   methodss        r   rD   z&EndpointEnumerator.get_allowed_methods   sx     8Y'' 	5(*++G #HL$B C CPPG>O4OPPPGGllnn4GRRWRRRRr   )NN)Nr=   )	__name__
__module____qualname____doc__r<   rF   rB   rC   rD   rX   r   r   r2   r2   5   s{         ! ! ! !< < < <8N N N  &S S S S Sr   r2   c                   F    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dS )BaseSchemaGeneratorNc                     |r|                     d          s|dz  }t          j        | _        || _        || _        || _        || _        || _        || _	        d | _
        d S )N/)rT   r   SCHEMA_COERCE_PATH_PKcoerce_path_pkr8   r:   titledescriptionversionurl	endpoints)r9   ro   rr   rp   r8   r:   rq   s          r   r<   zBaseSchemaGenerator.__init__   sg     	s||C(( 	3JC*@ 
&r   c                     | j         ;|                     | j        | j                  }|                                | _         d S d S r   )rs   endpoint_inspector_clsr8   r:   rF   )r9   	inspectors     r   _initialise_endpointsz)BaseSchemaGenerator._initialise_endpoints   sB    >!33DM4<PPI&88::DNNN "!r   c                     g }g }| j         D ]a\  }}}|                     |||          }|                     |||          }|                    |           |                    |||f           b||fS )zY
        Generate (path, method, view) given (path, method, callback) for paths.
        )rs   create_viewcoerce_pathrE   )r9   requestpathsview_endpointsr-   r.   r   views           r   _get_paths_and_endpointsz,BaseSchemaGenerator._get_paths_and_endpoints   s     &*n 	8 	8"D&(##Hfg>>D##D&$77DLL!!4"67777n$$r   c           	      j    |j         di t          |di           }d|_        i |_        d|_        d|_        t          |dd          |_        t          |dd          }|:|dk    rd|_        n,|                    |	                                          |_        |t          ||          |_        |S )zC
        Given a callback, return an actual view instance.
        rS   rX   NrV   r^   metadata)r   r   argskwargsformat_kwargr{   
action_mapactionr+   lowerr   )r9   r   r.   r{   r~   rV   s         r   ry   zBaseSchemaGenerator.create_view   s     x|BBghbAABB	 !(It<<(It44""(%kk&,,..99(&99DLr   c                     | j         rd|vr|S t          t          |dd          dd          }|rt          |          }nd}|                    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})rn   r   r   replace)r9   r-   r.   r~   r   
field_names         r   rz   zBaseSchemaGenerator.coerce_path   sp     " 	fD&8&8Kj$77$GG 	$U++JJJ||FFZ$7888r   Fc                      t          d          )Nz0.get_schema() must be implemented in subclasses.)NotImplementedError)r9   r{   publics      r   
get_schemazBaseSchemaGenerator.get_schema   s    !"TUUUr   c                     |j         dS 	 |                    |j                    n## t          j        t          t
          f$ r Y dS w xY wdS )zY
        Return `True` if the incoming request has the correct view permissions.
        NTF)r{   check_permissionsr
   APIExceptionr   r   )r9   r-   r.   r~   s       r   has_view_permissionsz(BaseSchemaGenerator.has_view_permissions   sa     <4	""4<0000'2BC 	 	 	55	ts   & AA)NNNNNNr   )NF)re   rf   rg   r2   ru   rn   r<   rw   r   ry   rz   r   r   rX   r   r   rj   rj      s        /
 N   ; ; ;
% % %   .9 9 9V V V V    r   rj   )rh   rN   	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   compilerP   r2   rj   rX   r   r   <module>r      s   
 
			 # # # # # #             9 9 9 9 9 9 3 3 3 3 3 3       / / / / / / / / % % % % % % 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3  
: : :	 	 	  *rz6    
ZS ZS ZS ZS ZS ZS ZS ZSz] ] ] ] ] ] ] ] ] ]r   