o
    wvXjƒL  ã                   @   sÜ   d dl 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 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 d
dlmZ d
dlmZ d
dlm Z m!Z! G dd„ deƒZ"G dd„ deƒZ#dS )é    N)Ú
attrgetter)Úurljoin)ÚDecimalValidatorÚEmailValidatorÚMaxLengthValidatorÚMaxValueValidatorÚMinLengthValidatorÚMinValueValidatorÚRegexValidatorÚURLValidator)Úmodels)Ú	force_str)Ú
exceptionsÚ	renderersÚserializers)Úuritemplate)Ú_UnvalidatedFieldÚemptyé   )ÚBaseSchemaGenerator)ÚViewInspector)Úget_pk_descriptionÚis_list_viewc                   @   s(   e Zd Zdd„ Zd	dd„Zd
dd„ZdS )ÚSchemaGeneratorc                 C   s.   | j pd| jpddœ}| jd ur| j|d< |S )NÚ )ÚtitleÚversionÚdescription)r   r   r   )ÚselfÚinfo© r    ú[/var/www/html/myproject/venv/lib/python3.10/site-packages/rest_framework/schemas/openapi.pyÚget_info   s   þ

zSchemaGenerator.get_infoNc           	      C   sŽ   i }|   |¡\}}|sd S |D ]5\}}}|  |||¡sq|j ||¡}| d¡r.|dd … }t| jp3d|ƒ}| |i ¡ ||| | ¡ < q|S )Nú/r   )	Ú_get_paths_and_endpointsÚhas_view_permissionsÚschemaÚget_operationÚ
startswithr   ÚurlÚ
setdefaultÚlower)	r   ÚrequestÚresultÚpathsÚview_endpointsÚpathÚmethodÚviewÚ	operationr    r    r!   Ú	get_paths#   s   
zSchemaGenerator.get_pathsFc                 C   s6   |   ¡  |  |r
dn|¡}|sdS d|  ¡ |dœ}|S )z,
        Generate a OpenAPI schema.
        Nz3.0.2)Úopenapir   r.   )Ú_initialise_endpointsr4   r"   )r   r,   Úpublicr.   r&   r    r    r!   Ú
get_schema:   s   ýzSchemaGenerator.get_schema©N)NF)Ú__name__Ú
__module__Ú__qualname__r"   r4   r8   r    r    r    r!   r      s    
r   c                   @   s¤   e Zd Zg Zg ZddddddœZdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd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 )(Ú
AutoSchemaÚRetrieveÚCreateÚUpdateÚPartialUpdateÚDestroy)ÚgetÚpostÚputÚpatchÚdeletec                 C   sŒ   i }|   ||¡|d< |  ||¡|d< g }||  ||¡7 }||  ||¡7 }||  ||¡7 }||d< |  ||¡}|r<||d< |  ||¡|d< |S )NÚoperationIdr   Ú
parametersÚrequestBodyÚ	responses)Ú_get_operation_idÚget_descriptionÚ_get_path_parametersÚ_get_pagination_parametersÚ_get_filter_parametersÚ_get_request_bodyÚ_get_responses)r   r0   r1   r3   rI   Úrequest_bodyr    r    r!   r'   \   s   zAutoSchema.get_operationc                 C   s  t | jd| ¡ ƒ}t||| jƒrd}n|| jvr|}n| j| ¡  }t t | jddƒddƒ}|dur5|j}nDt| jdƒrM| j ¡ j}| d¡rL|dd… }n,| jj	j}| d	¡r^|dd
… }n| d¡ri|dd… }| | 
¡ ¡ry|dt|ƒ … }|dkr†| d¡s†|d7 }|| S )zR
        Compute an operation ID from the model, serializer or view name.
        ÚactionÚlistÚquerysetNÚmodelÚget_serializer_classÚ
SerializeriöÿÿÿÚAPIViewiùÿÿÿÚViewéüÿÿÿÚs)Úgetattrr2   r+   r   Úmethod_mappingr:   ÚhasattrrX   ÚendswithÚ	__class__r   Úlen)r   r0   r1   Úmethod_namerT   rW   Únamer    r    r!   rL   o   s0   

€


zAutoSchema._get_operation_idc           	   	   C   s¾   t sJ dƒ‚tt| jddƒddƒ}g }t  |¡D ]D}d}|durMz|j |¡}W n ty3   d}Y nw |durA|jrAt|jƒ}n|durM|j	rMt
||ƒ}|dd|dd	id
œ}| |¡ q|S )zL
        Return a list of parameters from templated path variables.
        z;`uritemplate` must be installed for OpenAPI schema support.rV   NrW   r   r0   TÚtypeÚstring)re   ÚinÚrequiredr   r&   )r   r^   r2   Ú	variablesÚ_metaÚ	get_fieldÚ	ExceptionÚ	help_textr   Úprimary_keyr   Úappend)	r   r0   r1   rW   rI   Úvariabler   Úmodel_fieldÚ	parameterr    r    r!   rN   ˜   s0   ÿ
ÿû	zAutoSchema._get_path_parametersc                 C   s8   |   ||¡sg S g }| jjD ]}||ƒ  | j¡7 }q|S r9   )Ú_allows_filtersr2   Úfilter_backendsÚget_schema_operation_parameters)r   r0   r1   rI   Úfilter_backendr    r    r!   rP   ¼   s   z!AutoSchema._get_filter_parametersc                 C   s:   t | jddƒdu rdS t| jdƒr| jjdv S | ¡ dv S )zÜ
        Determine whether to include filter Fields in schema.

        Default implementation looks for ModelViewSet or GenericAPIView
        actions/methods that cause filtering on the default implementation.
        ru   NFrT   )rU   ÚretrieveÚupdateÚpartial_updateÚdestroy)rC   rE   rF   rG   )r^   r2   r`   rT   r+   ©r   r0   r1   r    r    r!   rt   Ä   s
   zAutoSchema._allows_filtersc                 C   s0   | j }t|||ƒsg S |  ¡ }|sg S | |¡S r9   )r2   r   Ú_get_paginatorrv   )r   r0   r1   r2   Ú	paginatorr    r    r!   rO   Ñ   s   
z%AutoSchema._get_pagination_parametersc           
      C   s  t |tjƒrd|  |j¡dœS t |tjƒr |  |¡}d|d< |S t |tjƒr/d|  |j¡dœS t |tj	ƒrNt
|jdd ƒ}|d urN|jj}t |tjƒrNddiS t |tjƒr^ddt|jƒidœS t |tjƒrkdt|jƒiS t |tjƒršdi dœ}t |jtƒs˜|  |j¡}d| d¡i}d|v r”| d¡|d< ||d	< |S t |tjƒr¥d
ddœS t |tjƒr°d
ddœS t |tjƒr»d
ddœS t |tjƒrÆd
ddœS t |tjƒrÑd
ddœS t |tjƒrçdd
i}|jdkrå|j|d< |S t |tjƒ�r#ddi}|j�rt d|jd d  d ƒ|d< |j!�rt"|j!d ƒd |d< |d  |d< |  #||¡ |S t |tj$ƒ�r6ddi}|  #||¡ |S t |tj%ƒ�rcddi}|  #||¡ t"| dd¡ƒdk�s]t"| dd¡ƒdk�rad|d< |S t |tj&ƒ�rod
ddœS tj'dtj(dtj)dtj*di}	d|	 |j+d
¡iS ) NÚarray©rf   ÚitemsÚobjectrf   rW   ÚintegerÚenumÚformatr�   rg   Údate)rf   r…   z	date-timeÚemailÚuriÚuuidÚbothÚnumberÚ.r   Ú0Ú1Ú
multipleOfÚ9ÚmaximumÚminimumr   iÿÿÿÚint64ÚbinaryÚboolean),Ú
isinstancer   ÚListSerializerÚ_map_serializerÚchildrY   ÚManyRelatedFieldÚ
_map_fieldÚchild_relationÚPrimaryKeyRelatedFieldr^   rV   rk   Úpkr   Ú	AutoFieldÚMultipleChoiceFieldrU   ÚchoicesÚChoiceFieldÚ	ListFieldr   rC   Ú	DateFieldÚDateTimeFieldÚ
EmailFieldÚURLFieldÚ	UUIDFieldÚIPAddressFieldÚprotocolÚDecimalFieldÚdecimal_placesÚfloatÚmax_whole_digitsÚintÚ_map_min_maxÚ
FloatFieldÚIntegerFieldÚ	FileFieldÚBooleanFieldÚ	JSONFieldÚ	DictFieldÚHStoreFieldrb   )
r   ÚfieldÚdatarW   rr   ÚmappingÚ	map_fieldr�   ÚcontentÚFIELD_CLASS_SCHEMA_TYPEr    r    r!   r›   Ý   sÀ   
þ

þ
ÿþ
ÿþ
ÿþþþþþÿ

ÿÿÿ,þüzAutoSchema._map_fieldc                 C   s(   |j r|j |d< |jr|j|d< d S d S )Nr‘   r’   )Ú	max_valueÚ	min_value)r   r¸   r¼   r    r    r!   r°   o  s
   
ÿzAutoSchema._map_min_maxc                 C   sÈ   g }i }|j  ¡ D ]N}t|tjƒrq	|jr| |j¡ |  |¡}|j	r'd|d< |j
r.d|d< |jr5d|d< |jrB|jtkrB|j|d< |jrLt|jƒ|d< |  ||¡ |||j< q	d|i}|rb||d< |S )	NTÚreadOnlyÚ	writeOnlyÚnullableÚdefaultr   Ú
propertiesri   )ÚfieldsÚvaluesr–   r   ÚHiddenFieldri   rp   Ú
field_namer›   Ú	read_onlyÚ
write_onlyÚ
allow_nullrÃ   r   rn   ÚstrÚ_map_field_validators)r   Ú
serializerri   rÄ   r¸   r&   r-   r    r    r!   r˜   u  s2   

ÿzAutoSchema._map_serializerc                 C   sF  |j D ]�}t|tƒrd|d< t|tƒrd|d< t|tƒr#|jj|d< qt|tƒr8d}t|tj	ƒr2d}|j
||< qt|tƒrMd}t|tj	ƒrGd}|j
||< qt|tƒrX|j
|d	< qt|tƒrc|j
|d
< qt|tƒr |jrztd|jd d  d ƒ|d< |jr |j}|jdur�|jdkr�||j8 }t|d ƒd |d	< |d	  |d
< qdS )z&
        map field validators
        r‡   r…   rˆ   ÚpatternÚ	maxLengthÚmaxItemsÚ	minLengthÚminItemsr‘   r’   rŒ   r   r�   rŽ   r�   Nr   r�   )Ú
validatorsr–   r   r   r
   ÚregexrÏ   r   r   r£   Úlimit_valuer   r   r	   r   r¬   r­   Ú
max_digitsr¯   )r   r¸   r&   ÚvÚ	attr_nameÚdigitsr    r    r!   rÍ   œ  s@   









€áz AutoSchema._map_field_validatorsc                 C   s   t | jdd ƒ}|r|ƒ S d S )NÚpagination_class)r^   r2   )r   rÛ   r    r    r!   r}   Á  s   zAutoSchema._get_paginatorc                 C   s   t ttdƒ| jjƒƒS )NÚ
media_type)rU   Úmapr   r2   Úparser_classesr|   r    r    r!   Úmap_parsersÇ  s   zAutoSchema.map_parsersc                 C   s.   g }| j jD ]}|tjkrq| |j¡ q|S r9   )r2   Úrenderer_classesr   ÚBrowsableAPIRendererrp   rÜ   )r   r0   r1   Úmedia_typesÚrendererr    r    r!   Úmap_renderersÊ  s   
zAutoSchema.map_renderersc              
   C   sN   | j }t|dƒs
d S z| ¡ W S  tjy&   t d |jj	||¡¡ Y d S w )NÚget_serializerzt{}.get_serializer() raised an exception during schema generation. Serializer fields will not be generated for {} {}.)
r2   r`   rå   r   ÚAPIExceptionÚwarningsÚwarnr…   rb   r:   )r   r1   r0   r2   r    r    r!   Ú_get_serializerÓ  s   

ýûzAutoSchema._get_serializerc                    s˜   |dvri S |   ||¡| _|  ||¡}t|tjƒsi S |  |¡‰ |dkr*ˆ  dd ¡ ˆ d  ¡  	¡ D ]\}}d|v r?ˆ d |= q2d‡ fdd„| jD ƒiS )	N)ÚPUTÚPATCHÚPOSTrë   ri   rÄ   rÀ   r¼   c                    ó   i | ]}|d ˆ i“qS ©r&   r    ©Ú.0Úct©r¼   r    r!   Ú
<dictcomp>÷  ó    ÿÿz0AutoSchema._get_request_body.<locals>.<dictcomp>)
rß   Úrequest_media_typesré   r–   r   rY   r˜   ÚpopÚcopyr�   )r   r0   r1   rÎ   re   r&   r    rò   r!   rQ   â  s"   

€þÿzAutoSchema._get_request_bodyc                    sè   |dkr
dddiiS |   ||¡| _i }|  ||¡}t|tjƒrK|  |¡}|d  ¡  ¡ D ]\‰ }d|v rJ|d ˆ = d|v rJ‡ fdd	„|d D ƒ|d< q,t	||| j
ƒrcd
|dœ‰|  ¡ }|rb| ˆ¡‰n|‰d‡fdd„| jD ƒddœiS )NÚDELETEÚ204r   r   rÄ   rÁ   ri   c                    s   g | ]}|ˆ kr|‘qS r    r    )rð   Úf)re   r    r!   Ú
<listcomp>  s    z-AutoSchema._get_responses.<locals>.<listcomp>r   r€   Ú200c                    rí   rî   r    rï   )Úresponse_schemar    r!   ró   !  rô   z-AutoSchema._get_responses.<locals>.<dictcomp>)r¼   r   )rä   Úresponse_media_typesré   r–   r   rY   r˜   r÷   r�   r   r2   r}   Úget_paginated_response_schema)r   r0   r1   Úitem_schemarÎ   r&   r~   r    )re   rý   r!   rR   ý  s@   ÿÿ

€þ
€
þøÿzAutoSchema._get_responsesN)r:   r;   r<   rõ   rþ   r_   r'   rL   rN   rP   rt   rO   r›   r°   r˜   rÍ   r}   rß   rä   ré   rQ   rR   r    r    r    r!   r=   O   s4    û)$ '%	r=   )$rç   Úoperatorr   Úurllib.parser   Údjango.core.validatorsr   r   r   r   r   r	   r
   r   Ú	django.dbr   Údjango.utils.encodingr   Úrest_frameworkr   r   r   Úrest_framework.compatr   Úrest_framework.fieldsr   r   Ú
generatorsr   Ú
inspectorsr   Úutilsr   r   r   r=   r    r    r    r!   Ú<module>   s    (: