
    ^fh                     &   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mZmZmZmZmZ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 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(m)Z)  G d de$          Z* G d de&          Z+dS )    N)OrderedDict)Decimal)
attrgetter)urljoin)DecimalValidatorEmailValidatorMaxLengthValidatorMaxValueValidatorMinLengthValidatorMinValueValidatorRegexValidatorURLValidator)models)	force_str)RemovedInDRF315Warning
exceptions	renderersserializers)uritemplate)_UnvalidatedFieldempty)api_settings   )BaseSchemaGenerator)ViewInspector)get_pk_descriptionis_list_viewc                   "    e Zd Zd Zd ZddZdS )SchemaGeneratorc                 N    | j         pd| j        pdd}| j        
| j        |d<   |S )N )titleversiondescription)r"   r#   r$   )selfinfos     P/var/www/html/env/lib/python3.11/site-packages/rest_framework/schemas/openapi.pyget_infozSchemaGenerator.get_info   sA     Z%2|)r
 

 '"&"2D    c                    i }|D ]}||         D ]w}d||         |         vr||         |         d         }||v rDt          j        d                    ||         d         ||         d         |||                     ||d||<   xd S )NoperationIdzYou have a duplicated operationId in your OpenAPI schema: {operation_id}
	Route: {route1}, Method: {method1}
	Route: {route2}, Method: {method2}
	An operationId has to be unique across your schema. Your schema may not work in other tools.routemethod)route1method1route2method2operation_id)r,   r-   )warningswarnformat)r%   pathsidsr,   r-   r2   s         r'   check_duplicate_operation_idz,SchemaGenerator.check_duplicate_operation_id)   s     	 	E,   eV(<<<$U|F3MB3&&My  #&|#4W#=$'$5h$?#($*)5       #$% %L!!%	 	r)   NFc                 V   |                                   i }i }|                     |rdn|          \  }}|D ])\  }}}	|                     |||	          s|	j                            ||          }
|	j                            ||          }|                                D ]A}||vr||         ||         k    rt          j        d	                    |                     B|
                    |           |                    d          r
|dd         }t          | j        pd|          }|                    |i            |
||         |                                <   +|                     |           d|                                 |d}t%          |          dk    rd|i|d	<   |S )
z,
        Generate a OpenAPI schema.
        Nz@Schema component "{}" has been overriden with a different value./r   z3.0.2)openapir&   r6   r   schemas
components)_initialise_endpoints_get_paths_and_endpointshas_view_permissionsschemaget_operationget_componentskeysr3   r4   r5   update
startswithr   url
setdefaultlowerr8   r(   len)r%   requestpubliccomponents_schemasr6   _view_endpointspathr-   view	operationr=   krA   s                 r'   
get_schemazSchemaGenerator.get_schemaC   s    	""$$$  99&:U$$gVV>"0 	4 	4D&$,,T64@@ 11$??I33D&AAJ__&& l l...%a(JqM99`gghijjkkkk%%j111 s##  ABBx48?sD11DT2&&&*3E$K''))%000 MMOO
 
 !""Q&&-$F<  r)   )NF)__name__
__module____qualname__r(   r8   rT    r)   r'   r   r      sF        
 
 
  4/ / / / / /r)   r   c                        e Zd Zd# fd	Zg Zg Zddddd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 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  xZ!S )$
AutoSchemaNc                     |r(t          d |D                       st          d          || _        || _        || _        t                                                       dS )a  
        :param operation_id_base: user-defined name in operationId. If empty, it will be deducted from the Model/Serializer/View name.
        :param component_name: user-defined component's name. If empty, it will be deducted from the Serializer's class name.
        c              3   @   K   | ]}t          |t                    V  d S N
isinstancestr).0tags     r'   	<genexpr>z&AutoSchema.__init__.<locals>.<genexpr>~   s,      AASJsC00AAAAAAr)   z'tags must be a list or tuple of string.N)all
ValueError_tagsoperation_id_basecomponent_namesuper__init__)r%   tagsrg   rh   	__class__s       r'   rj   zAutoSchema.__init__y   so    
  	HAADAAAAA 	HFGGG
!2,r)   retrievecreaterE   partialUpdatedestroy)getpostputpatchdeletec                    i }|                      ||          |d<   |                     ||          |d<   g }||                     ||          z  }||                     ||          z  }||                     ||          z  }||d<   |                     ||          }|r||d<   |                     ||          |d<   |                     ||          |d<   |S )Nr+   r$   
parametersrequestBody	responsesrk   )get_operation_idget_descriptionget_path_parametersget_pagination_parametersget_filter_parametersget_request_bodyget_responsesget_tags)r%   rP   r-   rR   rw   request_bodys         r'   rB   zAutoSchema.get_operation   s    	#'#8#8v#F#F	- #'#7#7f#E#E	- 
d..tV<<<
d44T6BBB
d00v>>>
",	,,,T6:: 	4'3Im$!%!3!3D&!A!A	+ MM$77	&r)   c                    | j         | j         S |j        j        }t          j        dt          j                  }|                    d|          }|dk    r,t          d                    |j        j                            |S )z
        Compute the component's name from the serializer.
        Raise an exception if the serializer's class name is "Serializer" (case-insensitive).
        N
serializerr!   z"{}" is an invalid class name for schema generation. Serializer's class name should be unique and explicit. e.g. "ItemSerializer")	rh   rl   rU   recompile
IGNORECASEsub	Exceptionr5   )r%   r   rh   patterns       r'   get_component_namezAutoSchema.get_component_name   s    
 *&& $-6*\2=99 R88R`
,566   r)   c                    |                                 dk    ri S |                     ||          }|                     ||          }i }t          |t          j                  r@|                     |          }|                     |          }|                    ||           t          |t          j                  r@|                     |          }|                     |          }|                    ||           |S )zN
        Return components with their properties from the serializer.
        ru   )	rI   get_request_serializerget_response_serializerr_   r   
Serializerr   map_serializerrH   )r%   rP   r-   request_serializerresponse_serializerr=   rh   contents           r'   rC   zAutoSchema.get_components   s    
 <<>>X%%I!88vFF"::4HH
(+*@AA 	;!445GHHN))*<==G!!.':::);+ABB 	;!445HIIN))*=>>G!!.':::r)   c                     |                     d          }|d         d                    d |dd          D                       z   S )NrN   r   r!   c              3   >   K   | ]}|                                 V  d S r]   )r"   )ra   xs     r'   rc   z,AutoSchema._to_camel_case.<locals>.<genexpr>   s*      &I&IQqwwyy&I&I&I&I&I&Ir)   r   )splitjoin)r%   	snake_strr=   s      r'   _to_camel_casezAutoSchema._to_camel_case   sG    __S))
 !}rww&I&I*QRR.&I&I&IIIIIr)   c                    t          t          | j        dd          dd          }| j        | j        }n||j        }n|                     ||          @|                     ||          j        j        }|                    d          r
|dd         }n| j        j        j        }|                    d          r|dd         }n|                    d          r
|dd	         }|                    |                                          r|dt          |                    }|d
k    r|                    d          s|dz  }|S )za
        Compute the base part for operation ID from the model, serializer or view name.
        querysetNmodelr   iAPIViewiViewlists)	getattrrQ   rg   rU   get_serializerrl   endswithr"   rJ   )r%   rP   r-   actionr   names         r'   get_operation_id_basez AutoSchema.get_operation_id_base   sM    	:t<<gtLL!-)DD >DD   v..:&&tV44>GD}}\** "DSDz 9&/D}}Y'' !CRCyv&& !CRCy }}V\\^^,, +Mc&kk\M*VDMM#$6$6CKDr)   c                 8   t          | j        d|                                          }t          ||| j                  rd}n>|| j        vr|                     |          }n| j        |                                         }|                     |||          }||z   S )z^
        Compute an operation ID from the view type and get_operation_id_base method.
        r   r   )r   rQ   rI   r   method_mappingr   r   )r%   rP   r-   method_namer   r   s         r'   rz   zAutoSchema.get_operation_id   s     di6<<>>BBfdi00 	9FF 333((55FF(8F))$??}r)   c                    t           s
J d            t          t          | j        dd          dd          }g }t          j        |          D ]}d}|e	 |j                            |          }n# t          $ r d}Y nw xY w||j        rt          |j                  }n||j	        rt          ||          }|dd|dd	id
}|                    |           |S )zL
        Return a list of parameters from templated path variables.
        z;`uritemplate` must be installed for OpenAPI schema support.r   Nr   r!   rP   Ttypestring)r   inrequiredr$   rA   )r   r   rQ   	variables_meta	get_fieldr   	help_textr   primary_keyr   append)	r%   rP   r-   r   rw   variabler$   model_field	parameters	            r'   r|   zAutoSchema.get_path_parameters  s#    YYYYY{	:t<<gtLL
#-d33 	) 	)HK '"'+"7"7"A"AKK  ' ' '"&KKK' *{/D*"+K,A"B"BKK ,1H,"4UK"H"HK ! *H I i((((s   A//A>=A>c                     |                      ||          sg S g }| j        j        D ]'}| |                                | j                  z  }(|S r]   )allows_filtersrQ   filter_backendsget_schema_operation_parameters)r%   rP   r-   rw   filter_backends        r'   r~   z AutoSchema.get_filter_parameters3  sd    ""400 	I
"i7 	V 	VN..**JJ49UUUJJr)   c                     t          | j        dd          dS t          | j        d          r| j        j        dv S |                                dv S )z
        Determine whether to include filter Fields in schema.

        Default implementation looks for ModelViewSet or GenericAPIView
        actions/methods that cause filtering on the default implementation.
        r   NFr   )r   rm   rE   partial_updaterp   )rq   rs   rt   ru   )r   rQ   hasattrr   rI   r%   rP   r-   s      r'   r   zAutoSchema.allows_filters;  sX     49/66>549h'' 	c9#'bbb||~~!BBBr)   c                     | j         }t          |||          sg S |                                 }|sg S |                    |          S r]   )rQ   r   get_paginatorr   )r%   rP   r-   rQ   	paginators        r'   r}   z$AutoSchema.get_pagination_parametersH  sT    yD&$// 	I&&((	 	I88>>>r)   c                 L   t          t          j        |j                            }t	          d |D                       rd}nVt	          d |D                       rd}n:t	          d |D                       rd}nt	          d |D                       rd}nd }d	|i}|r||d
<   |S )Nc              3   @   K   | ]}t          |t                    V  d S r]   )r_   boolra   choices     r'   rc   z-AutoSchema.map_choicefield.<locals>.<genexpr>V  s,      >>Fz&$''>>>>>>r)   booleanc              3   @   K   | ]}t          |t                    V  d S r]   )r_   intr   s     r'   rc   z-AutoSchema.map_choicefield.<locals>.<genexpr>X  ,      ??VFC((??????r)   integerc              3   Z   K   | ]&}t          |t          t          t          f          V  'd S r]   )r_   r   floatr   r   s     r'   rc   z-AutoSchema.map_choicefield.<locals>.<genexpr>Z  s3      QQvFS%$9::QQQQQQr)   numberc              3   @   K   | ]}t          |t                    V  d S r]   r^   r   s     r'   rc   z-AutoSchema.map_choicefield.<locals>.<genexpr>]  r   r)   r   enumr   )r   r   fromkeyschoicesrd   )r%   fieldr   r   mappings        r'   map_choicefieldzAutoSchema.map_choicefieldT  s    {+EM::;;>>g>>>>> 
	DD??w????? 	DDQQQQQQQ 	DD??w????? 	DDD
 G
  	#"GFOr)   c                    t          |t          j                  rd|                     |j                  dS t          |t          j                  r|                     |          }d|d<   |S t          |t          j                  rd|                     |j                  dS t          |t          j	                  rBt          |j        dd           }|*|j        j        }t          |t          j                  rddiS t          |t          j                  rd|                     |          dS t          |t          j                  r|                     |          S t          |t          j                  r>di d}t          |j        t(                    s|                     |j                  |d<   |S t          |t          j                  rdd	d
S t          |t          j                  rddd
S t          |t          j                  rddd
S t          |t          j                  rddd
S t          |t          j                  rddd
S t          |t          j                  rddi}|j        dk    r
|j        |d<   |S t          |t          j                  rt          |dt:          j                  rddd
}nddi}|j        r#tA          d|j        dz
  dz  z   dz             |d<   |j!        r)tE          |j!        dz            dz   |d<   |d          |d<   | #                    ||           |S t          |t          j$                  rddi}| #                    ||           |S t          |t          j%                  roddi}| #                    ||           tE          |&                    dd                    dk    s'tE          |&                    dd                    dk    rd|d<   |S t          |t          j'                  rddd
S t          j(        d t          j)        dt          j*        dt          j+        di}d|&                    |j,        d          iS )!Narrayr   itemsobjectr   r   r   r   r   date)r   r5   z	date-timeemailuriuuidbothr5   coerce_to_stringdecimalr   .r   01
multipleOf9maximumminimumr   iint64binaryr   )-r_   r   ListSerializerr   childr   ManyRelatedField	map_fieldchild_relationPrimaryKeyRelatedFieldr   r   r   pkr   	AutoFieldMultipleChoiceFieldr   ChoiceField	ListFieldr   	DateFieldDateTimeField
EmailFieldURLField	UUIDFieldIPAddressFieldprotocolDecimalFieldr   COERCE_DECIMAL_TO_STRINGdecimal_placesr   max_whole_digitsr   _map_min_max
FloatFieldIntegerFieldrq   	FileFieldBooleanField	JSONField	DictFieldHStoreFieldrl   )r%   r   datar   r   r   r   FIELD_CLASS_SCHEMA_TYPEs           r'   r   zAutoSchema.map_fieldp  s    e[788 	,,U[99   e[344 	&&u--D#DLK e[9:: 	(<==   e[?@@ 	/ENGT::E #knk6+;<< /"I.. e[<== 	--e44  
 e[455 	/''... e[233 	 G ek+<== ?#'>>%+#>#> N e[233 	    
 e[677 	 %   e[344 	 !  
 e[122 	   
 e[233 	    
 e[788 	G ~''$)N!Ne[566 	u0,2WXX $'  H # \(-cU5IA5MQT4T.TWZ.Z([([%% 9%()?#)E%F%F%J	"&-i&8%8	"eW---Ne[344 	G eW---Ne[566 		G eW---7;;y!,,--
::c'++iYZB[B[>\>\_i>i>i$+!Ne[233 	 "   $i!8!8#X	#
 /33EOXNNOOr)   c                 N    |j         r
|j         |d<   |j        r|j        |d<   d S d S )Nr   r   )	max_value	min_value)r%   r   r   s      r'   r  zAutoSchema._map_min_max  s>    ? 	1!&GI? 	1!&GI	1 	1r)   c                 .   g }i }|j                                         D ]}t          |t          j                  r|j        r|                    |j                   |                     |          }|j	        rd|d<   |j
        rd|d<   |j        rd|d<   |j        .|j        t          k    rt          |j                  s
|j        |d<   |j        rt!          |j                  |d<   |                     ||           |||j        <   d|d}|r||d	<   |S )
NTreadOnly	writeOnlynullabledefaultr$   r   )r   
propertiesr   )fieldsvaluesr_   r   HiddenFieldr   r   
field_namer   	read_only
write_only
allow_nullr  r   callabler   r`   map_field_validators)r%   r   r   r  r   rA   results          r'   r   zAutoSchema.map_serializer  sR   
&--// 	2 	2E%!899 ~ 2 0111^^E**F *%)z" +&*{# *%)z"}(U]e-C-CHUZUbLcLc-C$)My! =(+EO(<(<}%%%eV444+1Ju'(( $
 
  	*!)F:r)   c                    |j         D ]}t          |t                    rd|d<   t          |t                    rd|d<   t          |t                    r$|j        j                            dd          |d<   pt          |t                    r)d}t          |t          j
                  rd}|j        ||<   t          |t                    r)d	}t          |t          j
                  rd
}|j        ||<   t          |t                    r|j        |d<   t          |t                    r|j        |d<   .t          |t                    rt!          |dt"          j                  sx|j        r#t)          d|j        dz
  dz  z   dz             |d<   |j        rG|j        }|j        |j        dk    r
||j        z  }t-          |dz            dz   |d<   |d          |d<   dS )z&
        map field validators
        r   r5   r   z\Zz\zr   	maxLengthmaxItems	minLengthminItemsr   r   r   r   r   r   r   r   Nr   r   )
validatorsr_   r   r   r   regexr   replacer	   r   r   limit_valuer   r
   r   r   r   r   r  r  r   
max_digitsr   )r%   r   rA   v	attr_namedigitss         r'   r   zAutoSchema.map_field_validators(  s    ! "	; "	;A !^,, +#*x !\** )#(x !^,, ; %&GO$;$;E5$I$Iy!!A122 ;'	e[%:;; + *I$%My!!A122 ;'	e[%:;; + *I$%My!!A011 ;$%My!!A011 ;$%My!!A/00 	;'9<;`aa	;# [+08H18LPS7S1SVY1Y+Z+ZF<(< ;\F'38H18L8L!"22(+FSL(9(9A(=F9%)/	):(:F9%E"	; "	;r)   c                 J    t          | j        dd           }|r
 |            S d S )Npagination_class)r   rQ   )r%   r0  s     r'   r   zAutoSchema.get_paginatorP  s3    "49.@$GG 	&##%%%tr)   c                 j    t          t          t          d          | j        j                            S )N
media_type)r   mapr   rQ   parser_classesr   s      r'   map_parserszAutoSchema.map_parsersV  s'    C
<00$)2JKKLLLr)   c                     g }| j         j        D ]7}t          |t          j                  r|                    |j                   8|S r]   )rQ   renderer_classes
issubclassr   BrowsableAPIRendererr   r2  )r%   rP   r-   media_typesrenderers        r'   map_rendererszAutoSchema.map_renderersY  sS    	2 	4 	4H(I$BCC x23333r)   c                     | j         }t          |d          sd S 	 |                                S # t          j        $ r7 t          j        d                    |j        j	        ||                     Y d S w xY w)Nr   zt{}.get_serializer() raised an exception during schema generation. Serializer fields will not be generated for {} {}.)
rQ   r   r   r   APIExceptionr3   r4   r5   rl   rU   )r%   rP   r-   rQ   s       r'   r   zAutoSchema.get_serializerb  s    yt-.. 	4	&&(((& 	 	 	M 1 "6$."964HHJ J J 44	s   / AA54A5c                 .    |                      ||          S )zr
        Override this method if your view uses a different serializer for
        handling request body.
        r   r   s      r'   r   z!AutoSchema.get_request_serializerq      
 ""4000r)   c                 .    |                      ||          S )zu
        Override this method if your view uses a different serializer for
        populating response data.
        r@  r   s      r'   r   z"AutoSchema.get_response_serializerx  rA  r)   c                 V    dd                     |                     |                    iS )Nz$refz#/components/schemas/{})r5   r   r%   r   s     r'   get_referencezAutoSchema.get_reference  s+    1889P9PQ[9\9\]]^^r)   c                     |dvri S |                      ||          | _        |                     ||          }t          |t          j                  si n|                     |          dfd| j        D             iS )N)PUTPATCHPOSTr   c                     i | ]}|d iS rA   rX   )ra   ctitem_schemas     r'   
<dictcomp>z/AutoSchema.get_request_body.<locals>.<dictcomp>  s0        X{+  r)   )r5  request_media_typesr   r_   r   r   rE  )r%   rP   r-   r   rM  s       @r'   r   zAutoSchema.get_request_body  s    111I#'#3#3D&#A#A 00v>>
*k&<== 	9KK,,Z88K     2  
 	
r)   c                    |dk    rdddiiS |                      ||          | _        |                     ||          }t          |t          j                  si }n|                     |          }t          ||| j                  r1d|d| 	                                }|r|
                              n||dk    rdnd	}|fd
| j        D             ddiS )NDELETE204r$   r!   r   r   rI  201200c                     i | ]}|d iS rK  rX   )ra   rL  response_schemas     r'   rN  z,AutoSchema.get_responses.<locals>.<dictcomp>  s0        ?3  r)   )r   r$   )r<  response_media_typesr   r_   r   r   rE  r   rQ   r   get_paginated_response_schema)r%   rP   r-   r   rM  r   status_coderV  s          @r'   r   zAutoSchema.get_responses  s8   X!2  %)$6$6tV$D$D!11$??
*k&<== 	9KK,,Z88Kfdi00 		*$ O **,,I ["+"I"I/"Z"Z)O%//eeU   "7    "	 	
 	
r)   c                     | j         r| j         S |                    d          r
|dd          }|                    d          d                             dd          gS )Nr:   r   r   rN   -)rf   rF   r   r)  r   s      r'   r   zAutoSchema.get_tags  s_    : 	:
 ??3 	8D

3"**34455r)   c                 d    t          j        dt          d           |                     |          S )NzkMethod `_get_reference()` has been renamed to `get_reference()`. The old name will be removed in DRF v3.15.   )
stacklevel)r3   r4   r   rE  rD  s     r'   _get_referencezAutoSchema._get_reference  s;    9"q	
 	
 	
 	

 !!*---r)   )NNN)"rU   rV   rW   rj   rO  rW  r   rB   r   rC   r   r   rz   r|   r~   r   r}   r   r   r  r   r   r   r5  r<  r   r   r   rE  r   r   r   r_  __classcell__)rl   s   @r'   rZ   rZ   w   s       
 
 
 
 
 
    N  (  .  2J J J# # #J   " " "H  C C C
? 
? 
?  8LP LP LP\1 1 1" " "H&; &; &;P  M M M    1 1 11 1 1_ _ _
 
 
('
 '
 '
R6 6 6. . . . . . .r)   rZ   ),r   r3   collectionsr   r   r   operatorr   urllib.parser   django.core.validatorsr   r   r	   r
   r   r   r   r   	django.dbr   django.utils.encodingr   rest_frameworkr   r   r   r   rest_framework.compatr   rest_framework.fieldsr   r   rest_framework.settingsr   
generatorsr   
inspectorsr   utilsr   r   r   rZ   rX   r)   r'   <module>rn     s   				  # # # # # #                                                  + + + + + +            . - - - - - : : : : : : : : 0 0 0 0 0 0 + + + + + + % % % % % % 3 3 3 3 3 3 3 3W W W W W) W W Wx[	. [	. [	. [	. [	. [	. [	. [	. [	. [	.r)   