a
    còfÌ  ã                   @   s^   d 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
 G dd„ dƒZG dd	„ d	eƒZd
S )zœ
Content negotiation deals with selecting an appropriate renderer given the
incoming request.  Typically this will be based on the request's Accept header.
é    ©ÚHttp404)Ú
exceptions)Úapi_settings)Ú
_MediaTypeÚmedia_type_matchesÚorder_by_precedencec                   @   s   e Zd Zdd„ Zddd„ZdS )ÚBaseContentNegotiationc                 C   s   t dƒ‚d S )Nz$.select_parser() must be implemented©ÚNotImplementedError)ÚselfÚrequestÚparsers© r   úW/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/rest_framework/negotiation.pyÚselect_parser   s    z$BaseContentNegotiation.select_parserNc                 C   s   t dƒ‚d S )Nz&.select_renderer() must be implementedr
   )r   r   Ú	renderersÚformat_suffixr   r   r   Úselect_renderer   s    z&BaseContentNegotiation.select_renderer)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r	      s   r	   c                   @   s2   e Zd ZeZdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚDefaultContentNegotiationc                 C   s$   |D ]}t |j|jƒr|  S qdS )z�
        Given a list of parsers and a media type, return the appropriate
        parser to handle the incoming request.
        N)r   Ú
media_typeÚcontent_type)r   r   r   Úparserr   r   r   r      s    
z'DefaultContentNegotiation.select_parserNc              
   C   sØ   | j j}|p|j |¡}|r(|  ||¡}|  |¡}t|ƒD ]Œ}|D ]‚}|D ]x}	t|j|	ƒrJt	|	ƒ}
t	|jƒj
|
j
kr®d |jftdd„ |
j ¡ D ƒƒ ¡}||f      S ||	f      S qJqBq:tj|d�‚dS )zq
        Given a request and a list of renderers, return a two-tuple of:
        (renderer, media type).
        ú;c                 s   s   | ]\}}d   ||¡V  qdS )z{}={}N©Úformat)Ú.0ÚkeyÚvaluer   r   r   Ú	<genexpr>C   s   ÿz<DefaultContentNegotiation.select_renderer.<locals>.<genexpr>)Zavailable_renderersN)ÚsettingsZURL_FORMAT_OVERRIDEZquery_paramsÚgetÚfilter_renderersÚget_accept_listr   r   r   r   Ú
precedenceÚjoinÚtupleÚparamsÚitemsr   ZNotAcceptable)r   r   r   r   Zformat_query_paramr   ZacceptsZmedia_type_setÚrendererr   Zmedia_type_wrapperZfull_media_typer   r   r   r   #   s0    

ÿÿþÿÿz)DefaultContentNegotiation.select_rendererc                    s   ‡ fdd„|D ƒ}|st ‚|S )zœ
        If there is a '.json' style format suffix, filter the renderers
        so that we only negotiation against those that accept that format.
        c                    s   g | ]}|j ˆ kr|‘qS r   r   )r   r,   r   r   r   Ú
<listcomp>U   s   
ÿz>DefaultContentNegotiation.filter_renderers.<locals>.<listcomp>r   )r   r   r   r   r   r   r%   P   s    z*DefaultContentNegotiation.filter_renderersc                 C   s"   |j  dd¡}dd„ | d¡D ƒS )zd
        Given the incoming request, return a tokenized list of media
        type strings.
        ZHTTP_ACCEPTz*/*c                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)r   Útokenr   r   r   r-   a   ó    z=DefaultContentNegotiation.get_accept_list.<locals>.<listcomp>ú,)ZMETAr$   Úsplit)r   r   Úheaderr   r   r   r&   [   s    z)DefaultContentNegotiation.get_accept_list)N)	r   r   r   r   r#   r   r   r%   r&   r   r   r   r   r      s
   

-r   N)Ú__doc__Zdjango.httpr   Zrest_frameworkr   Zrest_framework.settingsr   Zrest_framework.utils.mediatypesr   r   r   r	   r   r   r   r   r   Ú<module>   s   