
    "+h03                        d dl Z d dl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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mZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z%  G d de          Z
 G d de	          Z&dS )    N)
URLPatternURLResolver)viewsviewsets)BaseSchemaGenerator)EndpointEnumerator)api_settings)add_trace_messageerrorget_overridereset_generator_statswarn)OpenApiViewExtension)
AutoSchema)ComponentRegistryalpha_operation_sorterbuild_root_objectcamelize_operation	get_classis_versioning_supportedmodify_for_versioningnormalize_result_objectoperation_matches_versionprocess_webhookssanitize_result_object)spectacular_settingsc                   2     e Zd ZddZ fdZd Zd Z xZS )r   N c                    |                      ||          }t          j        D ]} ||          }i }|D ]\  }}}}	||f|vr||||	f|||f<   t          |                                          }t          t          j                  rt          |t          j                  S t          j        rt          |t                    S |S )N)	endpoints)key)	_get_api_endpointsr   PREPROCESSING_HOOKSlistvaluescallableSORT_OPERATIONSsortedr   )
selfpatternsprefixapi_endpointshookapi_endpoints_deduplicatedpath
path_regexmethodcallbacks
             ^/var/www/html/e360mart/e360mart_env/lib/python3.11/site-packages/drf_spectacular/generators.pyget_api_endpointsz$EndpointEnumerator.get_api_endpoints   s    //&AA(< 	: 	:D D=999MM%'"2? 	` 	`.D*fhf~%???<@*fV^;_*4<87>>@@AA(899 	!--A-QRRRR!1 	!--CDDDD      c                 v    t                                          |          }|                    dd          }|S )Nz\..)superget_path_from_regexreplace)r)   r0   r/   	__class__s      r3   r9   z&EndpointEnumerator.get_path_from_regex,   s2    ww**:66||E3''r5   c                    || j         }g }|D ]}|t          |j                  z   }t          |t                    rf|                     |          }|j        }|                     ||          r3|                     |          D ]}||||f}	|	                    |	           t          |t                    r1|                     |j        |          }
|                    |
           |S )z
        Return a list of all available API endpoints by inspecting the URL conf.
        Only modification the DRF version is passing through the path_regex.
        N)r*   r+   )r*   strpattern
isinstancer   r9   r2   should_include_endpointget_allowed_methodsappendr   r"   url_patternsextend)r)   r*   r+   r,   r>   r0   r/   r2   r1   endpointnested_endpointss              r3   r"   z%EndpointEnumerator._get_api_endpoints2   s   
 }H 	7 	7G#go"6"66J':.. 7//
;;"+//h?? 7"&":":8"D"D 7 7$(*fh#G%,,X6666G[11 7#'#:#:$1% $; $ $  $$%5666r5   c                 V   t          |d          rat          |j                  }d|j        v rt          |j        d                   }nt          |j        j                  }d ||z  D             }n-i }d|j        v r|j        d         |d<    |j        di |j        }d |D             S )Nactionshttp_method_namesc                 6    g | ]}|                                 S  )upper.0r1   s     r3   
<listcomp>z:EndpointEnumerator.get_allowed_methods.<locals>.<listcomp>W   s     PPP&v||~~PPPr5   c                     g | ]}|d v|	S ))OPTIONSHEADTRACECONNECTrK   rM   s     r3   rO   z:EndpointEnumerator.get_allowed_methods.<locals>.<listcomp>`   s.     
 
 
DDD DDDr5   rK   )hasattrsetrH   
initkwargsclsrI   allowed_methods)r)   r2   rH   rI   methodskwargss         r3   rA   z&EndpointEnumerator.get_allowed_methodsO   s    8Y'' 	=(*++G"h&999$'(;<O(P$Q$Q!!$'(F$G$G!PPG>O4OPPPGG F"h&999.6.ABU.V*+"hl,,V,,<G
 
!(
 
 
 	
r5   )Nr   )__name__
__module____qualname__r4   r9   r"   rA   __classcell__r;   s   @r3   r   r      sj        ! ! ! !(      :
 
 
 
 
 
 
r5   r   c                   R     e Zd ZeZ fdZ fdZd
 fd	Zd Zd Z	d Z
dd	Z xZS )SchemaGeneratorc                     t                      | _        |                    dd           | _        d | _         t                      j        |i | d S )Napi_version)r   registrypoprd   	inspectorr8   __init__)r)   argsr[   r;   s      r3   rh   zSchemaGenerator.__init__i   sO    )++!::mT::$)&)))))r5   c                     t                                          |||          }t          j        rt	          j        dd|          }|S )zv
        Customized coerce_path which also considers the `_pk` suffix in URL paths
        of nested routers.
        z
{(\w+)_pk}z{\1_id})r>   replstring)r8   coerce_pathr   SCHEMA_COERCE_PATH_PK_SUFFIXresub)r)   r/   r1   viewr;   s       r3   rm   zSchemaGenerator.coerce_patho   sG    
 ww""466< 	O6-jNNNDr5   Nc                 .   t          j        |j                  }|r |j        }|                                |_        t	                                          ||d          }d|_        |r||_        t          |t          j	                  rt          ||j                  }nNt          |t          j                  r#t          ||                                          }nt          d           |S t          |di                               dd          }|s|S t#          |          }	t#          |j        j                  }
t'          |	|
          s7t)          d |	j        D                       |
j        z   }t-          d|i           }	 |	            |_        |S )a  
        customized create_view which is called when all routes are traversed. part of this
        is instantiating views with default params. in case of custom routes (@action) the
        custom AutoSchema is injected properly through 'initkwargs' on view. However, when
        decorating plain views like retrieve, this initialization logic is not running.
        Therefore forcefully set the schema if @extend_schema decorator was used.
        NTzUsing not supported View class. Class must be derived from APIView or any of its subclasses like GenericApiView, GenericViewSet.r[   schemac              3   @   K   | ]}|t           j        j        v|V  d S N)r	   DEFAULT_SCHEMA_CLASS__mro__)rN   rX   s     r3   	<genexpr>z.SchemaGenerator.create_view.<locals>.<genexpr>   s?        l?GGG GGGG r5   ExtendedRearrangedSchema)r   	get_matchrX   view_replacementr8   create_viewswagger_fake_viewr?   r   ViewSetMixingetattractionr   APIViewlowerr   getr   rs   
issubclasstuplerw   type)r)   r2   r1   requestoverride_vieworiginal_clsrq   r   action_schemaaction_schema_classview_schema_classmror;   s               r3   r|   zSchemaGenerator.create_viewy   s    -6x|DD 	<#<L(99;;HL ww""8VT:: "&  	('HLdH122 		T4;//FFem,, 	T6<<>>22FFP   K"5599(DII 	K (66%hl&9::-/@AA 	L   2:     ")*C #''A3"K"K))++r5   c                     | j         E|                     | j        | j                  | _        | j                                        | _         d S d S ru   )r    endpoint_inspector_clsr*   urlconfrg   r4   )r)   s    r3   _initialise_endpointsz%SchemaGenerator._initialise_endpoints   sF    >!!88UUDN!^==??DNNN "!r5   c                     g }| j         D ]M\  }}}}|                     ||          }|                     |||          }|                    ||||f           N|S )zY
        Generate (path, method, view) given (path, method, callback) for paths.
        )r    r|   rm   rB   )r)   view_endpointsr/   r0   r1   r2   rq   s          r3   _get_paths_and_endpointsz(SchemaGenerator._get_paths_and_endpoints   sw     26. 	D 	D.D*fh##Hf55D##D&$77D!!4VT"BCCCCr5   c           	      &   i }|                                   |                                 }t          j        mt	          t          d |D                                 dk    }|r>t          j                            d |D                       }t          j
        |          }nd}nt          j        }|                    d          sd|z   }|D ]C\  }}}	}
t          |
dg           D ]}t          |           t          |
dg           D ]}t          |           t          j        |	||
|          |
_        |s|                     ||	|
          s|
j        r-t'          |
j                  st          d	|
j         d
           nL|
j        rE| j        p|
j        j        }|st-          | j        j        |	||
|          }t3          |
|          st5          |
j        t8                    sJ d|
j         d            t=          t?          |
d|
                    5  |
j                             ||||	| j!                  }ddd           n# 1 swxY w Y   |st          j"        r"t          j#        |d|t          j$                  }t          j%        rt          j%        |z   }|                    d          sd|z   }t          j&        rtO          ||          \  }}|(                    |i            |||         |	)                                <   E|S )z: Iterate endpoints generating per method path operations. Nc                 &    g | ]\  }}}}|j         S rK   r`   )rN   _rq   s      r3   rO   z)SchemaGenerator.parse.<locals>.<listcomp>   s"    )X)X)X]Q1d$.)X)X)Xr5      c                     g | ]	\  }}}}|
S rK   rK   )rN   r/   r   s      r3   rO   z)SchemaGenerator.parse.<locals>.<listcomp>   s     1V1V1V=4Aq$1V1V1Vr5   /^warningserrorsz$using unsupported versioning class "z.". view will be processed as unversioned view.z%Incompatible AutoSchema used on View z. Is DRF's DEFAULT_SCHEMA_CLASS pointing to "drf_spectacular.openapi.AutoSchema" or any other drf-spectacular compatible AutoSchema?r;   r   )r>   rk   rl   flags)*r   r   r   SCHEMA_PATH_PREFIXlenrV   osr/   
commonpathro   escape
startswithr   r   r   GET_MOCK_REQUESTr   has_view_permissionsversioning_classr   rd   default_versionr   rg   r*   r   r?   rs   r   r;   r
   r   get_operationre   SCHEMA_PATH_PREFIX_TRIMrp   
IGNORECASESCHEMA_PATH_PREFIX_INSERTCAMELIZE_NAMESr   
setdefaultr   )r)   input_requestpublicresultr    non_trivial_prefixpath_prefixr/   r0   r1   rq   weversion	operations                  r3   parsezSchemaGenerator.parse   s   ""$$$1133	2: "%S)X)Xi)X)X)X%Y%Y!Z!Z]^!^! " g001V1VI1V1V1VWW i44!.AK%%c** 	,+K.7 7	5 7	5*D*fd!$
B77  Q!$"55  a/@tUbccDL d77fdKK $ -DTEZ-[-[ 64;P 6 6 6    & 	$ =,<   ,T^-DfdTXZabb0w?? dk:66  G G G G 6
 #74d#C#CDD   K55*k64= 	                #; ^vk4r}]]]#= M+EL??3'' "Tz#2 F"4T9"E"EidB'''+4F4L((s   $II	I	Fc           
         t                       t          |                     ||          | j                            t
          j                  t          t
          j        | j                  | j	        pt          |dd                    }t
          j        D ]} ||| ||          }t          t          |                    S )z Generate a OpenAPI schema. r   N)paths
componentswebhooksr   )r   	generatorr   r   )r   r   r   re   buildr   APPEND_COMPONENTSr   WEBHOOKSrd   r   POSTPROCESSING_HOOKSr   r   )r)   r   r   r   r-   s        r3   
get_schemazSchemaGenerator.get_schema  s    "**Wf--}**+?+QRR%&:&CT]SS$ID(I(I	
 
 
 )= 	Y 	YDT4QWXXXFF%&=f&E&EFFFr5   ru   )NF)r\   r]   r^   r   r   rh   rm   r|   r   r   r   r   r_   r`   s   @r3   rb   rb   f   s        /* * * * *    > > > > > >@@ @ @

 
 
M M M^G G G G G G G Gr5   rb   )'r   ro   django.urlsr   r   rest_frameworkr   r   !rest_framework.schemas.generatorsr   r   BaseEndpointEnumeratorrest_framework.settingsr	   drf_spectacular.drainager
   r   r   r   r   drf_spectacular.extensionsr   drf_spectacular.openapir   drf_spectacular.plumbingr   r   r   r   r   r   r   r   r   r   r   drf_spectacular.settingsr   rb   rK   r5   r3   <module>r      s   				 				 / / / / / / / / * * * * * * * * A A A A A A Z Z Z Z Z Z 0 0 0 0 0 0              < ; ; ; ; ; . . . . . .                         
 : 9 9 9 9 9L
 L
 L
 L
 L
/ L
 L
 L
^G G G G G) G G G G Gr5   