
    hi                        S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	J
r
JrJrJrJrJrJr  S SKJr  S SKJr  S SKJrJrJr  S S	KJrJr  S S
KJrJr  S SKJ r   SSK!J"r"  SSK#J$r$  SSK%J&r&J'r'   " S S\"5      r( " S S\$5      r)g)    N)Decimal)
attrgetter)urljoin)DecimalValidatorEmailValidatorMaxLengthValidatorMaxValueValidatorMinLengthValidatorMinValueValidatorRegexValidatorURLValidator)models)	force_str)
exceptions	renderersserializers)
inflectionuritemplate)_UnvalidatedFieldempty)api_settings   )BaseSchemaGenerator)ViewInspector)get_pk_descriptionis_list_viewc                   *    \ rS rSrS rS rSS jrSrg)SchemaGenerator   c                     U R                   =(       d    SU R                  =(       d    SS.nU R                  b  U R                  US'   U$ )N )titleversiondescription)r"   r#   r$   )selfinfos     P/var/www/html/env/lib/python3.13/site-packages/rest_framework/schemas/openapi.pyget_infoSchemaGenerator.get_info   sF     ZZ%2||)r

 '"&"2"2D    c                     0 nU Hb  nX    HW  nSX   U   ;  a  M  X   U   S   nXR;   a1  [         R                  " SR                  X%   S   X%   S   UUUS95        UUS.X%'   MY     Md     g )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.   r3   s         r'   check_duplicate_operation_id,SchemaGenerator.check_duplicate_operation_id&   s    E, V(<<$|F3MB&MMy  #&#4W#=$'$5h$?#($*)5    #$%!% ' r*   Nc                    U R                  5         0 n0 nU R                  U(       a  SOU5      u  pVU GH  u  pxn	U R                  XxU	5      (       d  M   U	R                  R	                  Xx5      n
U	R                  R                  Xx5      nUR                  5        H;  nX;  a  M
  X<   X   :X  a  M  [        R                  " SR                  U5      5        M=     UR                  U5        UR                  S5      (       a  USS n[        U R                  =(       d    SU5      nUR                  U0 5        XU   UR                  5       '   GM     U R!                  U5        SU R#                  5       US.n[%        U5      S:  a  SU0US	'   U$ )
z
Generate a OpenAPI schema.
NzASchema component "{}" has been overridden with a different value./r   z3.0.2)openapir&   r7   r   schemas
components)_initialise_endpoints_get_paths_and_endpointshas_view_permissionsschemaget_operationget_componentskeysr4   r5   r6   update
startswithr   url
setdefaultlowerr9   r(   len)r%   requestpubliccomponents_schemasr7   _view_endpointspathr.   view	operationr?   krC   s                 r'   
get_schemaSchemaGenerator.get_schema@   sw    	""$  99&$gV"0D$,,T4@@11$?I33DAJ__&.%(JM9ahhijkl ' %%j1 s##ABx488?sD1DT2&*3$K'+ #1. 	))%0 MMO
 !"Q&-$F<  r*    )NF)__name__
__module____qualname____firstlineno__r(   r9   rV   __static_attributes__rX   r*   r'   r   r      s    
4/r*   r   c                      ^  \ rS rSrS$U 4S jjr/ r/ rSSSSSS.rS	 rS
 r	S r
S rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS  rS! r S" r!S#r"U =r#$ )%
AutoSchemat   c                    > U(       a"  [        S U 5       5      (       d  [        S5      eXl        X l        X0l        [
        TU ]  5         g)z
: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   B   #    U  H  n[        U[        5      v   M     g 7fN
isinstancestr).0tags     r'   	<genexpr>&AutoSchema.__init__.<locals>.<genexpr>{   s     ADSJsC00D   z'tags must be a list or tuple of string.N)all
ValueError_tagsoperation_id_basecomponent_namesuper__init__)r%   tagsro   rp   	__class__s       r'   rr   AutoSchema.__init__v   s@    
 ADAAAFGG
!2,r*   retrievecreaterG   partialUpdatedestroy)getpostputpatchdeletec                 `   0 nU R                  X5      US'   U R                  X5      US'   / nX@R                  X5      -  nX@R                  X5      -  nX@R	                  X5      -  nXCS'   U R                  X5      nU(       a  XSS'   U R                  X5      US'   U R                  X5      US'   U$ )Nr,   r$   
parametersrequestBody	responsesrs   )get_operation_idget_descriptionget_path_parametersget_pagination_parametersget_filter_parametersget_request_bodyget_responsesget_tags)r%   rR   r.   rT   r   request_bodys         r'   rD   AutoSchema.get_operation   s    	#'#8#8#F	- #'#7#7#E	- 
..t<<
44TBB
00>>
",,,,T:'3m$!%!3!3D!A	+ MM$7	&r*   c                 :   U R                   b  U R                   $ UR                  R                  n[        R                  " S[        R
                  5      nUR                  SU5      nUS:X  a.  [        SR                  UR                  R                  5      5      eU$ )z
Compute the component's name from the serializer.
Raise an exception if the serializer's class name is "Serializer" (case-insensitive).

serializerr!   z"{}" is an invalid class name for schema generation. Serializer's class name should be unique and explicit. e.g. "ItemSerializer")	rp   rt   rY   recompile
IGNORECASEsub	Exceptionr6   )r%   r   rp   patterns       r'   get_component_nameAutoSchema.get_component_name   s    
 *&&& $--66**\2==9 R8R`
,,556  r*   c                    UR                  5       S:X  a  0 $ U R                  X5      nU R                  X5      n0 n[        U[        R
                  5      (       a3  U R                  U5      nU R                  U5      nUR                  Xg5        [        U[        R
                  5      (       a3  U R                  U5      nU R                  U5      nUR                  Xg5        U$ )z>
Return components with their properties from the serializer.
r~   )	rK   get_request_serializerget_response_serializerre   r   
Serializerr   map_serializerrJ   )r%   rR   r.   request_serializerresponse_serializerr?   rp   contents           r'   rE   AutoSchema.get_components   s    
 <<>X%I!88F"::4H
(+*@*@AA!445GHN))*<=G!!.:);+A+ABB!445HIN))*=>G!!.:r*   c                 f    UR                  S5      nUS   SR                  S USS   5       5      -   $ )NrP   r   r!   c              3   @   #    U  H  oR                  5       v   M     g 7frc   )r"   )rg   xs     r'   ri   ,AutoSchema._to_camel_case.<locals>.<genexpr>   s     &I.Qwwyy.s   r   )splitjoin)r%   	snake_strr?   s      r'   _to_camel_caseAutoSchema._to_camel_case   s6    __S)
 !}rww&I*QR.&IIIIr*   c                    [        [        U R                  SS5      SS5      nU R                  b  U R                  nOUb  UR                  nOU R	                  X5      bA  U R	                  X5      R
                  R                  nUR                  S5      (       a  USS nOU R                  R
                  R                  nUR                  S5      (       a  USS nOUR                  S5      (       a  USS	 nUR                  UR                  5       5      (       a  US[        U5      *  nUS
:X  a(  [        (       d   S5       e[        R                  " U5      nU$ )zQ
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.)getattrrS   ro   rY   get_serializerrt   endswithr"   rL   r   	pluralize)r%   rR   r.   actionr   names         r'   get_operation_id_base AutoSchema.get_operation_id_base   s2    		:t<gtL!!-))D >>D   .:&&t4>>GGD}}\**DSz 99&&//D}}Y''CRyv&&CRy }}V\\^,,Mc&k\*V:[[[:''-Dr*   c                 0   [        U R                  SUR                  5       5      n[        XU R                  5      (       a  SnO>X0R                  ;  a  U R                  U5      nOU R                  UR                  5          nU R                  XU5      nXE-   $ )zN
Compute an operation ID from the view type and get_operation_id_base method.
r   r   )r   rS   rK   r   method_mappingr   r   )r%   rR   r.   method_namer   r   s         r'   r   AutoSchema.get_operation_id   s~     dii6<<>Bdii00F 3 33((5F((8F))$?}r*   c                    [         (       d   S5       e[        [        U R                  SS5      SS5      n/ n[         R                  " U5       H  nSnUbe   UR                  R                  U5      nUb'  UR                  (       a  [        UR                  5      nOUb  UR                  (       a  [        X75      nUSSUSS	0S
.nUR                  U5        M     U$ ! [         a    Sn Nxf = f)z<
Return a list of parameters from templated path variables.
z;`uritemplate` must be installed for OpenAPI schema support.r   Nr   r!   rR   Ttypestring)r   inrequiredr$   rC   )r   r   rS   	variables_meta	get_fieldr   	help_textr   primary_keyr   append)	r%   rR   r.   r   r   variabler$   model_field	parameters	            r'   r   AutoSchema.get_path_parameters  s     {YYY{		:t<gtL
#--d3HK '"'++"7"7"AK *{/D/D"+K,A,A"BK ,1H1H"4U"HK ! *HI i(/ 42 ' ! '"&K's   CC*)C*c                     U R                  X5      (       d  / $ / nU R                  R                   H%  nX4" 5       R                  U R                  5      -  nM'     U$ rc   )allows_filtersrS   filter_backendsget_schema_operation_parameters)r%   rR   r.   r   filter_backends        r'   r    AutoSchema.get_filter_parameters1  sS    ""400I
"ii77N.*JJ499UUJ 8r*   c                     [        U R                  SS5      c  g[        U R                  S5      (       a  U R                  R                  S;   $ UR	                  5       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   rv   rG   partial_updatery   )rz   r|   r}   r~   )r   rS   hasattrr   rK   r%   rR   r.   s      r'   r   AutoSchema.allows_filters9  sT     499/6>499h''99##'bbb||~!BBBr*   c                     U R                   n[        XU5      (       d  / $ U R                  5       nU(       d  / $ UR                  U5      $ rc   )rS   r   get_paginatorr   )r%   rR   r.   rS   	paginators        r'   r   $AutoSchema.get_pagination_parametersF  sD    yyD$//I&&(	I88>>r*   c                 H   [        [        R                  UR                  5      5      n[	        S U 5       5      (       a  SnOP[	        S U 5       5      (       a  SnO6[	        S U 5       5      (       a  SnO[	        S U 5       5      (       a  SnOS nS	U0nU(       a  X4S
'   U$ )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7frc   )re   boolrg   choices     r'   ri   -AutoSchema.map_choicefield.<locals>.<genexpr>T  s     >gFz&$''grk   booleanc              3   B   #    U  H  n[        U[        5      v   M     g 7frc   )re   intr   s     r'   ri   r   V       ?wVFC((wrk   integerc              3   X   #    U  H   n[        U[        [        [        45      v   M"     g 7frc   )re   r   floatr   r   s     r'   ri   r   X  s!     QvFS%$9::s   (*numberc              3   B   #    U  H  n[        U[        5      v   M     g 7frc   rd   r   s     r'   ri   r   [  r   rk   r   enumr   )r   dictfromkeyschoicesrl   )r%   fieldr   r   mappings        r'   map_choicefieldAutoSchema.map_choicefieldR  s    t}}U]]34>g>>>D?w???DQQQQD?w???DD
 G
 "FOr*   c                 
   [        U[        R                  5      (       a  SU R                  UR                  5      S.$ [        U[        R
                  5      (       a  U R                  U5      nSUS'   U$ [        U[        R                  5      (       a  SU R                  UR                  5      S.$ [        U[        R                  5      (       a~  [        USS5      (       a  U R                  UR                  S9$ [        UR                  SS 5      nUb9  UR                  R                  n[        U[        R                   5      (       a  SS	0$ [        U[        R"                  5      (       a  SU R%                  U5      S.$ [        U[        R&                  5      (       a  U R%                  U5      $ [        U[        R(                  5      (       aD  S0 S.n[        UR                  [*        5      (       d  U R                  UR                  5      US
'   U$ [        U[        R,                  5      (       a  SSS.$ [        U[        R.                  5      (       a  SSS.$ [        U[        R0                  5      (       a  SSS.$ [        U[        R2                  5      (       a  SSS.$ [        U[        R4                  5      (       a  SSS.$ [        U[        R6                  5      (       a%  SS0nUR8                  S:w  a  UR8                  US'   U$ [        U[        R:                  5      (       a  [        US[<        R>                  5      (       a  SSS.nOSS0nUR@                  (       a$  [C        SUR@                  S-
  S-  -   S-   5      US'   URD                  (       a'  [G        URD                  S-  5      S-   US'   US   * US'   U RI                  X5        U$ [        U[        RJ                  5      (       a  SS0nU RI                  X5        U$ [        U[        RL                  5      (       aZ  SS	0nU RI                  X5        [G        URO                  SS5      5      S :  d  [G        URO                  SS5      5      S :  a  S!US'   U$ [        U[        RP                  5      (       a  SS"S.$ [        RR                  S#[        RT                  S[        RV                  S[        RX                  S0nSURO                  URZ                  S5      0$ )$Narrayr   itemsobjectr   pk_fieldF)r   r   r   r   r   date)r   r6   z	date-timeemailuriuuidbothr6   coerce_to_stringdecimalr   .r   01
multipleOf9maximumminimumr   iint64binaryr   ).re   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IntegerFieldrz   	FileFieldBooleanField	JSONField	DictFieldHStoreFieldrt   )r%   r   datar   r   r   r   FIELD_CLASS_SCHEMA_TYPEs           r'   r
  AutoSchema.map_fieldn  s    e[7788,,U[[9  e[3344&&u-D#DLK e[99::(<(<=  e[??@@uj%00~~ENN~;;ENNGT:E #kknnk6+;+;<<"I.. e[<<==--e4 
 e[4455''.. e[2233G ekk+<==#'>>%++#> N e[2233   
 e[6677 %  e[3344 ! 
 e[1122  
 e[2233   
 e[7788G ~~'$)NN!Ne[5566u0,2W2WXX$' H ##(-cU5I5IA5MQT4T.TWZ.Z([%%%%()?)?#)E%F%J	"&-i&8%8	"e-Ne[3344G e-Ne[5566	G e-7;;y!,-
:c'++iYZB[>\_i>i$+!Ne[2233 "  $$i!!8!!8##X	#
 /33EOOXNOOr*   c                     UR                   (       a  UR                   US'   UR                  (       a  UR                  US'   g g )Nr  r  )	max_value	min_value)r%   r   r   s      r'   r  AutoSchema._map_min_max  s1    ??!&GI??!&GI r*   c                    / n0 nUR                   R                  5        GHQ  n[        U[        R                  5      (       a  M%  UR
                  (       a1  UR                  (       d   UR                  U R                  U5      5        U R                  U5      nUR                  (       a  SUS'   UR                  (       a  SUS'   UR                  (       a  SUS'   UR                  b=  UR                  [        :w  a)  [        UR                  5      (       d  UR                  US'   UR                   (       a  [#        UR                   5      US'   U R%                  XE5        XSU R                  U5      '   GMT     SUS.nU(       a  X&S	'   U$ )
NTreadOnly	writeOnlynullabledefaultr$   r   )r   
propertiesr   )fieldsvaluesre   r   HiddenFieldr   partialr   get_field_namer
  	read_only
write_only
allow_nullr0  r   callabler   rf   map_field_validators)r%   r   r   r1  r   rC   results          r'   r   AutoSchema.map_serializer  s6   
&&--/E%!8!899~~j&8&8 3 3E :;^^E*F%)z"&*{#%)z"}}(U]]e-CHUZUbUbLcLc$)MMy!(+EOO(<}%%%e45;t**512) 0. $
 !):r*   c                    UR                    GH/  n[        U[        5      (       a  SUS'   [        U[        5      (       a  SUS'   [        U[        5      (       a+  UR
                  R                  R                  SS5      US'   Mx  [        U[        5      (       a3  Sn[        U[        R                  5      (       a  SnUR                  X$'   M  [        U[        5      (       a4  S	n[        U[        R                  5      (       a  S
nUR                  X$'   GM	  [        U[        5      (       a  UR                  US'   GM0  [        U[        5      (       a  UR                  US'   GMW  [        U[        5      (       d  GMo  [!        US["        R$                  5      (       a  GM  UR&                  (       a$  [)        SUR&                  S-
  S-  -   S-   5      US'   UR*                  (       d  GM  UR*                  nUR&                  b  UR&                  S:  a  XSR&                  -  n[-        US-  5      S-   US'   US   * US'   GM2     g)z
map field validators
r   r6   r   z\Zz\zr   	maxLengthmaxItems	minLengthminItemsr  r  r   r   r   r   r   r  Nr   r  )
validatorsre   r   r   r   regexr   replacer   r   r  limit_valuer
   r	   r   r   r   r   r  r  r   
max_digitsr   )r%   r   rC   v	attr_namedigitss         r'   r;  AutoSchema.map_field_validators(  s    !!A !^,,#*x !\**#(x !^,, %&GGOO$;$;E5$Iy!A122'	e[%:%:;; *I$%MM!A122'	e[%:%:;; *I$%MM!A011$%MMy!A011$%MMy!A/00'9<;`;`aa##+08H8H18LPS7S1SVY1Y+ZF<(<<<\\F''38H8H18L"2"22(+FSL(9A(=F9%)/	):(:F9%E "r*   c                     UR                   $ )zx
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'   r6  AutoSchema.get_field_nameP  s    
 r*   c                 N    [        U R                  SS 5      nU(       a  U" 5       $ g )Npagination_class)r   rS   )r%   rP  s     r'   r   AutoSchema.get_paginatorW  s%    "499.@$G#%%r*   c                 f    [        [        [        S5      U R                  R                  5      5      $ )N
media_type)r   mapr   rS   parser_classesr   s      r'   map_parsersAutoSchema.map_parsers]  s#    C
<0$))2J2JKLLr*   c                     / nU R                   R                   H?  n[        U[        R                  5      (       a  M$  UR                  UR                  5        MA     U$ rc   )rS   renderer_classes
issubclassr   BrowsableAPIRendererr   rS  )r%   rR   r.   media_typesrenderers        r'   map_renderersAutoSchema.map_renderers`  sM    		22H(I$B$BCCx223	 3
 r*   c                    U R                   n[        US5      (       d  g  UR                  5       $ ! [        R                   a=    [
        R                  " SR                  UR                  R                  X!5      5         g f = f)Nr   zt{}.get_serializer() raised an exception during schema generation. Serializer fields will not be generated for {} {}.)
rS   r   r   r   APIExceptionr4   r5   r6   rt   rY   )r%   rR   r.   rS   s       r'   r   AutoSchema.get_serializeri  st    yyt-..	&&((&& 	MM 1 "6$.."9"96HJ 	s   0 AB Bc                 $    U R                  X5      $ )zZ
Override this method if your view uses a different serializer for
handling request body.
r   r   s      r'   r   !AutoSchema.get_request_serializerx      
 ""400r*   c                 $    U R                  X5      $ )z]
Override this method if your view uses a different serializer for
populating response data.
rd  r   s      r'   r   "AutoSchema.get_response_serializer  rf  r*   c                 F    SSR                  U R                  U5      5      0$ )Nz$refz#/components/schemas/{})r6   r   )r%   r   s     r'   get_referenceAutoSchema.get_reference  s%    1889P9PQ[9\]^^r*   c                    US;  a  0 $ U R                  X5      U l        U R                  X5      n[        U[        R
                  5      (       d  0 nOU R                  U5      nSU R                   Vs0 s H  nUSU0_M
     sn0$ s  snf )N)PUTPATCHPOSTr   rC   )rV  request_media_typesr   re   r   r   rj  )r%   rR   r.   r   item_schemacts         r'   r   AutoSchema.get_request_body  s    11I#'#3#3D#A 00>
*k&<&<==K,,Z8K 222B X{++2
 	
s   2Bc                    US:X  a  SSS00$ U R                  X5      U l        U R                  X5      n[        U[        R
                  5      (       d  0 nOU R                  U5      n[        XU R                  5      (       a.  SUS.nU R                  5       nU(       a  UR                  U5      nOUnUS:X  a  SOS	nUU R                   Vs0 s H  nUS
U0_M
     snSS.0$ s  snf )NDELETE204r$   r!   r   r   ro  201200rC   )r   r$   )r^  response_media_typesr   re   r   r   rj  r   rS   r   get_paginated_response_schema)	r%   rR   r.   r   rq  response_schemar   status_coderr  s	            r'   r   AutoSchema.get_responses  s   X!2  %)$6$6t$D!11$?
*k&<&<==K,,Z8Kdii00$O **,I"+"I"I/"Z)O%/eU #777 ?337  "	
 	
s   C!c                     U R                   (       a  U R                   $ UR                  S5      (       a  USS  nUR                  S5      S   R                  SS5      /$ )Nr<   r   r   rP   -)rn   rH   r   rE  r   s      r'   r   AutoSchema.get_tags  sR    ::::
 ??38D

3"**3455r*   )rn   rp   ro   rp  ry  )NNN)$rY   rZ   r[   r\   rr   rp  ry  r   rD   r   rE   r   r   r   r   r   r   r   r   r
  r  r   r;  r6  r   rV  r^  r   r   r   rj  r   r   r   r]   __classcell__)rt   s   @r'   r_   r_   t   s    
   N(.2J$L "HC
?8NP`1"H&;P M11_
('
R6 6r*   r_   )*r   r4   r   r   operatorr   urllib.parser   django.core.validatorsr   r   r   r	   r
   r   r   r   	django.dbr   django.utils.encodingr   rest_frameworkr   r   r   rest_framework.compatr   r   rest_framework.fieldsr   r   rest_framework.settingsr   
generatorsr   
inspectorsr   utilsr   r   r   r_   rX   r*   r'   <module>r     sa    	         + = = 9 : 0 + % 3W) Wx]	6 ]	6r*   