U
    Ç½„bc  ã                   @   s  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mZ ddlmZmZ dd	lmZmZmZ dd
lmZ ddlmZ G dd„ de	ƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ de	ƒZG dd„ deƒZG dd„ deƒZ G dd„ de ƒZ!dS )é    )Úresolve_url)Úrender_to_string)Ú	force_str)ÚPromise)ÚBaseRendererÚJSONRendererÚTemplateHTMLRenderer)ÚencodersÚjsoné   )Úredoc_settingsÚswagger_settings)Ú
VALIDATORSÚOpenAPICodecJsonÚOpenAPICodecYaml)ÚSwagger)Úfilter_nonec                   @   s2   e Zd ZdZdZg ZdZedd„ ƒZddd„Z	dS )	Ú_SpecRendererz?Base class for text renderers. Handles encoding and validation.úutf-8Nc                 C   s8   t dd„ |D ƒƒs$tdd t¡ ƒ‚t| j| fd|iƒS )Nc                 s   s   | ]}|t kV  qd S )N)r   )Ú.0Zvld© r   ú6/tmp/pip-unpacked-wheel-o6yr43pd/drf_yasg/renderers.pyÚ	<genexpr>   s     z0_SpecRenderer.with_validators.<locals>.<genexpr>zallowed validators are z, Ú
validators)ÚallÚAssertionErrorÚjoinr   ÚtypeÚ__name__)Úclsr   r   r   r   Úwith_validators   s    $z_SpecRenderer.with_validatorsc                 C   s>   | j stdƒ‚|   | j¡}t|tƒs4tƒ  |||¡S | |¡S )Nzmust override codec_class)Úcodec_classr   r   Ú
isinstancer   r   ÚrenderÚencode)ÚselfÚdataÚ
media_typeÚrenderer_contextÚcodecr   r   r   r#      s
    
z_SpecRenderer.render)NN)
r   Ú
__module__Ú__qualname__Ú__doc__Úcharsetr   r!   Úclassmethodr    r#   r   r   r   r   r      s   
r   c                   @   s   e Zd ZdZdZdZeZdS )ÚOpenAPIRendererz_Renders the schema as a JSON document with the ``application/openapi+json`` specific mime type.zapplication/openapi+jsonÚopenapiN©r   r*   r+   r,   r'   Úformatr   r!   r   r   r   r   r/   &   s   r/   c                   @   s   e Zd ZdZdZdZeZdS )ÚSwaggerJSONRendererzVRenders the schema as a JSON document with the generic ``application/json`` mime type.zapplication/jsonz.jsonNr1   r   r   r   r   r3   -   s   r3   c                   @   s   e Zd ZdZdZdZeZdS )ÚSwaggerYAMLRendererz&Renders the schema as a YAML document.zapplication/yamlz.yamlN)r   r*   r+   r,   r'   r2   r   r!   r   r   r   r   r4   4   s   r4   c                   @   sH   e Zd ZdZdZdZdZddd„Zddd	„Zd
d„ Z	dd„ Z
dd„ ZdS )Ú_UIRendererzbBase class for web UI renderers. Handles loading and passing settings to the appropriate template.z	text/htmlr   Ú Nc                 C   s8   t |tƒstƒ  |||¡S |  ||¡ t| j||d ƒS )NÚrequest)r"   r   r   r#   Úset_contextr   Útemplate)r%   ÚswaggerZaccepted_media_typer(   r   r   r   r#   A   s    
z_UIRenderer.renderc                 C   sd   |r|j jpdnd|d< |r(|j jp*dnd|d< tj|  ¡ tjd�|d< tj	|d< | 
|  ¡ ¡ d S )Nr6   ÚtitleÚversion©r   Zoauth2_configÚUSE_SESSION_AUTH)Úinfor;   r<   r
   ÚdumpsÚget_oauth2_configr	   ÚJSONEncoderr   r>   ÚupdateÚget_auth_urls©r%   r(   r:   r   r   r   r8   K   s
    
z_UIRenderer.set_contextc                 C   s|   t |tƒrt|ƒ}|d krd S d\}}t |tƒs\t|ƒdkrH|\}}}nt|ƒdkr\|\}}|pbd}|pji }t|f|ž|ŽS )N)NNé   r   )r"   r   ÚstrÚlenr   )r%   ÚtoÚargsÚkwargsr   r   r   r   R   s    

z_UIRenderer.resolve_urlc                 C   s"   |   tj¡|   tj¡dœ}t|ƒS )N)Ú	LOGIN_URLÚ
LOGOUT_URL)r   r   rL   rM   r   )r%   Úurlsr   r   r   rD   e   s    

þz_UIRenderer.get_auth_urlsc                 C   s   t j}t|tƒstdƒ‚|S )NzOAUTH2_CONFIG must be a dict)r   ZOAUTH2_CONFIGr"   Údictr   ©r%   r&   r   r   r   rA   m   s    z_UIRenderer.get_oauth2_config)NN)N)r   r*   r+   r,   r'   r-   r9   r#   r8   r   rD   rA   r   r   r   r   r5   ;   s   


r5   c                       s2   e Zd ZdZdZdZd	‡ fdd„	Zdd„ Z‡  ZS )
ÚSwaggerUIRendererz7Renders a swagger-ui web interface for schema browisng.zdrf-yasg/swagger-ui.htmlr:   Nc                    sd   t t| ƒ ||¡ |  ¡ }| dd ¡}t| dd¡ƒ}|rL|rL| |¡|d< tj|t	j
d�|d< d S )Nr7   Úoauth2RedirectUrlr6   r=   r   )ÚsuperrQ   r8   Úget_swagger_ui_settingsÚgetr   Zbuild_absolute_urir
   r@   r	   rB   )r%   r(   r:   Zswagger_ui_settingsr7   Zoauth_redirect_url©Ú	__class__r   r   r8   x   s    zSwaggerUIRenderer.set_contextc                 C   sv   |   tj¡tjtjtjtjtjtjtj	tj	tj
tjtjtjtjtjtjtjdœ}t|ƒ}tjdkrr|   tj¡|d< |S )N)ÚurlZoperationsSorterZ
tagsSorterZdocExpansionZdeepLinkingZshowExtensionsZdefaultModelRenderingZdefaultModelExpandDepthZdefaultModelsExpandDepthZshowCommonExtensionsrR   ZsupportedSubmitMethodsZdisplayOperationIdZpersistAuthZrefetchWithAuthZrefetchOnLogoutÚfetchSchemaWithQueryr6   ZvalidatorUrl)r   r   ÚSPEC_URLZOPERATIONS_SORTERZTAGS_SORTERZDOC_EXPANSIONZDEEP_LINKINGZSHOW_EXTENSIONSZDEFAULT_MODEL_RENDERINGZDEFAULT_MODEL_DEPTHZSHOW_COMMON_EXTENSIONSZOAUTH2_REDIRECT_URLZSUPPORTED_SUBMIT_METHODSZDISPLAY_OPERATION_IDZPERSIST_AUTHZREFETCH_SCHEMA_WITH_AUTHZREFETCH_SCHEMA_ON_LOGOUTÚFETCH_SCHEMA_WITH_QUERYr   ZVALIDATOR_URLrP   r   r   r   rT   ƒ   s,    
ï
z)SwaggerUIRenderer.get_swagger_ui_settings)N)	r   r*   r+   r,   r9   r2   r8   rT   Ú__classcell__r   r   rV   r   rQ   s   s
   rQ   c                       s2   e Zd ZdZdZdZd	‡ fdd„	Zdd„ Z‡  ZS )
ÚReDocRendererz2Renders a ReDoc web interface for schema browisng.zdrf-yasg/redoc.htmlZredocNc                    s.   t t| ƒ ||¡ tj|  ¡ tjd�|d< d S )Nr=   r   )rS   r]   r8   r
   r@   Úget_redoc_settingsr	   rB   rE   rV   r   r   r8   ¤   s    zReDocRenderer.set_contextc              	   C   s4   |   tj¡tjtjtjtjtjtjtj	dœ}t
|ƒS )N)rX   ZlazyRenderingZhideHostnameZexpandResponsesZpathInMiddlePanelZnativeScrollbarsZrequiredPropsFirstrY   )r   r   rZ   ZLAZY_RENDERINGZHIDE_HOSTNAMEZEXPAND_RESPONSESZPATH_IN_MIDDLEZNATIVE_SCROLLBARSZREQUIRED_PROPS_FIRSTr[   r   rP   r   r   r   r^   ¨   s    
øz ReDocRenderer.get_redoc_settings)N)	r   r*   r+   r,   r9   r2   r8   r^   r\   r   r   rV   r   r]   Ÿ   s
   r]   c                   @   s   e Zd ZdZdZdS )ÚReDocOldRendererz8Renders a ReDoc 1.x.x web interface for schema browisng.zdrf-yasg/redoc-old.htmlN)r   r*   r+   r,   r9   r   r   r   r   r_   ·   s   r_   N)"Zdjango.shortcutsr   Zdjango.template.loaderr   Zdjango.utils.encodingr   Zdjango.utils.functionalr   Zrest_framework.renderersr   r   r   Zrest_framework.utilsr	   r
   Zapp_settingsr   r   Úcodecsr   r   r   r0   r   Úutilsr   r   r/   r3   r4   r5   rQ   r]   r_   r   r   r   r   Ú<module>   s"   8,