U
    ui\                     @   s  U d dl Zd dlZd dlZd dl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 d dlmZmZ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! d dl"m#Z# d d	l$m%Z%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l0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; ddl<m=Z= dddddddiddigiddddd ddd!d"d#dgd$Z>d%dd&d'dd(e&d idid)Z?d*d+d,d-d.d/d0Z@eeAeAf eBd1< eeeeAef eeeAef  f d2d3d4ZCd5d6ee/eeee;d7 f ef eDeeeAef  d8d9d:ZEd5d6ee e/eeee;d7 f ef eDeeeAef  d;d<d=ZFejGeAeAd>d?d@ZHejGeAeAd>dAdBZIejGeAe
eA eeAef dCdDdEZJd5d6ejGe
eA e/eeee;d7 f ef eDeeeAef eeAef eeAef f dFdGdHZKe	e9 ee dIdJdKZLdLddddddddd5ddMeAeAeAeeA eeA e	e9 ee	e9  eeeeAef   eeeeAeeAef f   eeA eeeAeeAef f  eeeAeeAef f  eDeeeAef  eeAef dNdOdPZMdS )Q    N)
AnyDictListOptionalSequenceSetTupleTypeUnioncast)routing)JsonSchemaValue
ModelField	Undefinedget_compat_model_name_mapget_definitionsget_schema_from_model_fieldlenient_issubclass)DefaultPlaceholder)	Dependant)_get_flat_fields_from_paramsget_flat_dependantget_flat_paramsget_validation_alias)jsonable_encoder)METHODS_WITH_BODY
REF_PREFIX)OpenAPI)Body
ParamTypes)Response)ModelNameMap)deep_dict_updategenerate_operation_id_for_pathis_body_allowed_for_status_code)	BaseModel)JSONResponse)	BaseRoute)Literal   )_is_model_fieldValidationErrorobjectZLocationarrayZanyOftypestringinteger)titler.   itemsMessage)r1   r.   z
Error Type)locmsgr.   r4   r5   )r1   r.   
propertiesrequiredHTTPValidationErrordetailZDetail$ref)r1   r.   r6   ZInformationZSuccessZRedirectionzClient ErrorzServer ErrorzDefault Response)Z1XXZ2XXZ3XX4XXZ5XXDEFAULTstatus_code_ranges)flat_dependantreturnc                 C   s   i }i }| j D ]`}t|jjddd}|jj}|||< ||krDg ||< |jpLg D ]}||| krN|| | qNqdd | D }||fS )NTZby_aliasZexclude_nonec                 S   s   g | ]\}}||iqS  rA   ).0nameZscopesrA   rA   O/home/lhs5088/backend/venv/lib/python3.8/site-packages/fastapi/openapi/utils.py
<listcomp>c   s    z4get_openapi_security_definitions.<locals>.<listcomp>)Z_security_dependenciesr   Z_security_schememodelscheme_nameZoauth_scopesappendr2   )r>   security_definitionsZoperation_security_dictZsecurity_dependencyZsecurity_definitionZsecurity_namescopeoperation_securityrA   rA   rD    get_openapi_security_definitionsO   s&    
rL   T)separate_input_output_schemas)Z
validationZserialization)	dependantmodel_name_mapfield_mappingrM   r?   c                 C   s  g }t | dd}t|j}t|j}t|j}t|j}	tj|ftj|ftj	|ftj
|	fg}
d}t|jdkr|jd }t|jtrt|jdd}|
D ]\}}|D ]}|j}t|ddsqt||||d}t|}t|jd|}|tj	kr||jkr|r|jdd	}||j|j|d
}|jr0|j|d< t|dd }t|dd }|r\t||d< n|tkrrt||d< t|dd rd|d< || qq|S )NTZskip_repeats   r   convert_underscoresinclude_in_schemafieldrO   rP   rM   _-)rC   inr7   schemadescriptionopenapi_examplesexampleexamples
deprecated)r   r   path_paramsquery_paramsheader_paramscookie_paramsr   pathqueryheadercookielenr   type_r%   getattr
field_infor   r   rC   replacevaluer7   r[   r   r   rH   )rN   rO   rP   rM   
parametersr>   r`   ra   rb   rc   Zparameter_groupsZdefault_convert_underscoresZfirst_fieldZ
param_typeZparam_groupparamrk   Zparam_schemarC   rS   Z	parameterr\   r]   rA   rA   rD   !_get_openapi_operation_parametersi   sz    	




  

rp   )
body_fieldrO   rP   rM   r?   c           
      C   s   | sd S t | stt| |||d}tt| j}|j}| j}i }|rL||d< d|i}	|jrjt	|j|	d< n|j
tkrt	|j
|	d< ||	i|d< |S )NrU   r7   rZ   r^   r]   content)r*   AssertionErrorr   r   r   rk   
media_typer7   r\   r   r]   r   )
rq   rO   rP   rM   Zbody_schemark   Zrequest_media_typer7   request_body_oaiZrequest_media_contentrA   rA   rD   "get_openapi_operation_request_body   s0    	

rv   )routemethodr?   c                 C   s2   t jdtdd | jr| jS | j}t| j||dS )Nzqfastapi.openapi.utils.generate_operation_id() was deprecated, it is not used internally, and will be removed soonr)   
stacklevel)rC   rd   rx   )warningswarnDeprecationWarningoperation_idpath_formatr#   rC   )rw   rx   rd   rA   rA   rD   generate_operation_id   s    r   c                 C   s   | j r| j S | jdd S )NrW    )summaryrC   rl   r1   rw   rx   rA   rA   rD   generate_operation_summary   s    r   )rw   rx   operation_idsr?   c                 C   s   i }| j r| j |d< t| |d|d< | jr4| j|d< | jp>| j}||krd| d| jj  }t| jdi d}|r|d	| 7 }t	j
|d
d || ||d< | jr| j|d< |S )Ntagsr   r   r[   zDuplicate Operation ID z for function __globals____file__z at rR   ry   ZoperationIdr_   )r   r   r[   r~   	unique_idZendpoint__name__rj   getr{   r|   addr_   )rw   rx   r   	operationr~   message	file_namerA   rA   rD   get_openapi_operation_metadata   s*    




r   )rw   r   rO   rP   rM   r?   c           *   	      s2  i }i }i }| j d k	stdt| jtr4| jj}n| j}|sFtd|j}	| jr(| j D ]}
t| |
|d g }t	| j
dd}t|d\}}|r dg | |r|| t| j
|||d}|| |r
d	d
 |D }dd
 |D }|| t|  d< |
tkr4t| j|||d}|r4| d< | jri }| jD ]<}t|tjrFt|||||d\}}}|j|i||j< qF| d< | jd k	rt| j}n:t|j}|j !d}|d k	rt|j"t#rt|j"}| j$ di |i d< |	rft%| jrfddi}t&|t'r>| j(r:t)| j(|||d}ni }| di |i di |	i d< | j*r di }| j*+ D ]\}}|, }|-dd  t|. } | dkrd} || i }!t|t/std| j0!|}"d }#|"r2t)|"|||d}#|	p
d}$|di |$i di }%t1|%|# t2!t|. pVt3j4j*!t#|}&|!dpx|!!dpx|&pxd}'t1|!| |'|!d< qd}(t5| j
})|)s| jrt6 fd d!|(d"dfD sd#ddd$t7d% iiid& d |(< d'|kr|t8t9d( | j:rt1 | j:  ||
; < qZ|||fS ))NzMethods must be a listz.A response class is needed to generate OpenAPI)rw   rx   r   TrQ   )r>   security)rN   rO   rP   rM   c                 S   s   i | ]}|d  |d f|qS )rY   rC   rA   rB   ro   rA   rA   rD   
<dictcomp>.  s     z$get_openapi_path.<locals>.<dictcomp>c                 S   s(   i | ] }| d r|d |d f|qS )r7   rY   rC   )r   r   rA   rA   rD   r   1  s   
 rn   )rq   rO   rP   rM   ZrequestBodyrw   r   rO   rP   rM   	callbacksstatus_code	responsesr[   r.   r/   rU   rr   rZ   rF   r<   defaultz%An additional response must be a dictzapplication/jsonzAdditional ResponseZ422c                 3   s   | ]}| d  kV  qdS )r   NrA   )rB   statusr   rA   rD   	<genexpr>  s   z#get_openapi_path.<locals>.<genexpr>r;   zValidation Errorr:   r8   )r[   rr   r+   )r+   r8   )<methodsrs   
isinstanceresponse_classr   rm   rt   rT   r   r   rN   rL   
setdefaultextendupdaterp   listvaluesr   rv   rq   r   r   APIRouteget_openapi_pathrd   rC   r   strinspect	signature__init__rn   r   r   intZresponse_descriptionr$   r   r&   response_fieldr   r   r2   copypopupperdictresponse_fieldsr"   r=   httpclientr   anyr   validation_error_definition$validation_error_response_definitionZopenapi_extralower)*rw   r   rO   rP   rM   rd   security_schemesdefinitionsZcurrent_response_classZroute_response_media_typerx   rn   r>   rI   rK   Zoperation_parametersZall_parametersZrequired_parametersru   r   callbackZcb_pathZcb_security_schemesZcb_definitionsr   Zresponse_signatureZstatus_code_paramZresponse_schemaZoperation_responsesZadditional_status_codeZadditional_responseprocess_responseZstatus_code_keyZopenapi_responserV   Zadditional_field_schemart   Zadditional_schemaZstatus_textr[   Zhttp422Zall_route_paramsrA   r   rD   r     sb   

  







   
 
  




 

r   )routesr?   c                 C   s   g }g }g }g }| D ]}t |dd rt|tjr|jrTt|jsHtd||j |jrf||j |j	r||
|j	  |jr|
t|j t|j}|
| q|t|| |  }|S )NrT   z'A request body must be a Pydantic Field)rj   r   r   r   rq   r*   rs   rH   r   r   r   r   r   get_fields_from_routesr   rN   r   )r   Zbody_fields_from_routesZresponses_from_routesZrequest_fields_from_routesZcallback_flat_modelsrw   paramsZflat_modelsrA   rA   rD   r     s4     

r   z3.1.0)openapi_versionr   r[   webhooksr   serversterms_of_servicecontactlicense_inforM   external_docs)r1   versionr   r   r[   r   r   r   r   r   r   r   rM   r   r?   c                    s  | |d}|r||d< |r"||d< |	r.|	|d< |
r:|
|d< |rF||d< ||d}|r\||d< i }i }i }t  }tt|pxg t|pg  }t|}t|||d	\} |pg D ]n}t|tjrt|||||d
}|r|\}}}|r|	|j
i | |r|	di | |r | q|p$g D ]x}t|tjr&t|||||d
}|r&|\}}}|rt|	|j
i | |r|	di | |r& | q& r fddt D |d< |r||d< ||d< |r||d< |r||d< |r ||d< ttf |dddS )N)r1   r   r   r[   ZtermsOfServicer   license)Zopenapiinfor   )fieldsrO   rM   r   ZsecuritySchemesc                    s   i | ]}| | qS rA   rA   )rB   kr   rA   rD   r   .  s      zget_openapi.<locals>.<dictcomp>Zschemas
componentspathsr   r   ZexternalDocsTr@   )setr   r   r   r   r   r   r   r   r   r   r   sortedr   r   )r1   r   r   r   r[   r   r   r   r   r   r   r   rM   r   r   outputr   r   Zwebhook_pathsr   Z
all_fieldsrO   rP   rw   resultrd   r   Zpath_definitionsZwebhookrA   r   rD   get_openapi  s    




r   )Nhttp.clientr   r   r{   typingr   r   r   r   r   r   r   r	   r
   r   Zfastapir   Zfastapi._compatr   r   r   r   r   r   r   Zfastapi.datastructuresr   Zfastapi.dependencies.modelsr   Zfastapi.dependencies.utilsr   r   r   r   Zfastapi.encodersr   Zfastapi.openapi.constantsr   r   Zfastapi.openapi.modelsr   Zfastapi.paramsr   r   Zfastapi.responsesr    Zfastapi.typesr!   Zfastapi.utilsr"   r#   r$   Zpydanticr%   Zstarlette.responsesr&   Zstarlette.routingr'   typing_extensionsr(   Z_compatr*   r   r   r=   r   __annotations__rL   boolrp   rv   r   r   r   r   r   r   r   rA   rA   rA   rD   <module>   s    0$		
!P$   
"$ <#

