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,