U
    ui#                     @   s*  U d dl Z d dl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 d dlm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mZ d dlm Z  d dl!m"Z" d d	l#m$Z$ erd
dl%m&Z& e Z'eee  ee  f e(d< ee)e*df e+dddZ,e*e
e* dddZ-dZ.deedddddfe*ee	ee*ef  e	e ee+ef eee df e	e" e	e* e$d e$d edddZ/ddee	eee  ee  f  edddZ0e*e*e*e*dd d!Z1d"e*d#d$d%Z2eeef eeef dd&d'd(Z3eeef eeef eeef d)d*d+Z4dS ),    N)is_dataclass)	TYPE_CHECKINGAnyDictMutableMappingOptionalSetTypeUnioncast)WeakKeyDictionary)
PYDANTIC_V2
BaseConfig
ModelFieldPydanticSchemaGenerationError	UndefinedUndefinedType	Validatorannotation_is_pydantic_v1lenient_issubclassmay_v1)DefaultPlaceholderDefaultType)	BaseModel)	FieldInfo)Literal   )APIRoute_CLONED_TYPES_CACHE)status_codereturnc                 C   s2   | d krdS | dkrdS t | }|dk p.|dk S )NT>   2XXdefault3XX4XX5XX1XX   >   0        )int)r   Zcurrent_status_code r,   G/home/lhs5088/backend/venv/lib/python3.8/site-packages/fastapi/utils.pyis_body_allowed_for_status_code,   s    r.   )pathr    c                 C   s   t td| S )Nz{(.*?)})setrefindall)r/   r,   r,   r-   get_path_param_names=   s    r3   a  Invalid args for response field! Hint: check that {type_} is a valid Pydantic field type. If you are using a return type annotation that is not a valid Pydantic field (e.g. Union[Response, dict, None]) you can disable generating the response model from the type annotation with the path operation decorator parameter response_model=None. Read more: https://fastapi.tiangolo.com/tutorial/response-model/
validationauto)r4   Zserialization)1r5   )nametype_class_validatorsr"   requiredmodel_config
field_infoaliasmodeversionr    c
              	   C   sL  |pi }t j}
|pt  }| ||||||
|d}t|sLt|t jsL|	dkrddlm} z|jf |W S  tk
r   t	j
tj|dd Y nX nltr ddlm} |pt|||d}|| |d	}z|jf |W S  tk
 r   t	j
tj|dd Y nX ddlm} z|jf |W S  tk
rF   t	j
tj|dd Y nX d S )
N)r7   r<   r8   r9   r"   r:   r;   r=   r6   r   v1)r8   r   v2)
annotationr"   r=   )r>   r7   r<   )r   r   r   r   
isinstancefastapi._compatrA   r   RuntimeErrorfastapi
exceptionsZFastAPIError_invalid_args_messageformatr   _compatrC   r   )r7   r8   r9   r"   r:   r;   r<   r=   r>   r?   Zv1_model_configZv1_field_infoZ	v1_kwargsrA   rC   kwargsr,   r,   r-   create_model_fieldL   sh    


  

rN   cloned_types)fieldrP   r    c                   s  t r ddlm} t| |jr | S ddlm}  d kr8t | j}t	|rVt
|drV|j}|}t||jrtt|j |} |}|d kr|j|j|d}| |< |j D ]}t| d|j|j< qt| j|dd	}| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j |_ | j!|_!| j"rB fd
d| j"D |_"| j#rZt| j# d|_#| j$|_$| j%|_%| j&|_&| j'|_'| j(|_(|)  |S )Nr   rB   r   r@   __pydantic_model__)__base__rO   r6   )r7   r8   r?   c                    s   g | ]}t | d qS )rO   )create_cloned_field).0Z	sub_fieldrO   r,   r-   
<listcomp>   s   z'create_cloned_field.<locals>.<listcomp>)*r   rL   rC   rE   r   rF   rA   r   r8   r   hasattrrR   r   r   r   r	   getZcreate_model__name__Z
__fields__valuesrT   r7   rN   Z	has_aliasr=   r9   r"   default_factoryr:   r;   r<   
allow_noneZvalidate_alwaysZ
sub_fieldsZ	key_fieldZ
validatorsZpre_validatorsZpost_validatorsZ
parse_jsonshapeZpopulate_validators)rQ   rP   rC   rA   original_typeZuse_typefZ	new_fieldr,   rO   r-   rT      sb    

rT   )r7   r/   methodr    c                 C   s@   t jdtdd |  | }tdd|}| d|  }|S )Nzrfastapi.utils.generate_operation_id_for_path() was deprecated, it is not used internally, and will be removed soon   )
stacklevel\W_)warningswarnDeprecationWarningr1   sublower)r7   r/   r`   operation_idr,   r,   r-   generate_operation_id_for_path   s    rk   r   )router    c                 C   sH   | j  | j }tdd|}| js(t| dt| jd   }|S )Nrc   rd   r   )r7   Zpath_formatr1   rh   methodsAssertionErrorlistri   )rl   rj   r,   r,   r-   generate_unique_id   s
    
rp   )	main_dictupdate_dictr    c                 C   s   |  D ]z\}}|| kr@t| | tr@t|tr@t| | | q|| krzt| | trzt|| trz| | ||  | |< q|| |< qd S )N)itemsrE   dictdeep_dict_updatero   )rq   rr   keyvaluer,   r,   r-   ru      s     ru   )
first_itemextra_itemsr    c                 G   s*   | f| }|D ]}t |ts|  S q| S )z
    Pass items or `DefaultPlaceholder`s by descending priority.

    The first one to _not_ be a `DefaultPlaceholder` will be returned.

    Otherwise, the first item (a `DefaultPlaceholder`) will be returned.
    )rE   r   )rx   ry   rs   itemr,   r,   r-   get_value_or_default   s
    


r{   )5r1   re   dataclassesr   typingr   r   r   r   r   r   r	   r
   r   weakrefr   rH   rF   r   r   r   r   r   r   r   r   r   r   Zfastapi.datastructuresr   r   Zpydanticr   Zpydantic.fieldsr   typing_extensionsr   Zroutingr   r   __annotations__r+   strboolr.   r3   rJ   rN   rT   rk   rp   ru   r{   r,   r,   r,   r-   <module>   sr    ,0
D@  "


