
    ^f\                        d Z ddl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 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mZ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&m'Z' ddl(m)Z) ddl*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 d Z1 G d d          Z2 G d de2          Z3 G d de2          Z4 G d de4          Z5 G d de2          Z6 G d d e2          Z7 G d! d"e7          Z8 G d# d$e2          Z9 G d% d&e2          Z: G d' d(e2          Z; G d) d*e2          Z< G d+ d,          Z= G d- d.e=          Z> G d/ d0e=          Z? G d1 d2e2          Z@ G d3 d4e2          ZAdS )5a  
Renderers are used to serialize a response into specific media types.

They give us a generic way of being able to handle various media types
on the response, such as JSON encoded data or HTML output.

REST framework also provides an HTML renderer that renders the browsable API.
    N)OrderedDict)parse)forms)settings)ImproperlyConfigured)Page)enginesloader)NoReverseMatch)	mark_safe)VERSION
exceptionsserializersstatus)INDENT_SEPARATORSLONG_SEPARATORSSHORT_SEPARATORScoreapi
coreschemaparse_header_parameterspygments_cssyaml)
ParseError)is_form_media_typeoverride_method)api_settings)encodersjson)get_breadcrumbs)ClassLookupDictc                     | dk    rd n| S )Nr    )values    J/var/www/html/env/lib/python3.11/site-packages/rest_framework/renderers.pyzero_as_noner%   "   s    A::445(    c                   *    e Zd ZdZdZdZdZdZddZdS )BaseRendererz
    All renderers should extend this class, setting the `media_type`
    and `format` attributes, and override the `.render()` method.
    Nutf-8textc                      t          d          )Nz3Renderer class requires .render() to be implemented)NotImplementedError)selfdataaccepted_media_typerenderer_contexts       r$   renderzBaseRenderer.render0   s    !"WXXXr&   NN)	__name__
__module____qualname____doc__
media_typeformatcharsetrender_styler1   r"   r&   r$   r(   r(   &   sN          JFGLY Y Y Y Y Yr&   r(   c                   f    e Zd ZdZdZdZej        Ze	j
         Ze	j        Ze	j        ZdZd ZddZdS )JSONRendererz,
    Renderer which serializes to JSON.
    zapplication/jsonr   Nc           
         |rnt          |          \  }}	 t          t          t          t	          |d                   d          d                    S # t
          t          t          f$ r Y nw xY w|                    dd           S )Nindent   r   )	r   r%   maxminintKeyError
ValueError	TypeErrorget)r-   r/   r0   base_media_typeparamss        r$   
get_indentzJSONRenderer.get_indentE   s     	 '>>Q&R&R#OV#CCx0@,A,A1(E(Eq$I$IJJJj)4   
  ##Hd333s   =A A.-A.c                 L   |dS |pi }|                      ||          }|| j        rt          nt          }nt          }t          j        || j        || j        | j	         |          }|
                    dd          
                    dd          }|                                S )zB
        Render `data` into JSON, returning a bytestring.
        Nr&   )clsr>   ensure_ascii	allow_nan
separatorsu    z\u2028u    z\u2029)rI   compactr   r   r   r   dumpsencoder_classrL   strictreplaceencode)r-   r.   r/   r0   r>   rN   rets          r$   r1   zJSONRenderer.renderT   s     <3+1r!46FGG>-1\N))JJ*Jjd((9+o*
 
 
 kk(I..66xKKzz||r&   r2   )r3   r4   r5   r6   r7   r8   r   JSONEncoderrQ   r   UNICODE_JSONrL   COMPACT_JSONrO   STRICT_JSONrR   r9   rI   r1   r"   r&   r$   r<   r<   4   sw          $JF(M#00L'G%F G4 4 4     r&   r<   c                   J    e Zd ZdZdZdZdZddgZdZddZ	d	 Z
d
 Zd Zd ZdS )TemplateHTMLRenderera_  
    An HTML renderer for use with templates.

    The data supplied to the Response object should be a dictionary that will
    be used as context for the template.

    The template name is determined by (in order of preference):

    1. An explicit `.template_name` attribute set on the response.
    2. An explicit `.template_name` attribute set on this class.
    3. The return result of calling `view.get_template_names()`.

    For example:
        data = {'users': User.objects.all()}
        return Response(data, template_name='users.html')

    For pre-rendered HTML, see StaticHTMLRenderer.
    	text/htmlhtmlNz%(status_code)s.htmlzapi_exception.htmlr)   c                 t   |pi }|d         }|d         }|d         }|j         r|                     |          }n+|                     ||          }|                     |          }t	          | d          r|                     |||          }	n|                     ||          }	|                    |	|          S )aQ  
        Renders data to HTML, using Django's standard template rendering.

        The template name is determined by (in order of preference):

        1. An explicit .template_name set on the response.
        2. An explicit .template_name set on this class.
        3. The return result of calling view.get_template_names().
        viewrequestresponseresolve_contextr`   )	exceptionget_exception_templateget_template_namesresolve_templatehasattrrb   get_template_contextr1   )
r-   r.   r/   r0   r_   r`   ra   templatetemplate_namescontexts
             r$   r1   zTemplateHTMLRenderer.render   s     ,1r'"9-#J/ 	=228<<HH!44XtDDN,,^<<H4*++ 	H**4(CCGG//6FGGGw888r&   c                 *    t          j        |          S N)r
   select_template)r-   rk   s     r$   rg   z%TemplateHTMLRenderer.resolve_template   s    %n555r&   c                 8    |d         }|j         r
|j        |d<   |S )Nra   status_code)rd   rq   )r-   r.   r0   ra   s       r$   ri   z)TemplateHTMLRenderer.get_template_context   s)    #J/ 	7"*"6Dr&   c                     |j         r|j         gS | j         r| j         gS t          |d          r|                                S t          |d          r|j         gS t          d          )Nrf   template_namezaReturned a template response with no `template_name` attribute set on either the view or response)rs   rh   rf   r   )r-   ra   r_   s      r$   rf   z'TemplateHTMLRenderer.get_template_names   s    ! 	(*++ 	(&''T/00 	(**,,,T?++ 	(&''"o
 
 	
r&   c                     fd| j         D             }	 |                     |          S # t          $ rH dj        j                                        fz  }t          d                             |          }|cY S w xY w)Nc                 (    g | ]}|d j         iz  S rq   rv   ).0namera   s     r$   
<listcomp>z?TemplateHTMLRenderer.get_exception_template.<locals>.<listcomp>   s<     E E E" -1E!FF E E Er&   z%d %sdjango)exception_template_namesrg   	Exceptionrq   status_texttitler	   from_string)r-   ra   rk   bodyrj   s    `   r$   re   z+TemplateHTMLRenderer.get_exception_template   s    E E E E&*&CE E E	((888 	 	 	h2H4H4N4N4P4PQQDx(44T::HOOO		s   + AA=<A=r2   )r3   r4   r5   r6   r7   r8   rs   r{   r9   r1   rg   ri   rf   re   r"   r&   r$   r[   r[   p   s         $ JFM  G9 9 9 986 6 6  
 
 
    r&   r[   c                   &    e Zd ZdZdZdZdZddZdS )StaticHTMLRendereraV  
    An HTML renderer class that simply returns pre-rendered HTML.

    The data supplied to the Response object should be a string representing
    the pre-rendered HTML content.

    For example:
        data = '<html><body>example</body></html>'
        return Response(data)

    For template rendered HTML, see TemplateHTMLRenderer.
    r\   r]   r)   Nc                 .   |pi }|                     d          }|ry|j        rr|d         }|                     |          }t          | d          r|                     |||          }n|                     ||          }|                    ||          S |S )Nra   r`   rb   rc   )rF   rd   re   rh   rb   ri   r1   )r-   r.   r/   r0   ra   r`   rj   rl   s           r$   r1   zStaticHTMLRenderer.render   s    +1r#''
33 	=* 	=&y1G228<<Ht.// L..tWhGG33D:JKK??7G?<<<r&   r2   )r3   r4   r5   r6   r7   r8   r9   r1   r"   r&   r$   r   r      sC          JFG     r&   r   c            
          e Zd ZdZdZdZdZdZdZ e	i e
j        ddd	e
j        dd
d	e
j        ddd	e
j        ddd	e
j        ddd	e
j        ddd	e
j        ddd	e
j        ddd	e
j        ddd	e
j        ddie
j        ddie
j        ddie
j        ddie
j        ddie
j        ddie
j        ddie
j        ddie
j        ddie
j        ddie
j        ddii          Zd Z ddZ!dS )HTMLFormRendererai  
    Renderers serializer data into an HTML form.

    If the serializer was instantiated without an object then this will
    return an HTML form not bound to any object,
    otherwise it will return an HTML form with the appropriate initial data
    populated from the object.

    Note that rendering of field and form errors is not currently supported.
    r\   formr)   zrest_framework/vertical/z	form.htmlz
input.htmlr*   )base_template
input_typeemailurlnumberdatetime-localdatetimefiler   zcheckbox.htmlzselect.htmlzselect_multiple.htmlzfieldset.htmlzlist_fieldset.htmlzlist_field.htmlzdict_field.htmlztextarea.htmlc                    t          |j        t          j                  rdS | j        |                                         }|                    |j                   d|vr|                    d| j	                  |d<   | |d<   |
                                }|                    d          dk    r9t          |j        t                    r|j                            d          |_        d|v r	|d         }n'|d                             d          dz   |d	         z   }t          j        |          }||d
}|                    |          S )N template_packrendererr   r   Zrj   /r   )fieldstyle)
isinstance_fieldr   HiddenFielddefault_stylecopyupdater   rF   r   as_form_fieldr#   strrstripstripr
   get_templater1   )r-   r   parent_styler   rs   rj   rl   s          r$   render_fieldzHTMLFormRenderer.render_fieldG  s>   elK$;<< 	2"5)..00U[!!!%''%1%5%5otGY%Z%ZE/" j ##%%99\""&666:ekSV;W;W6+,,S11EK!*-MM!/288==CeOF\\M&}55!E22w'''r&   Nc                    |pi }|j         }|                    di           }d|vr
| j        |d<   | |d<   |d                             d          }|dz   | j        z   }t          j        |          }||d}	|                    |	          S )zN
        Render serializer data and return an HTML form, as a string.
        r   r   r   r   )r   r   )
serializerrF   r   r   r   r
   r   r1   )
r-   r.   r/   r0   r   r   r   rs   rj   rl   s
             r$   r1   zHTMLFormRenderer.render`  s     ,1r $$Wb11%''%)%7E/" jo.44S99%+d.@@&}55
 
 w'''r&   r2   )"r3   r4   r5   r6   r7   r8   r9   r   r   r    r   Field
EmailFieldURLFieldIntegerField
FloatFieldDateTimeField	DateField	TimeField	FileFieldBooleanFieldChoiceFieldMultipleChoiceFieldRelatedFieldManyRelatedField
SerializerListSerializer	ListField	DictFieldFilePathField	JSONFieldr   r   r1   r"   r&   r$   r   r      s       	 	 JFG.MM#O F%) 
 
F%
 	)!!
 !
F% 	)
 
F% 	 )"#
 #
F%" 	)"!
 !
#F%* 	!)*$
 $
+F%2 	)  
  
3F%: 	)  
  
;F%B 	)  
  
CF%J 	 _#
KF%P 	]"
QF%V 	'3*
WF%\ 	 ]#
]F%b 	$3'
cF%h 	_!
iF%n 	"1%
oF%t 	. 
uF%z 	. 
 	!]$
 	_ 
GF% F% F FMP( ( (2( ( ( ( ( (r&   r   c                       e Zd ZdZdZdZdZdZdZdZ	e
Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZdS )BrowsableAPIRendererz6
    HTML renderer used to self-document the API.
    r\   apizrest_framework/api.htmlz rest_framework/filters/base.htmlemacsr)   c                     d |j         D             }d |D             }|sdS |r |d                     S  |d                     S )zs
        Return an instance of the first valid renderer.
        (Don't use another documenting renderer.)
        c                 <    g | ]}t          |t                    |S r"   )
issubclassr   rw   r   s     r$   ry   z=BrowsableAPIRenderer.get_default_renderer.<locals>.<listcomp>  s>     H H H(&x1EFFHX H H Hr&   c                 2    g | ]}t          |d           |S )rf   )rh   r   s     r$   ry   z=BrowsableAPIRenderer.get_default_renderer.<locals>.<listcomp>  s>     "R "R "Rx)0;O)P)P"R( "R "R "Rr&   Nr   )renderer_classes)r-   r_   	renderersnon_template_rendererss       r$   get_default_rendererz)BrowsableAPIRenderer.get_default_renderer  s    
H Hd.C H H H	"R "R9 "R "R "R  	/4# 	/,)!,...y|~~r&   c                    |sdS d|d<   |                     |||          }t          |dd          }|dv sJ d|z              |dk    rd	t          |          z  S t          |t                    r|                    d
          n|S )zm
        Get the content as if it had been rendered by the default
        non-documenting renderer.
        z[No renderers were found]   r>   r:   r*   )r*   binaryz7Expected .render_style "text" or "binary", but got "%s"r   z[%d bytes of binary content]r)   )r1   getattrlenr   bytesdecode)r-   r   r.   r/   r0   contentr:   s          r$   get_contentz BrowsableAPIRenderer.get_content  s      	/..%&"//$(;=MNNx@@1111 4/1=4>1118##1CLL@@*4We*D*DQw~~g&&&'Qr&   c                     ||j         vrdS 	 |                    |           ||                    ||           n# t          j        $ r Y dS w xY wdS )zI
        Returns True if a form should be shown for this method.
        NFT)allowed_methodscheck_permissionscheck_object_permissionsr   APIException)r-   r_   methodr`   objs        r$   show_form_for_methodz)BrowsableAPIRenderer.show_form_for_method  sv     ---F	""7+++--gs;;;& 	 	 	55	ts   -; AAc                 .    || j         |d|d<    ||i |S )N)r`   r8   r_   rl   r8   )r-   serializer_classview_instancer`   argskwargss         r$   _get_serializerz$BrowsableAPIRenderer._get_serializer  s6    k!
 
y
  0000r&   c                    t          |dd          }|r:t          |dd          s)t          |dd          }t          |t                    rd}nd}|j        |k    r"| 	 d|j        i}n# t
          $ r i }Y nw xY w|}ni }d}t          |||          5 }|                     ||||          s	 ddd           dS |dv r	 ddd           dS t          |d	d          }	t          |d
d          }
|	s|
rt          d |j	        D                       s	 ddd           dS |2	 | 
                    |          cddd           S # t          $ r Y nw xY w|	r"|dv r |j        dd|i|}n? |j        di |}n1|dv r | j        |j        ||fd|i|}n | j        |j        ||fi |}| 
                    |          cddd           S # 1 swxY w Y   dS )z
        Return a string representing a rendered HTML form, possibly bound to
        either the input or output data.

        In the absence of the View having an associated form then return None.
        r   NmanyFinstancer.   )DELETEOPTIONSTget_serializerr   c              3   >   K   | ]}t          |j                  V  d S rn   )r   r7   rw   parsers     r$   	<genexpr>z>BrowsableAPIRenderer.get_rendered_html_form.<locals>.<genexpr>  s.      ``&*6+<==``````r&   PUTPATCHr"   )r   r   r   r   r.   r   r   r   anyparser_classesrender_form_for_serializerrE   r   r   r   )r-   r.   r_   r   r`   r   r   r   existing_serializerhas_serializerhas_serializer_classs              r$   get_rendered_html_formz+BrowsableAPIRenderer.get_rendered_html_form  s~    T<66
 	gj&%@@ 	z:t<<H(D))  H
 >V##
(> ',/   ",F"&T7F33 $	?w,,T67HMM $	? $	? $	? $	? $	? $	? $	? $	? ...$	? $	? $	? $	? $	? $	? $	? $	? %T+;TBBN#*41CT#J#J  $,@``DL_````` $	? $	? $	? $	? $	? $	? $	? $	?  #.::;NOO%$	? $	? $	? $	? $	? $	? $	? $	?& !   D  I---!4!4!Q!Qh!Q&!Q!QJJ!4!4!>!>v!>!>JJ ---!5!5d6KT6="\ "\HP"\TZ"\ "\JJ "6!5d6KT6="I "IAG"I "IJ 22:>>I$	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	? $	?sV   	A( (A76A7G9GAGG E
EGEA,GGGc                     t          |d          r|                                 |                                 }|                    |j        | j        dddii          S )Ninitial_datar   r   zrest_framework/horizontal)rh   is_validform_renderer_classr1   r.   r/   )r-   r   form_renderers      r$   r   z/BrowsableAPIRenderer.render_form_for_serializer   sh    :~.. 	"!!!0022##O$(CDE
 
 	
r&   c                 &   t          |dd          }|r:t          |dd          s)t          |dd          }t          |t                    rd}nd}t          |||          5 }|                     ||||          s	 ddd           dS |j        d         }t          |dd          }t          |d          r|r|d	v r|                    |
          }n|                                } |            }	| j        }
| j	        
                                }d|d<   |j        
                                }|j                                        D ]5\  }}t          |t          j                  r|                    |d           6|	                    ||
|                                          ndd |j        D             }d |D             |d          G fddt&          j                  } |            cddd           S # 1 swxY w Y   dS )z
        Returns a form that allows for arbitrary content types to be tunneled
        via standard HTML forms.
        (Which are typically application/x-www-form-urlencoded)
        r   Nr   Fr   r   renderer_classr   r   )r   r   r>   c                     g | ]	}|j         
S r"   )r7   r   s     r$   ry   z:BrowsableAPIRenderer.get_raw_data_form.<locals>.<listcomp>>  s    OOO6,OOOr&   c                     g | ]}||fS r"   r"   )rw   r7   s     r$   ry   z:BrowsableAPIRenderer.get_raw_data_form.<locals>.<listcomp>?  s    NNNJ
J/NNNr&   c            	           e Zd Z ej        d  ej        ddi                    Z ej        d ej        ddi          d	          Z	d
S )BBrowsableAPIRenderer.get_raw_data_form.<locals>.GenericContentFormz
Media typezdata-overridezcontent-type)attrs)labelchoicesinitialwidgetContentr   F)r   r  r  requiredN)
r3   r4   r5   r   r   Select_content_type	CharFieldTextarea_content)r  r   r  s   r$   GenericContentFormr   B  s         1 1&##'5<.OPPP	! ! ! +5?#)5>)0LMMM#"	  r&   r  )r   r   r   r   r   r   rh   r   r/   r0   r   r.   fieldsitemsr   r   popr1   r   r   Form)r-   r.   r_   r   r`   r   r   default_parserr   r   acceptedrl   rx   r   media_typesr  r  r   r  s                   @@@r$   get_raw_data_formz&BrowsableAPIRenderer.get_raw_data_form  s    T<66
 	gj&%@@ 	z:t<<H(D))  HT7F33 6	(w,,T67HMM 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( "03N$^5EtLLNt-.. >  ---!%!4!4h!4!G!GJJ!%!4!4!6!6J *>++3/4466$%! "++--#-#4#:#:#<#< - -KD%!%)@AA -t,,,"//$'BB!..** PO4;NOOOKNN+NNNG!!nG        UZ    &%''m6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	( 6	(s   $HE.HH
H
c                 *    |                                 S rn   )get_view_name)r-   r_   s     r$   get_namezBrowsableAPIRenderer.get_nameR  s    !!###r&   c                 f    |t           j        t           j        fv rdS |                    d          S )Nr   T)r]   )r   HTTP_401_UNAUTHORIZEDHTTP_403_FORBIDDENget_view_descriptionr-   r_   rq   s      r$   get_descriptionz$BrowsableAPIRenderer.get_descriptionU  s4    679RSSS2((d(333r&   c                 ,    t          |j        |          S rn   )r   path)r-   r`   s     r$   r   z$BrowsableAPIRenderer.get_breadcrumbsZ  s    w|W555r&   c                     |t           j        t           j        fv rd S t          |d          sd S |                                S )Nget_extra_action_url_map)r   r  r  rh   r   r  s      r$   get_extra_actionsz&BrowsableAPIRenderer.get_extra_actions]  sG    F8&:STTT49:: 	4,,...r&   c                 `   t          |d          rt          |d          sd S t          |dd           }t          |t                    rnJ|1|/	 |                    |           n/# t
          t          f$ r Y d S w xY wt          |t                    sd S |                                }g }|j        D ]H}t          |d          r6 |            	                    |||          }|r|
                    |           I|sd S t          j        | j                  }	d|i}
|	                    |
          S )Nget_querysetfilter_backends	paginatorto_htmlelements)rh   r   r   listget_resultsrE   rC   r#  r$  r&  appendr
   r   filter_templater1   )r-   r.   r_   r`   r%  querysetr'  backendr]   rj   rl   s              r$   get_filter_formz$BrowsableAPIRenderer.get_filter_forme  sf   t^,, 	GDBS4T4T 	F D+t44	dD!! 	"t'7%%d++++x(   D$'' 	F$$&&+ 	* 	*Gw	** *wyy(((DAA *OOD))) 	F&t';<<x(w'''s   A% %A:9A:c                 X   |d         }|d         }|d         }|                      |          }|                     ||d|          }|                     ||d|          }	|                     ||d|          }
|	p|
}t          t          |                                                    }d}|rd|j        z  }|j        r|d	|j        z  z  }||d
<   t          |dd          r|j        j	        r|j        }nd}t          j        }t          j        }|                    d          r
|dd         }|                    dd          }i d|                     ||||          dt!          | j                  d|d|d|d|j        d|                     ||j                  d|                     |          dt,          d|d|                     |          d|j        dd |j        D             d|d|                     ||d|          d|                     ||d|          d|                     ||d|          |                     ||d |          |                     ||j                  |                     |||          |	||
|t;          |j        d!k              t<          ||d"S )#z5
        Returns the context used to render.
        r_   r`   ra   POSTr   r   r   z%sz ;%szContent-Typer%  NHTTP_   _-r   
code_styleuserdescriptionrx   versionbreadcrumblistr   available_formatsc                     g | ]	}|j         
S r"   r   )rw   renderer_clss     r$   ry   z4BrowsableAPIRenderer.get_context.<locals>.<listcomp>  s    !`!`!`,,"5!`!`!`r&   response_headersput_form	post_formdelete_formr   r   i  )options_formextra_actionsfilter_formraw_data_put_formraw_data_post_formraw_data_patch_formraw_data_put_or_patch_formdisplay_edit_formsr   csrf_cookie_namecsrf_header_name)r   r  r   sortedr  r7   r9   r   r%  display_page_controlsr   CSRF_COOKIE_NAMECSRF_HEADER_NAME
startswithrS   r   r   r5  r6  r  rq   r  r   r   r   r   r   r!  r.  boolr   )r-   r.   r/   r0   r_   r`   ra   r   rE  rD  rF  rG  r=  renderer_content_typer%  rI  rJ  s                    r$   get_contextz BrowsableAPIRenderer.get_context  s`     '"9-#J/,,T22!33D$PP 224ugNN"44T4'RR%6%M:M"&vhnn.>.>'?'?@@ " 	C$(8+>$>! C%(2B)BB%+@(4d++ 	0T 	III#4#4&&w// 	4/3+33C==#
t''$8KM]^^#
,t77#
 D#
 w	#

 #
 GL#
 4//h6JKK#
 DMM$''#
 w#
 #
 d227;;#
 t3#
  !`!`$J_!`!`!`#
  0#
  33D$wOO!#
" 44T4QQ##
$ 466tT8WUU%#
& !77dIwWW!33D(:NOO//dGDD!2"4#6*D"&x';s'B"C"C( 0 0E#
 #
 #
 #	
r&   Nc                     |pd| _         |pi | _        t          j        | j                  }|                     |||          }|                    ||d                   }|d         }|j        t          j	        k    rt          j
        |_        |S )G
        Render the HTML for the browsable API representation.
        r   r`   rc   ra   )r/   r0   r
   r   rj   rR  r1   rq   r   HTTP_204_NO_CONTENTHTTP_200_OK)r-   r.   r/   r0   rj   rl   rU   ra   s           r$   r1   zBrowsableAPIRenderer.render  s     $7#<"  0 6B&t}55""4)<>NOOoog/?	/JoKK
 $J/6#===#)#5H 
r&   r2   )r3   r4   r5   r6   r7   r8   rj   r+  r5  r9   r   r   r   r   r   r   r   r   r  r  r  r   r!  r.  rR  r1   r"   r&   r$   r   r   v  s*         JF(H8OJG*   R R R(  1 1 1A? A? A?F	
 	
 	
E( E( E(N$ $ $4 4 4
6 6 6/ / /( ( (>E
 E
 E
N     r&   r   c                   4     e Zd ZdZdZddZ fdZd Z xZS )AdminRendererzrest_framework/admin.htmladminNc                    |pd| _         |pi | _        |d         }|d         }| j        d         }|j        t          j        k    r|                     |||j        |          | _        ddd                    |j        d          | _	        t          ||d	          5 } |j        |g|j        R i |j        }d d d            n# 1 swxY w Y   |j        }t          j        | j                  }|                     |||          }|                    ||d         
          }	|j        t          j        k    r.d|v r*t          j        |_        |                                |d<   d}	|j        t          j        k    rSt          j        |_        	 |                     |          d         d         |d<   n# t0          $ r |j        |d<   Y nw xY wd}	|	S )Nr   ra   r`   r_   CreateEdit)r0  r   ErrorsGETrc   Location   )r/   r0   rq   r   HTTP_400_BAD_REQUESTr   r   
error_formrF   error_titler   r   r   r.   r
   r   rj   rR  r1   HTTP_201_CREATEDHTTP_303_SEE_OTHERbuild_absolute_urirU  r   rC   	full_path)
r-   r.   r/   r0   ra   r`   r_   rj   rl   rU   s
             r$   r1   zAdminRenderer.render  s:   #6#<"  0 6B#J/"9-$V,6#>>> #99$gnV]^^DO(0@@DDW^U]^^D w66 H'#48GGdiGGG4;GGH H H H H H H H H H H H H H H=D&t}55""4)<>NOOoog/?	/JoKK 6#:::zX?U?U#)#<H #*#=#=#?#?HZ C6#===#)#<H 9'+';';G'D'DR'H'K$$ 9 9 9'.'8$$$9 C
s$   CC
C$F1 1GGc                    t                                          |||          }t          |d         dd          }|2|0	 |                    |          }n# t          t
          f$ r |}Y nw xY w|}|i }d}n(t          |t                    r|r|d         ni }d}n|}d}d |D             }	d |D             }
t          |t                    r=d|v r9|D ]6}|                     ||d                   }||	                    d	|           7||d
<   |	|d<   |
|d<   ||d<   t          | dd          |d<   t          | dd          |d<   |S )rT  r_   r%  Ndetailr   r(  c                     g | ]
}|d k    |S r   r"   rw   keys     r$   ry   z-AdminRenderer.get_context.<locals>.<listcomp>'      9993C5LL3LLLr&   c                     g | ]
}|d k    |S rl  r"   rm  s     r$   ry   z-AdminRenderer.get_context.<locals>.<listcomp>(  ro  r&   r   r   columnsdetailsresultsrc  rd  )
superrR  r   r)  rE   rC   r   r(  get_result_url
setdefault)r-   r.   r/   r0   rl   r%  rs  headerr   rq  rr  resultr   	__class__s                r$   rR  zAdminRenderer.get_context  s    ''%%%'7
 
 GFO[$??	 T%5#//55x(    G?FEE&& 	#*2WQZZFEEFE99&99999&999gt$$ 	23C)C)C! 2 2))&'&/BB?%%eS111 $	$	$	 'lD A A!(}d!C!Cs   A A-,A-c                     t          |d          rt          |d          sdS |j        }t          |dd          p|}	 |||         i}|                    d|          S # t          t
          f$ r Y dS w xY w)z
        Attempt to reverse the result's detail view URL.

        This only works with views that are generic-like (has `.lookup_field`)
        and viewset-like (has `.basename` / `.reverse_action()`).
        reverse_actionlookup_fieldNlookup_url_kwargrj  )r   )rh   r|  r   r{  rC   r   )r-   rx  r_   r|  r}  r   s         r$   ru  zAdminRenderer.get_result_url8  s     t-.. 	t^,,	F("4);TBBRl	&|(<=F&&x&???.) 	 	 	FF	s    A A43A4r2   )	r3   r4   r5   rj   r8   r1   rR  ru  __classcell__)ry  s   @r$   rX  rX    sg        *HF& & & &P* * * * *X      r&   rX  c                   <    e Zd ZdZdZdZdZdZdZg dZ	d Z
dd
Zd	S )DocumentationRendererr\   r]   r)   zrest_framework/docs/index.htmlzrest_framework/docs/error.htmlr   )shell
javascriptpythonc                 ~    || j         d | j         D             d | j         D             t          | j                  |dS )Nc                     g | ]}d |z  S )z!rest_framework/docs/langs/%s.htmlr"   rw   languages     r$   ry   z5DocumentationRenderer.get_context.<locals>.<listcomp>Z  s    iiih>Iiiir&   c                     g | ]}d |z  S )z'rest_framework/docs/langs/%s-intro.htmlr"   r  s     r$   ry   z5DocumentationRenderer.get_context.<locals>.<listcomp>[  s     u u uZb!JX!U u u ur&   )documentlangs
lang_htmlslang_intro_htmlsr5  r`   )	languagesr   r5  )r-   r.   r`   s      r$   rR  z!DocumentationRenderer.get_contextV  sS    ^iiZ^Zhiii u ufjft u u u&t77
 
 	
r&   Nc                    t          |t          j                  rRt          j        | j                  }|                     ||d                   }|                    ||d                   S t          j        | j                  }||d         |d         t          j
        d}|                    ||d                   S )Nr`   rc   ra   )r.   r`   ra   debug)r   r   Documentr
   r   rj   rR  r1   error_templater   DEBUG)r-   r.   r/   r0   rj   rl   s         r$   r1   zDocumentationRenderer.render`  s    dG,-- 	Q*4=99H&&t-=i-HIIG??74DY4O?PPP*4+>??H+I6,Z8!	 G ??74DY4O?PPPr&   r2   )r3   r4   r5   r7   r8   r9   rj   r  r5  r  rR  r1   r"   r&   r$   r  r  M  sf        JFG/H5NJ111I
 
 
Q Q Q Q Q Qr&   r  c                   &    e Zd ZdZdZdZdZddZdS )SchemaJSRendererzapplication/javascriptr  r)   zrest_framework/schema.jsNc                 D   t           j                                        }t          j        |                    |                                        d          }t          j        | j	                  }dt          |          i}|d         }|                    ||          S )Nasciischemar`   rc   )r   codecsCoreJSONCodecbase64	b64encoderT   r   r
   r   rj   r   r1   )	r-   r.   r/   r0   codecr  rj   rl   r`   s	            r$   r1   zSchemaJSRenderer.renderv  s    ,,..!%,,t"4"455<<WEE&t}55Yv../"9-w888r&   r2   )r3   r4   r5   r7   r8   r9   rj   r1   r"   r&   r$   r  r  p  s<        )JFG)H9 9 9 9 9 9r&   r  c                   &    e Zd ZdZdZdZdZddZdS )MultiPartRendererz,multipart/form-data; boundary=BoUnDaRyStRiNg	multipartr)   BoUnDaRyStRiNgNc                     ddl m} t          |d          r<|                                D ]'\  }}t	          |t
                    rJ d|z              ( || j        |          S )Nr   )encode_multipartr  zTest data contained a dictionary value for key '%s', but multipart uploads do not support nested data. You may want to consider using format='json' in this test case.)django.test.clientr  rh   r  r   dictBOUNDARY)r-   r.   r/   r0   r  rn  r#   s          r$   r1   zMultiPartRenderer.render  s    7777774!! 	"jjll  
U%eT22  ! $'' 2   t444r&   r2   )r3   r4   r5   r7   r8   r9   r  r1   r"   r&   r$   r  r    s<        ?JFGH5 5 5 5 5 5r&   r  c                   (    e Zd ZdZdZdZd ZddZdS )CoreJSONRendererzapplication/coreapi+jsonNcorejsonc                 (    t           s
J d            d S )Nz7Using CoreJSONRenderer, but `coreapi` is not installed.r   r-   s    r$   __init__zCoreJSONRenderer.__init__  s    QQQQQwQQr&   c                     t          |                    dd                    }t          j                                        }|                    ||          S )Nr>   r   )r>   )rP  rF   r   r  r  dump)r-   r.   r7   r0   r>   r  s         r$   r1   zCoreJSONRenderer.render  sI    &**8Q7788,,..zz$vz...r&   r2   r3   r4   r5   r7   r9   r8   r  r1   r"   r&   r$   r  r    sI        +JGFR R R/ / / / / /r&   r  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )_BaseOpenAPIRendererc                 ,   t           j        dt           j        dt           j        dt           j        dt           j        dt           j        di}i }|j        |v r||j                 |d<   |j        |d<   |j	        |d	<   t          |d
          r
|j        |d
<   |S )Nobjectarrayr   integerstringbooleantyper~   r7  enum)r   ObjectArrayNumberIntegerStringBooleanry  r~   r7  rh   r  )r-   r   CLASS_TO_TYPENAMEr  s       r$   
get_schemaz_BaseOpenAPIRenderer.get_schema  s    xgx	x	
 !222.x/ABF6N".w ( 4}8V$$ 	+%]F6Nr&   c                     g }|j         D ]q}|j        dvr|j        |j        d}|j        rd|d<   |j        r
|j        |d<   |j        r|                     |j                  |d<   |                    |           r|S )N)r  query)rx   inTr  r7  r  )r  locationrx   r  r7  r  r  r*  )r-   link
parametersr   	parameters        r$   get_parametersz#_BaseOpenAPIRenderer.get_parameters  s    
[ 	) 	)E~%666
n I ~ -(,	*%  =+0+<	-(| D&*ooel&C&C	(#i((((r&   c                     |r|d|n|}|                      |          }d|i}|j        r
|j        |d<   |j        r
|j        |d<   |r||d<   |r|g|d<   |S )Nr3  operationIdsummaryr7  r  tags)r  r~   r7  )r-   r  rx   tagoperation_idr  	operations          r$   get_operationz"_BaseOpenAPIRenderer.get_operation  s    03=###tt,,((..
 <
	 : 	.#':Ii  	8'+'7Im$ 	1&0Il# 	&!$Ifr&   c                    i }d }|j                                         D ]s\  }}t          j        |j                  j        }|j                                        }|                    |i            | 	                    |||          ||         |<   t|j
                                        D ]\  }}|j                                         D ]s\  }}t          j        |j                  j        }|j                                        }|                    |i            | 	                    |||          ||         |<   t|S )N)r  )linksr  r   urlparser   r  actionlowerrv  r  r.   )	r-   r  pathsr  rx   r  r  r   sections	            r$   	get_pathsz_BaseOpenAPIRenderer.get_paths  sH   "...00 	J 	JJD$>$(++0D[&&((FT2&&&"&"4"4T4S"4"I"IE$K$M//11 	N 	NLC%m1133 N N
d~dh//4**,,  r***&*&8&8t&8&M&MdF##	N r&   c                 b    dd|j         |j        dd|j        ig|                     |          dS )Nz3.0.0r   )r8  r~   r7  r   )openapiinfoserversr  )r~   r7  r   r  r-   r.   s     r$   get_structurez"_BaseOpenAPIRenderer.get_structure  sP    #/  tx  ^^D))
 
 	
r&   N)r3   r4   r5   r  r  r  r  r  r"   r&   r$   r  r    s_          &  $  "  &
 
 
 
 
r&   r  c                   (    e Zd ZdZdZdZd ZddZdS )CoreAPIOpenAPIRendererapplication/vnd.oai.openapiNr  c                 J    t           s
J d            t          s
J d            d S )Nz=Using CoreAPIOpenAPIRenderer, but `coreapi` is not installed.z<Using CoreAPIOpenAPIRenderer, but `pyyaml` is not installed.)r   r   r  s    r$   r  zCoreAPIOpenAPIRenderer.__init__   s0    WWWWWwSSSSStSSr&   c                 |    |                      |          }t          j        |d                                          S )NF)default_flow_style)r  r   r  rT   r-   r.   r7   r0   	structures        r$   r1   zCoreAPIOpenAPIRenderer.render  s6    &&t,,	yu===DDFFFr&   r2   r  r"   r&   r$   r  r    sO        .JGFT T TG G G G G Gr&   r  c                   8    e Zd ZdZdZdZej         Zd Z	ddZ
dS )CoreAPIJSONOpenAPIRenderer application/vnd.oai.openapi+jsonNopenapi-jsonc                 (    t           s
J d            d S )NzAUsing CoreAPIJSONOpenAPIRenderer, but `coreapi` is not installed.r  r  s    r$   r  z#CoreAPIJSONOpenAPIRenderer.__init__  s    [[[[[w[[r&   c                     |                      |          }t          j        |d| j                                      d          S )Nr   )r>   rL   r)   )r  r   rP   rL   rT   r  s        r$   r1   z!CoreAPIJSONOpenAPIRenderer.render  sD    &&t,,	za*, , ,,2F7OO	<r&   r2   )r3   r4   r5   r7   r9   r8   r   rW   rL   r  r1   r"   r&   r$   r  r  	  sT        3JGF#00L\ \ \< < < < < <r&   r  c                   (    e Zd ZdZdZdZd ZddZdS )OpenAPIRendererr  Nr  c                 (    t           s
J d            d S )Nz5Using OpenAPIRenderer, but `pyyaml` is not installed.)r   r  s    r$   r  zOpenAPIRenderer.__init__  s    LLLLLtLLr&   c                      G d dt           j                  }t          j        |dd|                              d          S )Nc                       e Zd Zd ZdS )&OpenAPIRenderer.render.<locals>.Dumperc                     dS )NTr"   r  s     r$   ignore_aliasesz5OpenAPIRenderer.render.<locals>.Dumper.ignore_aliases$  s    tr&   N)r3   r4   r5   r  r"   r&   r$   Dumperr  #  s#            r&   r  F)r  	sort_keysr  r)   )r   r  r  rT   )r-   r.   r7   r0   r  s        r$   r1   zOpenAPIRenderer.render!  sY    	 	 	 	 	T[ 	 	 	 y%5QWXXX__`ghhhr&   r2   r  r"   r&   r$   r  r    sO        .JGFM M Mi i i i i ir&   r  c                   @    e Zd ZdZdZej        ZdZe	j
         ZddZdS )JSONOpenAPIRendererr  Nr  c                 l    t          j        || j        d| j                                      d          S )N   )rK   r>   rL   r)   )r   rP   rQ   rL   rT   )r-   r.   r7   r0   s       r$   r1   zJSONOpenAPIRenderer.render0  s6    zd(*, , ,,2F7OO	<r&   r2   )r3   r4   r5   r7   r9   r   rV   rQ   r8   r   rW   rL   r1   r"   r&   r$   r  r  )  sJ        3JG(MF#00L< < < < < <r&   r  )Br6   r  collectionsr   urllibr   rz   r   django.confr   django.core.exceptionsr   django.core.paginatorr   django.templater	   r
   django.urlsr   django.utils.htmlr   rest_frameworkr   r   r   r   rest_framework.compatr   r   r   r   r   r   r   r   rest_framework.exceptionsr   rest_framework.requestr   r   rest_framework.settingsr   rest_framework.utilsr   r    rest_framework.utils.breadcrumbsr   "rest_framework.utils.field_mappingr    r%   r(   r<   r[   r   r   r   rX  r  r  r  r  r  r  r  r  r  r"   r&   r$   <module>r     s     # # # # # #                         7 7 7 7 7 7 & & & & & & + + + + + + + + & & & & & & ' ' ' ' ' ' C C C C C C C C C C C C                    1 0 0 0 0 0 F F F F F F F F 0 0 0 0 0 0 / / / / / / / / < < < < < < > > > > > >) ) )Y Y Y Y Y Y Y Y9 9 9 9 9< 9 9 9xY Y Y Y Y< Y Y Yz    -   BE( E( E( E( E(| E( E( E(Pg g g g g< g g gTj j j j j( j j jZ Q  Q  Q  Q  QL  Q  Q  QF9 9 9 9 9| 9 9 9 5 5 5 5 5 5 5 5(/ / / / /| / / /V
 V
 V
 V
 V
 V
 V
 V
rG G G G G1 G G G< < < < <!5 < < < i i i i il i i i 
< 
< 
< 
< 
<, 
< 
< 
< 
< 
<r&   