
    _}dgO                        d Z ddlZddl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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mZmZ ddl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l0m1Z1 ddl2m3Z3 d Z4 G d d          Z5 G d de5          Z6 G d de5          Z7 G d de7          Z8 G d de5          Z9 G d  d!e5          Z: G d" d#e:          Z; G d$ d%e5          Z< G d& d'e5          Z= G d( d)e5          Z> G d* d+e5          Z? G d, d-          Z@ G d. d/e@          ZA G d0 d1e@          ZB G d2 d3e5          ZC G d4 d5e5          ZDdS )6a  
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)parse)forms)settings)ImproperlyConfigured)Page)enginesloader)NoReverseMatch)	mark_safe)parse_header_parameters)
SafeString)VERSION
exceptionsserializersstatus)INDENT_SEPARATORSLONG_SEPARATORSSHORT_SEPARATORScoreapi
coreschema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    W/var/www/surfInsights/venv3-11/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.render4   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                 L   |rt          |          \  }}t          j        t          t          t
                    5  t          t          t          t          |d                   d          d                    cd d d            S # 1 swxY w Y   |
                    dd           S )Nindent   r   )r   
contextlibsuppressKeyError
ValueError	TypeErrorr%   maxminintget)r-   r/   r0   base_media_typeparamss        r$   
get_indentzJSONRenderer.get_indentI   s     	K '>>Q&R&R#OV$Xz9EE K K#CCx0@,A,A1(E(Eq$I$IJJK K K K K K K K K K K K K K K K  ##Hd333s   >BB	B	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)rK   compactr   r   r   r   dumpsencoder_classrN   strictreplaceencode)r-   r.   r/   r0   r>   rP   rets          r$   r1   zJSONRenderer.renderU   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   JSONEncoderrS   r   UNICODE_JSONrN   COMPACT_JSONrQ   STRICT_JSONrT   r9   rK   r1   r"   r&   r$   r<   r<   8   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rb   )	exceptionget_exception_templateget_template_namesresolve_templatehasattrrd   get_template_contextr1   )
r-   r.   r/   r0   ra   rb   rc   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-   rm   s     r$   ri   z%TemplateHTMLRenderer.resolve_template   s    %n555r&   c                 8    |d         }|j         r
|j        |d<   |S )Nrc   status_code)rf   rs   )r-   r.   r0   rc   s       r$   rk   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          )Nrh   template_namezaReturned a template response with no `template_name` attribute set on either the view or response)ru   rj   rh   r   )r-   rc   ra   s      r$   rh   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 rs   rx   ).0namerc   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_namesri   	Exceptionrs   status_texttitler   from_string)r-   rc   rm   bodyrl   s    `   r$   rg   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   ru   r}   r9   r1   ri   rk   rh   rg   r"   r&   r$   r]   r]   q   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 )Nrc   rb   rd   re   )rH   rf   rg   rj   rd   rk   r1   )r-   r.   r/   r0   rc   rb   rl   rn   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   Zrl   /r   )fieldstyle)
isinstance_fieldr   HiddenFielddefault_stylecopyupdater   rH   r   as_form_fieldr#   strrstripstripr	   get_templater1   )r-   r   parent_styler   ru   rl   rn   s          r$   render_fieldzHTMLFormRenderer.render_fieldH  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   )
serializerrH   r   r   r   r	   r   r1   )
r-   r.   r/   r0   r   r   r   ru   rl   rn   s
             r$   r1   zHTMLFormRenderer.rendera  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   ry   r   s     r$   r{   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 )rh   )rj   r   s     r$   r{   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-   ra   	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-   ra   methodrb   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)rb   r8   ra   rn   r8   )r-   serializer_classview_instancerb   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 |Rt          j        t                    5  |                     |          cddd           cddd           S # 1 swxY w Y   |	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 rp   )r   r7   ry   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_classesr@   rA   rD   render_form_for_serializerr   r   r   )r-   r.   ra   r   rb   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_````` !	? !	? !	? !	? !	? !	? !	? !	?  #.(33 P P::;NOOP P P P P P P#!	? !	? !	? !	? !	? !	? !	? !	?"P P P P P P P P 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:>>C!	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	? !	?s\   	A( (A76A7G'9G'AG'G'8E&G'&E*	*G'-E*	.A,G''G+.G+c                     t          |t          j                  rd S t          |d          r|                                 |                                 }|                    |j        | j        dddii          S )Ninitial_datar   r   zrest_framework/horizontal)	r   r   r   rj   is_validform_renderer_classr1   r.   r/   )r-   r   form_renderers      r$   r   z/BrowsableAPIRenderer.render_form_for_serializer  s    j+"<== 	4:~.. 	"!!!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<   t          |t          j                  }|r|j        n|}|j        
                                }|j                                        D ]5\  }}t          |t          j                  r|                    |d           6|r|gn|}|	                    ||
|                                          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$   r{   z:BrowsableAPIRenderer.get_raw_data_form.<locals>.<listcomp>B  s    OOO6,OOOr&   c                     g | ]}||fS r"   r"   )ry   r7   s     r$   r{   z:BrowsableAPIRenderer.get_raw_data_form.<locals>.<listcomp>C  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   F  s         1 1&##'5<.OPPP	! ! ! +5?#)5>)0LMMM#"	  r&   r  )r   r   r   r   r   r   rj   r   r/   r0   r   r   r   childr.   fieldsitemsr   popr1   r   r   Form)r-   r.   ra   r   rb   r   r   default_parserr   r   acceptedrn   is_list_serializerrz   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 9	(w,,T67HMM 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( "03N$^5EtLLNt-.. >  ---!%!4!4h!4!G!GJJ!%!4!4!6!6J *>++3/4466$%! &0
K<V%W%W"1CSZ--
!++--#-#4#:#:#<#< - -KD%!%)@AA -t,,,!3=vv"//$'BB!..** PO4;NOOOKNN+NNNG!!nG        UZ    &%''s9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	( 9	(s   $H4FH44H8;H8c                 *    |                                 S rp   )get_view_name)r-   ra   s     r$   get_namezBrowsableAPIRenderer.get_nameV  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-   ra   rs   s      r$   get_descriptionz$BrowsableAPIRenderer.get_descriptionY  s4    679RSSS2((d(333r&   c                 ,    t          |j        |          S rp   )r   path)r-   rb   s     r$   r   z$BrowsableAPIRenderer.get_breadcrumbs^  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  rj   r$  r  s      r$   get_extra_actionsz&BrowsableAPIRenderer.get_extra_actionsa  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)rj   r   r   listget_resultsrD   rB   r'  r(  r*  appendr	   r   filter_templater1   )r-   r.   ra   rb   r)  querysetr+  backendr_   rl   rn   s              r$   get_filter_formz$BrowsableAPIRenderer.get_filter_formi  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.
        ra   rb   rc   POSTr   r   r   z%sz ;%szContent-Typer)  NHTTP_   _-r   
code_styleuserdescriptionrz   versionbreadcrumblistr   available_formatsc                     g | ]	}|j         
S r"   r   )ry   renderer_clss     r$   r{   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  dictsortedr  r7   r9   r   r)  display_page_controlsr   CSRF_COOKIE_NAMECSRF_HEADER_NAME
startswithrU   r   r   r9  r:  r   rs   r  r   r   r   r   r   r%  r2  boolr   )r-   r.   r/   r0   ra   rb   rc   r   rI  rH  rJ  rK  rA  renderer_content_typer)  rM  rN  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"x~~'7'7 8 899 " 	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   rb   re   rc   )r/   r0   r	   r   rl   rW  r1   rs   r   HTTP_204_NO_CONTENTHTTP_200_OK)r-   r.   r/   r0   rl   rn   rW   rc   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   rl   r/  r9  r9   r   r   r   r   r   r   r   r   r  r  r   r   r%  r2  rW  r1   r"   r&   r$   r   r   w  s'         JF(H8OJG*   R R R(  1 1 1>? >? >?@
 
 
H( H( H(T$ $ $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   rc   rb   ra   CreateEdit)r4  r   ErrorsGETre   Location   )r/   r0   rs   r   HTTP_400_BAD_REQUESTr   r   
error_formrH   error_titler   r   r   r.   r	   r   rl   rW  r1   HTTP_201_CREATEDHTTP_303_SEE_OTHERbuild_absolute_urirZ  r   rB   	full_path)
r-   r.   r/   r0   rc   rb   ra   rl   rn   rW   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 )rY  ra   r)  Ndetailr   r,  c                     g | ]
}|d k    |S r   r"   ry   keys     r$   r{   z-AdminRenderer.get_context.<locals>.<listcomp>+      9993C5LL3LLLr&   c                     g | ]
}|d k    |S rq  r"   rr  s     r$   r{   z-AdminRenderer.get_context.<locals>.<listcomp>,  rt  r&   r   r   columnsdetailsresultsrh  ri  )
superrW  r   r-  rD   rB   r   r,  get_result_url
setdefault)r-   r.   r/   r0   rn   r)  rx  headerr   rv  rw  resultr   	__class__s                r$   rW  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_kwargro  )r   )rj   r  r   r  rB   r
   )r-   r}  ra   r  r  r   s         r$   rz  zAdminRenderer.get_result_url<  s     t-.. 	t^,,	F("4);TBBRl	&|(<=F&&x&???.) 	 	 	FF	s    A A43A4r2   )	r3   r4   r5   rl   r8   r1   rW  rz  __classcell__)r~  s   @r$   r]  r]    sg        *HF& & & &P* * * * *X      r&   r]  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"   ry   languages     r$   r{   z5DocumentationRenderer.get_context.<locals>.<listcomp>^  s    iiih>Iiiir&   c                     g | ]}d |z  S )z'rest_framework/docs/langs/%s-intro.htmlr"   r  s     r$   r{   z5DocumentationRenderer.get_context.<locals>.<listcomp>_  s     u u uZb!JX!U u u ur&   )documentlangs
lang_htmlslang_intro_htmlsr9  rb   )	languagesr   r9  )r-   r.   rb   s      r$   rW  z!DocumentationRenderer.get_contextZ  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 )Nrb   re   rc   )r.   rb   rc   debug)r   r   Documentr	   r   rl   rW  r1   error_templater   DEBUG)r-   r.   r/   r0   rl   rn   s         r$   r1   zDocumentationRenderer.renderd  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   rl   r  r9  r  rW  r1   r"   r&   r$   r  r  Q  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schemarb   re   )r   codecsCoreJSONCodecbase64	b64encoderV   r   r	   r   rl   r   r1   )	r-   r.   r/   r0   codecr  rl   rn   rb   s	            r$   r1   zSchemaJSRenderer.renderz  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   rl   r1   r"   r&   r$   r  r  t  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  rj   r  r   rO  BOUNDARY)r-   r.   r/   r0   r  rs  r#   s          r$   r1   zMultiPartRenderer.render  s    7777774!! 	"jjll  
U%eT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QQQQr&   c                     t          |                    dd                    }t          j                                        }|                    ||          S )Nr>   r   )r>   )rU  rH   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   r;  enum)r   ObjectArrayNumberIntegerStringBooleanr~  r   r;  rj   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)rz   inTr  r;  r  )r  locationrz   r  r;  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 )Nr7  operationIdsummaryr;  r  tags)r  r   r;  )r-   r  rz   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lowerr{  r  r.   )	r-   r  pathsr  rz   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   )r<  r   r;  r   )openapiinfoserversr  )r   r;  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__  s2    WWWWWWSSSSSSSSr&   c                 |    |                      |          }t          j        |d                                          S )NF)default_flow_style)r  r   r  rV   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    [[[[[[[[r&   c                     |                      |          }t          j        |d| j                                      d          S )Nr   )r>   rN   r)   )r  r   rR   rN   rV   r  s        r$   r1   z!CoreAPIJSONOpenAPIRenderer.render  sD    &&t,,	za*, , ,,2F7OO	<r&   r2   )r3   r4   r5   r7   r9   r8   r   rY   rN   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LLLLr&   c                 &    G d dt           j                  }|                    t          |j                   |                    t
          j        t          j        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  add_representerr   represent_strdatetime	timedeltar   CustomScalarrepresent_timedeltar  rV   )r-   r.   r7   r0   r  s        r$   r1   zOpenAPIRenderer.render%  s    	 	 	 	 	T[ 	 	 	 	z6+?@@@x183H3\]]]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   )rM   r>   rN   r)   )r   rR   rS   rN   rV   )r-   r.   r7   r0   s       r$   r1   zJSONOpenAPIRenderer.render6  s6    zd(*, , ,,2F7OO	<r&   r2   )r3   r4   r5   r7   r9   r   rX   rS   r8   r   rY   rN   r1   r"   r&   r$   r  r  /  sJ        3JG(MF#00L< < < < < <r&   r  )Er6   r  r@   r  urllibr   r|   r   django.confr   django.core.exceptionsr   django.core.paginatorr   django.templater   r	   django.urlsr
   django.utils.htmlr   django.utils.httpr   django.utils.safestringr   rest_frameworkr   r   r   r   rest_framework.compatr   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   r]  r  r  r  r  r  r  r  r  r  r"   r&   r$   <module>r     s                                  7 7 7 7 7 7 & & & & & & + + + + + + + + & & & & & & ' ' ' ' ' ' 5 5 5 5 5 5 . . . . . . 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6 6 6 6 6< 6 6 6rY Y Y Y Y< Y Y Yz    -   BE( E( E( E( E(| E( E( E(Pj j j j j< j j jZ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&   