
    <%i5                         d dl Z d dlZd dlZd dlmZ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mZmZmZmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&  G d de      Z G d de
      Z'y)    N)
URLPatternURLResolver)viewsviewsets)BaseSchemaGenerator)EndpointEnumerator)api_settings)add_trace_messageerrorget_overridereset_generator_statswarn)OpenApiViewExtension)
AutoSchema)ComponentRegistryalpha_operation_sorterbuild_root_objectcamelize_operation	get_classis_versioning_supportedmodify_for_versioningnormalize_result_objectoperation_matches_versionprocess_webhookssanitize_result_object)spectacular_settingsc                   2     e Zd ZddZ fdZd Zd Z xZS )r   c                    | j                  ||      }t        j                  D ]  } ||      } i }|D ]  \  }}}}	||f|vs||||	f|||f<    t        |j	                               }t        t        j                        rt        |t        j                        S t        j                  rt        |t              S |S )N)	endpoints)key)	_get_api_endpointsr   PREPROCESSING_HOOKSlistvaluescallableSORT_OPERATIONSsortedr   )
selfpatternsprefixapi_endpointshookapi_endpoints_deduplicatedpath
path_regexmethodcallbacks
             R/usr/local/footviz/venv/lib/python3.12/site-packages/drf_spectacular/generators.pyget_api_endpointsz$EndpointEnumerator.get_api_endpoints   s    //&A(<< 	:D =9M	: &("2? 	`.D*fhf~%??<@*fV^;_*4<8	` 7>>@A(889--A-Q-QRR!11--CDD      c                 J    t         |   |      }|j                  dd      }|S )Nz\..)superget_path_from_regexreplace)r(   r/   r.   	__class__s      r2   r8   z&EndpointEnumerator.get_path_from_regex-   s'    w*:6||E3'r4   c                    || j                   }g }|D ]  }|t        |j                        z   }t        |t              r^| j                  |      }|j                  }| j                  ||      s[| j                  |      D ]  }||||f}	|j                  |	        t        |t              s| j                  |j                  |      }
|j                  |
        |S )z
        Return a list of all available API endpoints by inspecting the URL conf.
        Only modification the DRF version is passing through the path_regex.
        )r)   r*   )r)   strpattern
isinstancer   r8   r1   should_include_endpointget_allowed_methodsappendr   r!   url_patternsextend)r(   r)   r*   r+   r=   r/   r.   r1   r0   endpointnested_endpointss              r2   r!   z%EndpointEnumerator._get_api_endpoints3   s    
 }}H 	7G#goo"66J':.//
;"++//h?"&":":8"D 7$(*fh#G%,,X67 G[1#'#:#:$11% $; $  $$%56	7" r4   c                    t        |d      r|t        |j                        }d|j                  v rt        |j                  d         }nt        |j                  j
                        }||z  D cg c]  }|j                          }}n>i }d|j                  v r|j                  d   |d<    |j                  di |j                  }|D cg c]  }|dvr|
 c}S c c}w c c}w )Nactionshttp_method_names)OPTIONSHEADTRACECONNECT )hasattrsetrG   
initkwargsclsrH   upperallowed_methods)r(   r1   rG   rH   r0   methodskwargss          r2   r@   z&EndpointEnumerator.get_allowed_methodsP   s    8Y'(**+G"h&9&99$'(;(;<O(P$Q!$'(F(F$G!4;>O4OP&v||~PGP F"h&9&99.6.A.ABU.V*+"hll,V,<<G ")
DD 
 	
 Q
s   /CC )N )__name__
__module____qualname__r3   r8   r!   r@   __classcell__r:   s   @r2   r   r      s    !(:
r4   r   c                   X     e Zd ZeZ fdZ fdZd	 fd	Zd Zd Z	d Z
d
dZd Z xZS )SchemaGeneratorc                     t               | _        |j                  dd       | _        d | _        g | _        t        |   |i | y )Napi_version)r   registrypopr_   	inspectorschemas_storager7   __init__)r(   argsrU   r:   s      r2   rd   zSchemaGenerator.__init__j   sA    )+!::mT:!$)&)r4   c                 z    t         |   |||      }t        j                  rt	        j
                  dd|      }|S )zv
        Customized coerce_path which also considers the `_pk` suffix in URL paths
        of nested routers.
        z
{(\w+)_pk}z{\1_id})r=   replstring)r7   coerce_pathr   SCHEMA_COERCE_PATH_PK_SUFFIXresub)r(   r.   r0   viewr:   s       r2   ri   zSchemaGenerator.coerce_pathq   s8    
 w"46<<66-jNDr4   c                    t        j                  |      }|r!|j                  }|j                         |_        t        |   ||d      }d|_        |r|_        t        |t        j                        rt        ||j                        }nBt        |t        j                        rt        ||j                               }nt        d       |S t        |di       j!                  dd      }|s|S t#        |      }	t#        |j                  j$                        }
t'        |	|
      s6t)        d |	j*                  D              |
j*                  z   }t-        d|i       }	| j/                  | |	              |S )a  
        customized create_view which is called when all routes are traversed. part of this
        is instantiating views with default params. in case of custom routes (@action) the
        custom AutoSchema is injected properly through 'initkwargs' on view. However, when
        decorating plain views like retrieve, this initialization logic is not running.
        Therefore forcefully set the schema if @extend_schema decorator was used.
        NTzUsing not supported View class. Class must be derived from APIView or any of its subclasses like GenericApiView, GenericViewSet.rU   schemac              3   X   K   | ]"  }|t         j                  j                  vr| $ y wN)r	   DEFAULT_SCHEMA_CLASS__mro__).0rQ   s     r2   	<genexpr>z.SchemaGenerator.create_view.<locals>.<genexpr>   s,      l??GGG s   (*ExtendedRearrangedSchema)r   	get_matchrQ   view_replacementr7   create_viewswagger_fake_viewr>   r   ViewSetMixingetattractionr   APIViewlowerr   getr   ro   
issubclasstuplers   type_set_schema_to_view)r(   r1   r0   requestoverride_vieworiginal_clsrm   r}   action_schemaaction_schema_classview_schema_classmror:   s               r2   ry   zSchemaGenerator.create_view{   s\    -66x@#<<L(99;HL w"8VT: "& 'HLdH112T4;;/Femm,T6<<>2FP K"599(DIK (6%hll&9&9:-/@A  2::  "))*C #''A3"K  ':'<=r4   c                     | j                   K| j                  | j                  | j                        | _        | j                  j                         | _         y y rq   )r   endpoint_inspector_clsr)   urlconfrb   r3   )r(   s    r2   _initialise_endpointsz%SchemaGenerator._initialise_endpoints   sA    >>!!88UDN!^^==?DN "r4   c                     g }| j                   D ]A  \  }}}}| j                  ||      }| j                  |||      }|j                  ||||f       C |S )zY
        Generate (path, method, view) given (path, method, callback) for paths.
        )r   ry   ri   rA   )r(   view_endpointsr.   r/   r0   r1   rm   s          r2   _get_paths_and_endpointsz(SchemaGenerator._get_paths_and_endpoints   sl     26.. 	D.D*fh##Hf5D##D&$7D!!4VT"BC	D
 r4   c                 t   i }| j                          | j                         }t        j                  {t	        t        |D cg c]  \  }}}}|j                   c}}            dkD  }|r@t        j                  |D cg c]	  \  }}}}| c}}      }	t        j                  |	      }	nd}	nt        j                  }	|	j                  d      sd|	z   }	|D ]F  \  }}
}}t        |dg       D ]  }t        |        t        |dg       D ]  }t        |        t        j                  ||||      |_        |s| j#                  |||      sv|j$                  r/t'        |j$                        st        d|j$                   d       nd|j$                  rX| j(                  xs |j$                  j*                  }|st-        | j.                  j0                  ||||      }t3        ||      st5        |j6                  t8              sJ d	|j                   d
       t;        t=        |d|            5  |j6                  j?                  ||
|	|| j@                        }ddd       st        jB                  r't        jD                  |	d|t        jF                        }t        jH                  rt        jH                  |z   }|j                  d      sd|z   }t        jJ                  rtM        ||      \  }}|jO                  |i        |||   |jQ                         <   I |S c c}}w c c}}w # 1 sw Y   xY w)z: Iterate endpoints generating per method path operations. N   /^warningserrorsz$using unsupported versioning class "z.". view will be processed as unversioned view.z%Incompatible AutoSchema used on View z. Is DRF's DEFAULT_SCHEMA_CLASS pointing to "drf_spectacular.openapi.AutoSchema" or any other drf-spectacular compatible AutoSchema?r:   rV   )r=   rg   rh   flags))r   r   r   SCHEMA_PATH_PREFIXlenrO   r:   	posixpath
commonpathrk   escape
startswithr   r   r   GET_MOCK_REQUESTr   has_view_permissionsversioning_classr   r_   default_versionr   rb   r)   r   r>   ro   r   r
   r|   get_operationr`   SCHEMA_PATH_PREFIX_TRIMrl   
IGNORECASESCHEMA_PATH_PREFIX_INSERTCAMELIZE_NAMESr   
setdefaultr   )r(   input_requestpublicresultr   _rm   non_trivial_prefixr.   path_prefixr/   r0   weversion	operations                   r2   parsezSchemaGenerator.parse   s   ""$113	22: "%Si)X]Q1d$..)X%Y!Z]^!^!'22i3X]T1aD3XY ii4!.AAK%%c*+K.7 7	5*D*fd!$
B7 Q!$"5 a 0@@tUbcDLd77fdK$$-DTEZEZ-[:4;P;P:Q R5 6 &&$$ =,,<<  ,T^^-D-DfdTXZab0w?dkk:6 77G HF G6
 #74d#CD  KK55*k64==	 #;;vvk4r}}]#==+EEL??3'Tz#22"4T9"EidB'+4F4L(o7	5r I *Y3XT s   L"?L(
0*L..L7	c           
         t                t        | j                  ||      | j                  j	                  t
        j                        t        t
        j                  | j                        | j                  xs t        |dd            }t
        j                  D ]  } ||| ||      } t        t        |            S )z Generate a OpenAPI schema. r   N)paths
componentswebhooksr   )r   	generatorr   r   )r   r   r   r`   buildr   APPEND_COMPONENTSr   WEBHOOKSr_   r|   POSTPROCESSING_HOOKSr   r   )r(   r   r   r   r,   s        r2   
get_schemazSchemaGenerator.get_schema  s    "**Wf-}}**+?+Q+QR%&:&C&CT]]S$$ID(I	
 )== 	YD4QWXF	Y &&=f&EFFr4   c                 n    t        j                  |      |_        | j                  j	                  |       y rq   )weakrefproxyro   rc   rA   )r(   rm   ro   s      r2   r   z#SchemaGenerator._set_schema_to_view)  s(    
 mmF+##F+r4   rq   )NF)rW   rX   rY   r   r   rd   ri   ry   r   r   r   r   r   rZ   r[   s   @r2   r]   r]   g   s6    /*>@@

M^G,r4   r]   )(r   rk   r   django.urlsr   r   rest_frameworkr   r   !rest_framework.schemas.generatorsr   r   BaseEndpointEnumeratorrest_framework.settingsr	   drf_spectacular.drainager
   r   r   r   r   drf_spectacular.extensionsr   drf_spectacular.openapir   drf_spectacular.plumbingr   r   r   r   r   r   r   r   r   r   r   drf_spectacular.settingsr   r]   rM   r4   r2   <module>r      sg     	  / * A Z 0  < .   
 :L
/ L
^H,) H,r4   