
    _}dgbj                        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	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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)Decimal)
attrgetter)urljoin)DecimalValidatorEmailValidatorMaxLengthValidatorMaxValueValidatorMinLengthValidatorMinValueValidatorRegexValidatorURLValidator)models)	force_str)RemovedInDRF316Warning
exceptions	renderersserializers)
inflection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     ]/var/www/surfInsights/venv3-11/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.
        NzASchema component "{}" has been overridden 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_schemaB   s    	""$$$  99&:U$$gVV>"0 	4 	4D&$,,T64@@ 11$??I33D&AAJ__&& m m...%a(JqM99ahhijkkllll%%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 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__x   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%t          s
J d            t          j
        |          }|S )za
        Compute the base part for operation ID from the model, serializer or view name.
        querysetNmodelr   iAPIViewiViewlistz:`inflection` must be installed for OpenAPI schema support.)getattrrQ   rg   rU   get_serializerrl   endswithr"   rJ   r   	pluralize)r%   rP   r-   actionr   names         r'   get_operation_id_basez AutoSchema.get_operation_id_base   sX    	:t<<gtLL!-)DD >DD   v..:&&tV44>GD}}\** "DSDz 9&/D}}Y'' !CRCyv&& !CRCy }}V\\^^,, +Mc&kk\M*V[[[[[['--D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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                 X   t          t                              |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   dictfromkeyschoicesrd   )r%   fieldr   r   mappings        r'   map_choicefieldzAutoSchema.map_choicefieldT  s    t}}U]3344>>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	                  rnt          |dd          r|                     |j                  S t          |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#tC          d|j         dz
  dz  z   dz             |d<   |j"        r)tG          |j"        dz            dz   |d<   |d          |d<   | $                    ||           |S t          |t          j%                  rddi}| $                    ||           |S t          |t          j&                  rodd	i}| $                    ||           tG          |'                    dd                    d k    s'tG          |'                    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   pk_fieldF)r   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   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  s1    e[788 	,,U[99   e[344 	&&u--D#DLK e[9:: 	(<==   e[?@@ 	/uj%00 <~~EN~;;;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                 x   g }i }|j                                         D ]}t          |t          j                  r|j        r/|j        s(|                    |                     |                     | 	                    |          }|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<   |                     ||           |||                     |          <   d|d}|r||d	<   |S )
NTreadOnly	writeOnlynullabledefaultr$   r   )r   
propertiesr   )fieldsvaluesr_   r   HiddenFieldr   partialr   get_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   
&--// 	< 	<E%!899 ~ <j&8 < 3 3E : :;;;^^E**F *%)z" +&*{# *%)z"}(U]e-C-CHUZUbLcLc-C$)My! =(+EO(<(<}%%%eV4445;Jt**51122 $
 
  	*!)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         S )z
        Override this method if you want to change schema field name.
        For example, convert snake_case field name to camelCase.
        )
field_name)r%   r   s     r'   r  zAutoSchema.get_field_nameR  s    
 r)   c                 J    t          | j        dd           }|r
 |            S d S )Npagination_class)r   rQ   )r%   r5  s     r'   r   zAutoSchema.get_paginatorY  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_parsers_  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   r7  )r%   rP   r-   media_typesrenderers        r'   map_rendererszAutoSchema.map_renderersb  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_serializerk  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_serializerz      
 ""4000r)   c                 .    |                      ||          S )zu
        Override this method if your view uses a different serializer for
        populating response data.
        rE  r   s      r'   r   z"AutoSchema.get_response_serializer  rF  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)   )r:  request_media_typesr   r_   r   r   rJ  )r%   rP   r-   r   rR  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   rN  201200c                     i | ]}|d iS rP  rX   )ra   rQ  response_schemas     r'   rS  z,AutoSchema.get_responses.<locals>.<dictcomp>  s0        ?3  r)   )r   r$   )rA  response_media_typesr   r_   r   r   rJ  r   rQ   r   get_paginated_response_schema)r%   rP   r-   r   rR  r   status_coder[  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.16.   )
stacklevel)r3   r4   r   rJ  rI  s     r'   _get_referencezAutoSchema._get_reference  s;    9"q	
 	
 	
 	

 !!*---r)   )NNN)#rU   rV   rW   rj   rT  r\  r   rB   r   rC   r   r   rz   r|   r~   r   r}   r   r   r  r   r#  r  r   r:  rA  r   r   r   rJ  r   r   r   rd  __classcell__)rl   s   @r'   rZ   rZ   v   s       
 
 
 
 
 
    N  (  .  2J J J$ $ $L   " " "H  C C C
? 
? 
?  8NP NP NP`1 1 1" " "H&; &; &;P       M M M    1 1 11 1 1_ _ _
 
 
('
 '
 '
R6 6 6. . . . . . .r)   rZ   )+r   r3   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   r   rest_framework.fieldsr   r   rest_framework.settingsr   
generatorsr   
inspectorsr   utilsr   r   r   rZ   rX   r)   r'   <module>rr     s   				                                                   + + + + + +            : 9 9 9 9 9 9 9 : : : : : : : : 0 0 0 0 0 0 + + + + + + % % % % % % 3 3 3 3 3 3 3 3W W W W W) W W Wxe	. e	. e	. e	. e	. e	. e	. e	. e	. e	.r)   