o
    !ij                  
   @   sZ  d dl Z d dl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lmZmZmZ dd	lmZ dd
lmZmZmZ ddlmZ d dlmZ dddddZededededddiZ e!dZ"dZ#de#iZ$e!dej%Z&e!dej'Z(dd Z)dd Z*dd Z+dd Z,d d! Z-d"d# Z.d$d% Z/d&d' Z0d.d(d)Z1d*d+ Z2G d,d- d-e3Z4dS )/    N)isclassgetdoc)OrderedDict)Hashable)current_app   )fields)Model	ModelBaseOrderedModel)RequestParser)mergenot_nonenot_none_sorted)
HTTPStatus)quoteintegernumberstring)intfloatr   defaultbooleanvoidz<(?:[^:<>]+:)?([^<>]+)>Successdescriptionz8^:raises\s+(?P<name>[\w\d_]+)\s*:\s*(?P<description>.*)$ao  
    (?P<static>[^<]*)                           # static rule data
    <
    (?:
        (?P<converter>[a-zA-Z_][a-zA-Z0-9_]*)   # converter name
        (?:\((?P<args>.*?)\))?                  # converter arguments
        \:                                      # variable delimiter
    )?
    (?P<variable>[a-zA-Z_][a-zA-Z0-9_]*)        # variable name
    >
    c                 C   s*   t | tr| jn| }ddt|ddiS )z*Return a reference to model in definitions$refz#/definitions/{0} )safe)
isinstancer
   nameformatr   )modelr     r#   X/var/www/html/crm_dreinet/venv_linux/lib/python3.10/site-packages/flask_restx/swagger.pyref>   s   r%   c                 C   s   t | r|  S | S )zDereference values (callable))callable)valuer#   r#   r$   _vD   s   r(   c                 C   s   t d| S )zB
    Transform a Flask/Werkzeug URL pattern in a Swagger one.
    z{\1})RE_URLsub)pathr#   r#   r$   extract_pathI   s   r,   c           
      c   s    d}t | }tj}t }||k rX|| |}|du rn=| }|d r+dd|d fV  |d }|d p4d}||v rAtd|d|| ||d	 pLd|fV  | }||k s||k ry| |d }	d
|	v sjd|	v rqtd| dd|	fV  dS dS )aB  
    Parse a rule and return it as generator. Each iteration yields tuples in the form
    ``(converter, arguments, variable)``. If the converter is `None` it's a static url part, otherwise it's a dynamic
    one.

    Note: This originally lived in werkzeug.routing.parse_rule until it was removed in werkzeug 2.2.0.
    r   Nstaticvariable	converterr   zvariable name z used twice.args><zmalformed url rule: )lenRE_PARSE_RULEmatchset	groupdict
ValueErroraddend)
ruleposr:   do_match
used_namesmdatar.   r/   	remainingr#   r#   r$   
parse_ruleP   s4   

rB   c                 C   sp   t  }t| D ].\}}}|sq|ddd}|tv r t| |d< n|tjjv r+d|d< ntd| |||< q|S )zM
    Extract Flask-style parameters from an URL pattern as Swagger ones.
    r+   T)r    inrequiredtyper   zUnsupported type converter: %s)r   rB   
PATH_TYPESr   url_map
convertersr8   )r+   paramsr/   	argumentsr.   paramr#   r#   r$   extract_path_paramsq   s   

rL   c                 C   s    |  dd  |  dd  t| S )NrC   r    )pop_clean_header)rK   r#   r#   r$   _param_to_header   s   rO   c                 C   s   t | tr	d| i} | dd}t |tr"|tv r"t| | d< t| S t |ttfrGt|dkrG|d tv rGd| d< dt|d  i| d< t| S t|drV| 	|j
 t| S || d< t| S )	Nr   rE   r   r   r   arrayitems
__schema__)r   strgetr   PY_TYPESlisttupler3   hasattrupdaterR   r   )headertypedefr#   r#   r$   rN      s$   

rN   c                 C   s   t | }|r|ddd dd nd }i }|r'||dddnd }t|p.dD ]}|d||d< |rG||dd}q0||pLd |pOd d g |d	}|S )
Nz 

r   .r   z. 
r   r    )rawsummarydetailsreturnsrI   raises)r   stripsplitreplacelstrip	RE_RAISESfinditergroup)objr^   r_   rb   r`   r5   parsedr#   r#   r$   parse_docstring   s"   & rl   c                 C   s    |du rdS t | do| jdu S )z|
    Determine whether a Resource has been hidden from Swagger documentation
    i.e. by using Api.doc(False) decorator
    FT
__apidoc__)rX   rm   )resource	route_docr#   r#   r$   	is_hidden   s   rp   c                 C   s:   i }| D ]}d| ddi||d < qdddd|dd	S )
a  
    :param body_params: List of JSON schema of body parameters.
    :type body_params: list of dict, generated from the json body parameters of a request parser
    :return dict: The Swagger schema representation of the request body

    :Example:
        {
            'name': 'payload',
            'required': True,
            'in': 'body',
            'schema': {
                'type': 'object',
                'properties': [
                    'parameter1': {
                        'type': 'integer'
                    },
                    'parameter2': {
                        'type': 'string'
                    }
                ]
            }
        }
    rE   r   r    payloadTbodyobject)rE   
propertiesr    rD   rC   schemarT   )body_paramsrt   rK   r#   r#   r$   $build_request_body_parameters_schema   s   ry   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd/ddZdd Z	dd Z
d/ddZdd Zdd Zdd Zdd Zdd Zdd Zd0dd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd
S )1Swaggerz>
    A Swagger documentation wrapper for an API instance.
    c                 C   s   || _ i | _d S N)api_registered_models)selfr|   r#   r#   r$   __init__   s   
zSwagger.__init__c                 C   s$  | j j}t|dkr|dr|dd }t| j jt| j jd}| j jr.t| j j|d< | j jr:t| j j|d< | j j	rZ| j j
sF| j jrZt| j j	t| j j
t| j jd|d	< | j jrvd
t| j ji|d< | j jrvt| j j|d d< i }| | j }|  }| j jD ]+}|jD ]%\}}}	}
| j ||D ]}t|}| j|||fd|	i|
}|||< qqqtjd r| j jD ]}| | q| j jD ]}|jr| j jdu ri | j _t| j j|j| j _qd|t||t| j j dg| j jpd| | j j pd|| ! pd|pd| " d}t#|S )z
        Output the specification as a serializable ``dict``.

        :returns: the full Swagger specification in a serializable format
        :rtype: dict
        r   /N)titleversionr   termsOfService)r    emailurlcontactr    licenser   ro   RESTX_INCLUDE_ALL_MODELSz2.0zapplication/json)swaggerbasePathpathsinfoproducesconsumessecurityDefinitionssecuritytagsdefinitions	responseshost)$r|   	base_pathr3   endswithr(   r   r   r   	terms_urlr   contact_emailcontact_urlr   license_urlextract_tagsregister_errors
namespaces	resourcesns_urlsr,   serialize_resourcer   configmodelsregister_modelauthorizationsr   r   rV   representationskeyssecurity_requirementsr   serialize_definitionsget_hostr   )r~   basepathinfosr   r   r   nsrn   urlsro   kwargsr   r+   
serializedr?   specsr#   r#   r$   as_dict   sz   







	

zSwagger.as_dictc                 C   s@   t jdd pd }|r| jjr| jjjrd| jjj|f}|S )NSERVER_NAMEr]   )r   r   rT   r|   	blueprint	subdomainjoin)r~   hostnamer#   r#   r$   r   6  s   zSwagger.get_hostc                 C   s   g }i }|j D ]9}t|trd|i}n"t|ttfr$|d |d d}nt|tr.d|v r.ntd||| |||d < q|j	D ]4}|j
sJqDtdd |j
D rUqD|j|vrm||jrf|j|jdnd|ji qD|jrx|j||j d< qD|S )	Nr    r   r   )r    r   zUnsupported tag format for {0}c                 s   s     | ]}t |j|jd V  qdS )ro   N)rp   rn   ro   ).0rr#   r#   r$   	<genexpr>O  s    z'Swagger.extract_tags.<locals>.<genexpr>r   )r   r   rS   rV   rW   dictr8   r!   appendr   r   allr    r   )r~   r|   r   by_nametagr   r#   r#   r$   r   <  s6   





zSwagger.extract_tagsNc                    s  |d u ri n|}|du rdS t t|di |}|du rdS |r&d|j|n|j|d< t | ||dt }t |t|}dd | D }t	 dd	 |j
pRg D }|D ]u}||t }	t||}
t|
d
rn|
j}
nt|
drv|
j}
t |	t|
dt }	|	durt|
|	d< | |	 t  |	di  t fdd| D }t | |	d< |	d  D ]\}}||ddf}||v rǈ| q|	||< qWr|D ]*}||}	|	sqdd |	d pi  D }D ]}||vr|| |	d |d < qqtfdd| D |d< |S )NFrm   z{}_{}r    rI   c                 S   "   i | ]\}}|| d df|qS rC   queryrw   r   npr#   r#   r$   
<dictcomp>l  s   " z0Swagger.extract_resource_doc.<locals>.<dictcomp>c                 S      g | ]}|  qS r#   lowerr   r?   r#   r#   r$   
<listcomp>n      z0Swagger.extract_resource_doc.<locals>.<listcomp>im_func__func__	docstringc                 3   s$    | ]\}}| v r||fV  qd S r{   r#   r   kv)method_paramsr#   r$   r   }  s    z/Swagger.extract_resource_doc.<locals>.<genexpr>rC   r   c                 S   r   r   rw   r   r#   r#   r$   r     s    r   c                 3   s(    | ]\}}| vr|d  |fV  qdS )r   Nr#   )r   r   r   )need_to_go_downr#   r$   r         )r   getattrr!   __name__expected_paramsrT   r   rL   rQ   r6   methodsrX   r   r   rl   r9   )r~   rn   r   ro   docrI   	up_paramsr   method
method_docmethod_implinherited_paramsr    rK   keyr#   )r   r   r$   extract_resource_doc[  sl   






zSwagger.extract_resource_docc                 C   s   t  }d|vr	|S |dg D ]j}t|tr6t dd |jD }|| dd |jD }|r5t||d< qt|trJtddd| 	|d	|d< qt|t
tfryt|d
krk|\}}tddd| 	||d|d< qtddd| 	|d	|d< q|S )Nexpectc                 s   s(    | ]}|d  dkr|d |fV  qdS )rC   rr   r    Nr#   r   r   r#   r#   r$   r     r   z*Swagger.expected_params.<locals>.<genexpr>c                 S   s   g | ]
}|d  dkr|qS )rC   rr   r#   r   r#   r#   r$   r     s    z+Swagger.expected_params.<locals>.<listcomp>rq   Trr   ru      )r    rD   rC   rv   r   )r   rT   r   r   rR   rY   ry   r
   r   serialize_schemarV   rW   r3   )r~   r   rI   r   parser_paramsrx   r"   r   r#   r#   r$   r     sV   





zSwagger.expected_paramsc           	      C   s   i }| j j D ]9\}}t|}d|d i}t|di }| || d|v r:t|d  d \}}}| ||d< t	|||j
< q|S )Nr   r_   rm   r   r   rv   )r|   error_handlersrQ   rl   r   process_headersrV   valuesr   r   r   )	r~   r   	exceptionhandlerr   responseapidoc_r"   r#   r#   r$   r     s   zSwagger.register_errorsc           
      K   s   | j |||d}|du rd S d| |pd i}dd |jpg D D ]*}dd |dg D }	|| du s:|	r;||	vr;q!| ||||< |jg|| d< q!t|S )	Nr   F
parametersc                 S   r   r#   r   r   r#   r#   r$   r     r   z.Swagger.serialize_resource.<locals>.<listcomp>c                 S   r   r#   r   r   r#   r#   r$   r     r   r   r   )r   parameters_forr   rT   serialize_operationr    r   )
r~   r   rn   r   ro   r   r   r+   r   r   r#   r#   r$   r     s   zSwagger.serialize_resourcec              	   C   s  |  ||pd || d d | ||pd | ||| || p"d | ||d}d|| v r8|| d |d< |dsD|| drHd|d< t|di  }||d pXg  }|rztd	d
 |D rztdd
 |D rtdg|d< nddg|d< |	| 
|| t|S )Nr   r_   )r   r_   r   operationIdr   r   r   
deprecatedTrI   r   c                 s       | ]	}|d  dkV  qdS )rC   formDataNr#   r   r#   r#   r$   r         z.Swagger.serialize_operation.<locals>.<genexpr>c                 s   r   )rE   fileNr#   r   r#   r#   r$   r     r   zmultipart/form-datar   z!application/x-www-form-urlencoded)responses_fordescription_foroperation_id_forr   security_forrT   rV   r   anyrY   vendor_fieldsr   )r~   r   r   	operation
doc_params
all_paramsr#   r#   r$   r     s*   

	zSwagger.serialize_operationc                 C   s"   t dd || di  D S )z
        Extract custom 3rd party Vendor fields prefixed with ``x-``

        See: https://swagger.io/specification/#specification-extensions
        c                 s   s0    | ]\}}| d r|nd||fV  qdS )zx-zx-{0}N)
startswithr!   r   r#   r#   r$   r   	  
    
z(Swagger.vendor_fields.<locals>.<genexpr>vendor)r   rT   rQ   r~   r   r   r#   r#   r$   r     s   zSwagger.vendor_fieldsc                 C   sx   g }d|v r| |d pd ||v r"d|| v r"| || d  || d d r5| || d d  d| S )zDExtract the description metadata and fallback on the whole docstringr   r   r   r`   r\   )r   r   rc   )r~   r   r   partsr#   r#   r$   r     s   zSwagger.description_forc                 C   s*   d|| v r|| d S | j |d |S )zExtract the operation ididr    )r|   
default_idr  r#   r#   r$   r     s
   
zSwagger.operation_id_forc                 C   s  g }|d   D ]\\}}||d< d|vrd|vrd|d< d|vr$d|d< d|v r_d|vr_|dd }t|ttfrL|d }d	|d< dt||i|d
< nt|ttd fr_|tv r_t| |d< || q|d}|rtj	d rtj	d ddddd}t|t
r||d< || |S )NrI   r    rE   rv   r   rC   r   r   rP   rQ   __mask__RESTX_MASK_SWAGGERRESTX_MASK_HEADERrZ   maskzAn optional fields mask)r    rC   rE   r!   r   r   )rQ   rT   r   rV   rW   rU   rE   r   r   r   rS   )r~   r   rI   r    rK   ptypetypr  r#   r#   r$   r   "  s8   


zSwagger.parameters_forc              
   C   s  i }||| fD ]}d|v r|d   D ]o\}}t|}t|tr(|}d }i }	nt|dkr4|\}}}	nt|dkrA|\}}i }	ntd|pHt}||v rV|| j|d nd|i||< |rv| |}
|	d}|rpd||
ii}
|
|| d	< | 	|| |||	d
 qd|v rt|dt
j}||vr| 	t ||||< | |d || d	< d|v r|d d   D ]9\}}| jj  D ].\}}t|di di }|rtt| d nd }|r|j|krdd|i||<  nqqq|s| 	t |||tt
jj< |S )Nr      r   z"Unsupported response specification)r   r   envelopert   rv   headersr"   default_coder   rb   rm   r   r   z#/responses/{0})rQ   rS   r   r3   r8   DEFAULT_RESPONSE_DESCRIPTIONrY   r   rT   r   r   OKDEFAULT_RESPONSEcopyr|   r   r   rV   r   r   r!   r'   )r~   r   r   r   dcoder   r   r"   r   rv   r  r    r   r   error_responsesr#   r#   r$   r   G  sl   




zSwagger.responses_forc              	   C   sd   | |i }d|v sd|v s|r0tdd t| di  | di  |p'i  D |d< |S )Nr  c                 s   s     | ]\}}|t |fV  qd S r{   )rN   r   r#   r#   r$   r     s
    

z*Swagger.process_headers.<locals>.<genexpr>)rT   r   	itertoolschainrQ   )r~   r   r   r   r  r   r#   r#   r$   r     s   
zSwagger.process_headersc                 C   s   t dd | j D S )Nc                 s   s    | ]
\}}||j fV  qd S r{   )rR   )r   r    r"   r#   r#   r$   r     s    
z0Swagger.serialize_definitions.<locals>.<genexpr>)r   r}   rQ   r~   r#   r#   r$   r     s   zSwagger.serialize_definitionsc                 C   s   t |ttfr|d }d| |dS t |tr!| | t|S t |tr/| | t|S t|r?t	|t
jr?| | S t |t
jrH|jS t |ttd fr[|tv r[dt| iS td|)Nr   rP   )rE   rQ   rE   Model {0} not registered)r   rV   rW   r   r
   r   r%   rS   r   
issubclassr   RawrR   rE   rU   r8   r!   )r~   r"   r#   r#   r$   r     s$   



zSwagger.serialize_schemac                 C   s   t |tr|jn|}|| jjvrtd|| jj| }|| jv r&t|S || j|< t |tr;|j	D ]}| 
| q3t |ttfrN| D ]}| | qFt|S )Nr  )r   r
   r    r|   r   r8   r!   r}   r%   __parents__r   r	   r   r   register_field)r~   r"   r    r   parentfieldr#   r#   r$   r     s   



zSwagger.register_modelc                 C   sl   t |tjr|j D ]}| | qd S t |tjr#| |j d S t |tjtj	fr4| 
|j d S d S r{   )r   r   	Polymorphmappingr   r   NestednestedListWildcardr!  	container)r~   r#  r"   r#   r#   r$   r!    s   zSwagger.register_fieldc                 C   sD   d }d|v r|d }|  |}d|| v r || d }|  |}|S )Nr   )r   )r~   r   r   r   authr#   r#   r$   r     s   

zSwagger.security_forc                    s@   t |ttfr fdd|D S |r |}|r|gS d S g S )Nc                    s   g | ]}  |qS r#   )security_requirement)r   r   r  r#   r$   r     s    z1Swagger.security_requirements.<locals>.<listcomp>)r   rV   rW   r,  )r~   r'   requirementr#   r  r$   r     s   
zSwagger.security_requirementsc                 C   s6   t |tr	|g iS t |trtdd | D S d S )Nc                 s   s0    | ]\}}|t |ttfr|n|gfV  qd S r{   )r   rV   rW   r   r#   r#   r$   r     r  z/Swagger.security_requirement.<locals>.<genexpr>)r   rS   r   rQ   )r~   r'   r#   r#   r$   r,    s   

zSwagger.security_requirementr{   )NN)r   
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!  r   r   r,  r#   r#   r#   r$   rz      s0    J
?2
%
>		rz   r{   )5r  reinspectr   r   collectionsr   collections.abcr   flaskr   r   r   r"   r	   r
   r   reqparser   utilsr   r   r   _httpr   urllib.parser   rF   r   r   rS   boolrU   compiler)   r  r  	MULTILINErg   VERBOSEr4   r%   r(   r,   rB   rL   rO   rN   rl   rp   ry   rs   rz   r#   r#   r#   r$   <module>   sX   	
!
%