o
    "i                  	   @   sf  U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	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mZmZmZmZmZmZmZmZmZmZ ejdkrid dlmZ nd dl mZ d dl!Z!d dl"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/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ d dl?mAZB d dlCmDZDmEZEmFZFmGZGmHZH d dlImJZJ d dlKmLZL d dlMmNZN d dlOmPZP d dlQmRZR d dlSmTZT d dlUmVZVmWZW d dl"mXZX d dlYmZZZm[Z[m\Z\m]Z] d dl^m_Z_ d dl`maZambZbmcZcmdZdmeZe d d lfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZn zd d!lompZp W n eqyZ   G d"d# d#ZpY nw ered$roeejsfZteed%f eud&< nefZtd'Zveed%f eud(< d'Zweed%f eud)< d'Zxeed%f eud*< ejd+krd d,lmyZz d d-lm{Z| evezf7 Zvewe|f7 Zwejd.krd d/lm}Z} exe}f7 Zxzd d,l myZ~ d d-l m{Z eve~f7 Zvewef7 ZwW n
 eqy   Y nw ejd+krej<e<fZne<fZed0ZG d1d2 d2ZG d3d4 d4eZd5efd6d7Zd8d9 Zdd5een fd;d<Zd=ed5eek fd>d?Zd=efd@dAZd5efdBdCZd=ed5een fdDdEZd=ed5eej fdFdGZdd=ed5eee fdIdJZd5efdKdLZdMedNed5efdOdPZddQdRZeZdSdT ZddUdVZd5efdWdXZd5eeef fdYdZZeZd[d\ Zd]d^ Zd_d` Zd=eeeedf d5eem fdadbZddcemd5emfdddeZ			ddfeem dgee d5emfdhdiZdd5emfdjdkZdleeg d5emfdmdnZ	:				:				H		ddoedcemdpeld5emfdqdrZd5emfdsdtZd5efdudvZddwdxZd5emfdydzZdcemd5emfd{d|Zdcemd}emd5emfd~dZdee fddZdd ZdddZdd Zdd ZG dd dZG dd dZG dd dZG dd dee edZded5efddZdd Ze defddZded5efddZded5efddZdd Zdd Zd5efddZd5efddZdd Zdee d5ee fddZded5eeef fddZeZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd5efddZded5efddÄZddń ZddǄ Zd5efddɄZdd˄ Zdd=edeeee   d5efdd΄ZdedefddфZdefddԄZddք Zd5ejeef fdd؄Zdeei defdd܄ZdS )    N)ABCMeta)OrderedDictdefaultdict)Decimal)Enum)AnyDefaultDictDictGenericListOptionalSequenceTupleTypeTypeVarUnion)   
   )	TypeGuard)apps)
LOOKUP_SEP)ForwardManyToOneDescriptorManyToManyDescriptorReverseManyToOneDescriptorReverseOneToOneDescriptor)ForeignObjectRel)Query)get_converters)_PATH_PARAMETER_COMPONENT_RERegexPatternResolver404RoutePattern
URLPatternURLResolverget_resolver)Promisecached_property)import_string)get_language)gettext_lazy)
exceptionsfieldsmixinsserializers
versioning)unicode_http_header)empty)api_settings)APIRequestFactory)JSONEncoder)
_MediaType)
ReturnDict
ReturnList)URITemplate)cacheerrorget_overridewarn)spectacular_settings)DJANGO_PATH_CONVERTER_MAPPINGOPENAPI_TYPE_MAPPINGPYTHON_TYPE_MAPPINGOpenApiTypes_KnownPythonTypes)OpenApiExampleOpenApiParameterOpenApiWebhook
_FieldType_ListSerializerType_ParameterLocationType_SchemaType_SerializerType)Choicesc                   @      e Zd ZdS )rJ   N__name__
__module____qualname__ rP   rP   ]/var/www/html/crm_dreinet/venv_linux/lib/python3.10/site-packages/drf_spectacular/plumbing.pyrJ   C       rJ   	UnionType.UNION_TYPESrP   LITERAL_TYPESTYPED_DICT_META_TYPESTYPE_ALIAS_TYPESr      )Literal)_TypedDictMeta)r      )TypeAliasTypeTc                   @   rK   )	_SentinelNrL   rP   rP   rP   rQ   r_   j   rR   r_   c                   @   rK   )UnableToProceedErrorNrL   rP   rP   rP   rQ   r`   n   rR   r`   returnc                 C   s   t | r| S | jS N)inspectisclass	__class__objrP   rP   rQ   	get_classr      rh   c                 C   s*   t | s| S t| tjtjfr|  S | S rb   )rc   rd   
issubclassr-   BaseSerializerr+   Field)serializer_or_fieldrP   rP   rQ   force_instancev   s
   
rn   Fc                 C   s0   ddl m} tt| tjpt|| o| S )Nr   )OpenApiSerializerExtension)drf_spectacular.extensionsro   
isinstancern   r-   rk   bool	get_match)rg   strictro   rP   rP   rQ   is_serializer   s   ru   rg   c                 C   s   t t| tjS rb   )rq   rn   r-   ListSerializerrf   rP   rP   rQ   is_list_serializer   s   rw   c                 C   s"   t | rt| S t| d| jdS )NT)manycontext)rw   rn   rh   ry   rf   rP   rP   rQ   get_list_serializer   s   "rz   c                 C   s"   t | ddott| jtjjuS )NT)rt   )ru   rh   rz   to_representationr-   rv   rf   rP   rP   rQ   is_list_serializer_customized   s
   r|   c                 C   s   t | ot|  S rb   )ru   rw   rf   rP   rP   rQ   is_basic_serializer   s   r}   c                 C   s   t t| tjot|  S rb   )rq   rn   r+   rl   ru   rf   rP   rP   rQ   is_field   s   r~   Tc                 C   s>   t | tjjs	dS |s| d u s| tju rdS | t v p| tv S NF)rq   collectionsabcHashabler@   NONEget_openapi_type_mappingr?   )rg   
allow_nonerP   rP   rQ   is_basic_type   s
   r   c                 C   s4   t tjot| dd ot| dd  otjo|dk S )Npartial	read_onlyresponse)rr   r<   COMPONENT_SPLIT_PATCHgetattrCOMPONENT_SPLIT_REQUEST)
serializer	directionrP   rP   rQ   is_patched_serializer   s   
r   abc                 C   sH   | pd   dddd} |pd   dddd}| |kS )N  _-)striplowerreplace)r   r   rP   rP   rQ   is_trivial_string_variation   s     r   c                 C   s   t | sJ d|  dd S )Nz\internal assumption violated because we expected a basic serializer here and instead got a "z". This may be the result of another app doing some unexpected magic or an invalid internal call. Feel free to report this as a bug at https://github.com/tfranzel/drf-spectacular/issues)r}   )r   rP   rP   rQ   assert_basic_serializer   s
   
r   c                     sp   ddl m m} m tt| jgdd ttD fddtD  fddt D dd tt	D S )Nr   )genericsviewsviewsetsc                 S       g | ]}| d rtt|qS )
Serializer)endswithr   r-   .0crP   rP   rQ   
<listcomp>        z(get_lib_doc_excludes.<locals>.<listcomp>c                        g | ]}| d rt |qS )ViewSetr   r   r   )r   rP   rQ   r      r   c                    r   )APIViewr   r   )r   rP   rQ   r      r   c                 S   r   )Mixin)r   r   r,   r   rP   rP   rQ   r      r   )
rest_frameworkr   r   r   objectdictr   dirr-   r,   )r   rP   )r   r   rQ   get_lib_doc_excludes   s   r   c              
   C   sv   t t | dddd}|dur|S z|  jW S  ty: } z|r/td| d W Y d}~dS W Y d}~dS d}~ww )z
    obtain model from view via view's queryset. try safer view attribute first
    before going through get_queryset(), which may perform arbitrary operations.
    querysetNmodela  Failed to obtain model through view's queryset due to raised exception. Prevent this either by setting "queryset = Model.objects.none()" on the view, checking for "getattr(self, "swagger_fake_view", False)" in get_queryset() or by simply using @extend_schema. (Exception: ))r   get_querysetr   	Exceptionr;   )viewemit_warningsr   excrP   rP   rQ   get_view_model   s   r   c                    s   dt dt fdd}t s|t pdS dd t fdd	t D } jd
| D ]}|jr?|t	|j  S q0dS )zR get doc string with fallback on obj's base classes (ignoring DRF documentation). docra   c                 S   s   d dd |  dD S )N
c                 s   s    | ]}|  V  qd S rb   )rstrip)r   linerP   rP   rQ   	<genexpr>       z0get_doc.<locals>.post_cleanup.<locals>.<genexpr>)joinr   split)r   rP   rP   rQ   post_cleanup   s   zget_doc.<locals>.post_cleanupr   c                 S   s(   z|  |W S  ty   td Y S w )Ninf)index
ValueErrorfloat)lstitemrP   rP   rQ   
safe_index   s
   zget_doc.<locals>.safe_indexc                 3   s    | ]	} j |V  qd S rb   )__mro__r   rg   r   rP   rQ   r      s    
zget_doc.<locals>.<genexpr>N)
strrc   rd   getdocminr<   GET_LIB_DOC_EXCLUDESr   __doc__cleandoc)rg   r   lib_barrierclsrP   r   rQ   get_doc   s   
r   c                 C   s   t | tjr	| j} t| S )z: unpack wrapped partial object and use actual func object )rq   	functoolsr   functypingget_type_hintsrf   rP   rP   rQ   r     s   
r   c                   C   s   i t tjt iS rb   )r>   r@   OBJECTbuild_generic_typerP   rP   rP   rQ   r     s
   r   c                 C   s2   t | tjstd| j dtj d t| tjS )Nz&Failed to obtain queryset from model "z" because manager "zS" was not found. You may need to change the DEFAULT_QUERY_MANAGER setting. bailing.)hasattrr<   DEFAULT_QUERY_MANAGERr9   rM   r   )r   rP   rP   rQ   get_manager  s   
r   c                   C   s0   t jd u r	ddiS t jdkrdddS di dS )Ntyper   rr   T)r   additionalProperties)r<   GENERIC_ADDITIONAL_PROPERTIESrP   rP   rP   rQ   r     s
   



r   c                 C   sr   t  }| du st| du s| tju rdS | |v rt||  S | tv r*t|t|   S td|  d t|tj S )zW
    resolve either enum or actual type and yield schema template for modification
    Nzcould not resolve type for "z". defaulting to "string")r   r   r@   r   r   r?   r;   STR)rg   openapi_type_mappingrP   rP   rQ   build_basic_type#  s   r   schemac                 C   s.   d| d} |d ur|| d< |d ur|| d< | S )Narray)r   items	minLength	maxLengthrP   )r   
min_length
max_lengthrP   rP   rQ   build_array_type3  s   
r   
propertiesdescriptionc                 K   sX   ddi}|r|  |d< | r| |d< d|v r|d|d< |r%t||d< || |S )Nr   r   r   r   r   required)r   popsortedupdate)r   r   r   kwargsr   rP   rP   rQ   build_object_type<  s   
r   c                 C   s$   d| i}|r
||d< |r||d< |S )Nr   examplesencodingrP   )r   r   r   media_type_objectrP   rP   rQ   build_media_type_objectO  s   r   r   c                 C   s   i }| D ]?}t |jdd}i }|jtur|j|d< |jr$|j|d< |jr-|j|d< n
||jkr7|j|d< |jr?|j|d< |||< q|S )Nr   r   valueexternalValuesummaryr   )	
inflectioncamelizenamer   r   r0   external_valuer   r   )r   r   examplenormalized_name
sub_schemarP   rP   rQ   build_examples_listX  s    






r  r   locationc                    sp  ddg |t jkr ddg7  ||  fdd| D d}|r$||d< |s*|d	kr.d
|d< |r4d
|d< |d ur<||d< |	d urD|	|d< |rf|d ddkr\t|td|d d d< n
t|td|d d< |d ur|d ddkr|||d d d< n||d d< |
d urd vr|
|d d< |s|d ddkr|d dd|d d< |r||d< |r|t| |S )NreadOnly	writeOnlynullabledefaultc                    s   i | ]\}}| vr||qS rP   rP   r   kvirrelevant_field_metarP   rQ   
<dictcomp>      z(build_parameter_type.<locals>.<dictcomp>)inr   r   r   pathTr   
deprecatedexplodestyler   r   r   )keyr   enumpatternstringr      r   )rC   PATHr   getr   r   r   !sanitize_specification_extensions)r   r   r  r   r   r  r  r  r  r  r  allow_blankr   
extensionsrP   r
  rQ   build_parameter_typek  sD   
r  c                 C   s   t t| j}| jrd|vr|d |sd }n2tdd |D r%d}n&tdd |D r1d}ntdd |D r=d}ntd	d |D rId
}nd }| jrWd |vrW|d  d|i}|ra||d< tj	rmt
| j |d< tdd | j D |d< |S )Nr   c                 s       | ]}t |tV  qd S rb   )rq   rr   r   choicerP   rP   rQ   r         z%build_choice_field.<locals>.<genexpr>booleanc                 s   r  rb   )rq   intr  rP   rP   rQ   r     r!  integerc                 s   s     | ]}t |tttfV  qd S rb   )rq   r#  r   r   r  rP   rP   rQ   r         numberc                 s   r  rb   )rq   r   r  rP   rP   rQ   r     r!  r  r  r   r   c                 S       g | ]\}}|d vr||fqS )r   NrP   r  rP   rP   rQ   r     r   z&build_choice_field.<locals>.<listcomp>zx-spec-enum-id)listr   fromkeyschoicesr  appendall
allow_nullr<    ENUM_GENERATE_CHOICE_DESCRIPTIONbuild_choice_description_listr   	list_hash)fieldr+  r   r   rP   rP   rQ   build_choice_field  s0   


r3  c                 C   s   d dd | D S )Nr   c                 s   s$    | ]\}}d | d| V  qdS )z* `z` - NrP   r   r   labelrP   rP   rQ   r        " z0build_choice_description_list.<locals>.<genexpr>)r   )r+  rP   rP   rQ   r0    ri   r0  c                 C   sh   |  dr| dd } | dd } |dkr)| dkr)dd	d
|r&d|iS i S dd| td| dS )zM Either build a bearer scheme or a fallback due to OpenAPI 3.0.3 limitations HTTP_   Nr   r   BearerAuthorizationhttpbearer)r   schemebearerFormatapiKeyheaderz4Token-based authentication with required prefix "%s")r   r  r   r   )
startswithr   
capitalizer   )header_nametoken_prefixbearer_formatrP   rP   rQ   #build_bearer_security_scheme_object  s(   

rF  c                 C   s   t }|jr|r|j d| d}n|jp|pd}|j|j|dt|ji | |j|dt|j}|jr=|j|d d< |j	rG|j	|d d< |j
rQ|j
|d d	< |jr[|j|d d
< |jrc|j|d< |jrk|j|d< |jrs|j|d< |ry||d< |S )N (r   r   )titleversion)openapiinfopaths
componentsrK  r   termsOfServicecontactlicenseserverstagsexternalDocswebhooks)r<   VERSIONOAS_VERSIONTITLEr  EXTENSIONS_INFOAPPEND_PATHSEXTENSIONS_ROOTDESCRIPTIONTOSCONTACTLICENSESERVERSTAGSEXTERNAL_DOCS)rL  rM  rT  rI  settingsrootrP   rP   rQ   build_root_object  s@   
	


rd  c                 C   s`   d| v rt | dkrdd| digi| S d| v r.t | dkr.t | d dkr.| d d S | S )z
    ensure that $ref has its own context and does not remove potential sibling
    entries when $ref is substituted. also remove useless singular "allOf" .
    $refr  allOfr   )lenr   )r   rP   rP   rQ   safe_ref  s
   $rh  metac                 C   s&  t jdr|  } | }|dd }| dd }|s|rmd| v r=t| d tr2| d dg| d< n;g | d d| d< n0d| v rJd| ddigi} n#t| dkr^d| v r^| d ddi n| sidi ddigi} nJ d	d
| v r|d| v r|| d| d
< d| v rd| v r| d| d< t	i | |S )Nz3.1r  r   nullre  oneOfr  FzInvalid nullable caseexclusiveMinimumminimumexclusiveMaximummaximum)
r<   rV  rA  copyr   rq   r   rg  r,  rh  )r   ri  schema_nullablemeta_nullablerP   rP   rQ   append_meta  s,   rs  r  c              	   C   sn  t | |d d}t|dkrat|tr|jS t|tr|jS t|r$|S t|tr4|j	r0|j
jS |jjS t|tr=|jjS t|trF|j
jS t|trO|jjS | j|d }t|tr_|jS |S t|tft smt|rt|trxt|j}nt|trt|j}nt|}|std|d  d|  dd| dt||dd S | j|d j}t||dd S )	zh
        navigate through root model via given navigation path. supports forward/reverse relations.
    r   Nr  z=could not follow field source through intermediate property "z" on model zb. Please add a type hint on the model's property/function to enable traversal of the source path ".z".)r   rg  rq   propertyfgetCACHED_PROPERTY_FUNCSr   callabler   reversereltarget_fieldr2  r   relatedr   r   _meta	get_fieldr   _follow_return_typer`   r   _follow_field_sourcerelated_model)r   r  field_or_propertyr2  target_modelrP   rP   rQ   r  <  sT   








r  c                 C   sh   t | d}|d u r|S t|\}}|tv r2dd |D }t|dkr.td| d |S |d S |S )Nra   c                 S      g | ]
}|t d ur|qS rb   r   r   argrP   rP   rQ   r   z      z'_follow_return_type.<locals>.<listcomp>r  zOcould not traverse Union type, because we don't know which type to choose from z|. Consider terminating "source" on a custom property that indicates the expected Optional/Union type. Defaulting to "string"r   )r   r  _get_type_hint_originrT   rg  r;   )
a_callabletarget_typeoriginargs	type_argsrP   rP   rQ   r  t  s   r  c                 C   s   zt | |W S  ty } z|rt| W Y d}~n)d}~w tyB } z|r8td|  dd| d| d W Y d}~nd}~ww dtfdd	}|pM|S )
z
    a model traversal chain "foreignkey.foreignkey.value" can either end with an actual model field
    instance "value" or a model property function named "value". differentiate the cases.

    :return: models.Field or function object
    Nz!could not resolve field on model z with path "rt  z". This is likely a custom field that does some unknown magic. Maybe consider annotating the field/property? Defaulting to "string". (Exception: r   ra   c                 S   s   d S rb   rP   rf   rP   rP   rQ   dummy_property  s   z+follow_field_source.<locals>.dummy_property)r  r`   r;   r   r   r   )r   r  r  r   er   r  rP   rP   rQ   follow_field_source  s"   r  c                 C   s.   t | }|t}||| \}}}}|S )z
    Follow a model lookup `foreignkey__foreignkey__field` in the same
    way that Django QuerySet.filter() does, returning the final models.Field.
    )r   r   r   names_to_pathget_meta)r   lookupquerylookup_splittedr   r2  rP   rP   rQ   follow_model_field_lookup  s   
r  c                 C   sR   | \}}}}dddddd |d}|dr|d	d
 d }|dd}||fS )zE sort endpoints first alphanumerically by path, then by method order r   r     r      )GETPOSTPUTPATCHDELETEr8  /Nr   {!)r  r   r   )endpointr  
path_regexmethodcallbackmethod_priorityrP   rP   rQ   alpha_operation_sorter  s   
	r  c                   @   sr   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdddZdd Zedeeef fddZedefddZdS )ResolvedComponentschemas	responses
parametersr   requestBodiesheaderssecuritySchemeslinks	callbacks	pathItemsNc                 C   s   || _ || _|| _|| _d S rb   )r   r   r   r   )selfr   r   r   r   rP   rP   rQ   __init__  s   
zResolvedComponent.__init__c                 C   s   t | jo	| jo	| jS rb   )rr   r   r   r   r  rP   rP   rQ   __bool__  s   zResolvedComponent.__bool__ra   c                 C   s   | j | jfS rb   )r   r   r  rP   rP   rQ   r    s   zResolvedComponent.keyc                 C   s$   |   sJ dd| j d| j iS )Nre  z#/components/r  )r  r   r   r  rP   rP   rQ   ref  s   zResolvedComponent.refNN)rM   rN   rO   SCHEMARESPONSE	PARAMETEREXAMPLEREQUEST_BODYHEADERSECURITY_SCHEMALINKCALLBACK	PATH_ITEMr  r  ru  r   r   r  rH   r  rP   rP   rP   rQ   r    s"    
r  c                   @   s    e Zd ZdZdd Zdd ZdS )ComponentIdentityz@ A container class to make object/component comparison explicit c                 C   
   || _ d S rb   rf   )r  rg   rP   rP   rQ   r       
zComponentIdentity.__init__c                 C   s    t |tr| j|jkS | j|kS rb   )rq   r  rg   )r  otherrP   rP   rQ   __eq__  s   

zComponentIdentity.__eq__N)rM   rN   rO   r   r  r  rP   rP   rP   rQ   r    s    r  c                   @   sf   e Zd ZdddZdeddfddZdeddfdd	Zd
d ZdefddZdd Z	de
fddZdS )ComponentRegistryra   Nc                 C   s
   i | _ d S rb   )_componentsr  rP   rP   rQ   r    r  zComponentRegistry.__init__	componentc                 C   s:   || v rt d|j d| j|j j d || j|j< d S )Nztrying to re-register a z component with name zB. this might lead to a incorrect schema. Look out for reused names)r;   r   r  r  r   r  r  rP   rP   rQ   register  s   
zComponentRegistry.registerc                 C   s   || vr|| j |j< d S d S rb   )r  r  r  rP   rP   rQ   register_on_missing  s   z%ComponentRegistry.register_on_missingc                 C   s   |j | jvrdS |j}| j|j  j}t|tst|r|}n|j}t|ts,t|r/|}n|j}t|ddp=t|dd}||krS|sSt	d|j
 d| d| d dS )NFsuppress_collision_warningz/Encountered 2 components with identical names "z" and different identities z and zH. This will very likely result in an incorrect schema. Try renaming one.T)r  r  r   rq   r  rc   rd   re   r:   r;   r   )r  r  	query_objregistry_objquery_idregistry_idr  rP   rP   rQ   __contains__  s,   

zComponentRegistry.__contains__c                 C   s   t |tr|j}| j| S rb   rq   r  r  r  r  r  rP   rP   rQ   __getitem__  s   

zComponentRegistry.__getitem__c                 C   s   t |tr|j}| j|= d S rb   r  r  rP   rP   rQ   __delitem__  s   
zComponentRegistry.__delitem__c                    st   t t | j D ]}|j |j |j< q	| D ]\}}| D ]
\}}| | |< q!q fddt 	 D S )Nc                    s.   i | ]   fd dt    D qS )c                    s   i | ]	}|  | qS rP   rP   )r   r   )outputr   rP   rQ   r  -      z6ComponentRegistry.build.<locals>.<dictcomp>.<dictcomp>)r   keys)r   r  r  rQ   r  ,  s     z+ComponentRegistry.build.<locals>.<dictcomp>)
r   r   r  valuesr   r   r   r   r   r  )r  extra_componentsr  
extra_typeextra_component_dictcomponent_namecomponent_schemarP   r  rQ   build"  s   

zComponentRegistry.buildra   N)rM   rN   rO   r  r  r  r  r  r  r  rH   r  rP   rP   rP   rQ   r    s    
	r  c                       s   e Zd ZU g Zeee  ed< dZe	de
ee f ed< dZdZdZ fddZdd	 Zed
d ZededefddZedee fddZ  ZS )OpenApiGeneratorExtension	_registryNtarget_classFr   c                    s"   t  jdi | | j|  d S )NrP   )super__init_subclass__r  r,  )r   r   re   rP   rQ   r  9  s   z+OpenApiGeneratorExtension.__init_subclass__c                 C   r  rb   )target)r  r  rP   rP   rQ   r  =  r  z"OpenApiGeneratorExtension.__init__c                    s   z	t  j _W d S  ty6   tj }t fdd|D r0 js0td j	 d j d d  _Y d S  t
yp } z/tj }t fdd|D rbtd|jj	 d j d	 j	 d
| d	 d  _W Y d }~d S d }~ww )Nc                 3        | ]} j |d  V  qdS rt  Nr  rA  r   appr   rP   rQ   r   F  r%  z8OpenApiGeneratorExtension._load_class.<locals>.<genexpr>zregistered extensions z for "z6" has an installed app but target class was not found.c                 3   r  r  r  r  r  rP   rQ   r   N  r%  zUnexpected error z$ occurred when attempting to import z for extension rG  z).)r'   r  ImportErrorr   app_configsr  anyoptionalr;   rM   r   re   )r   installed_appsr  rP   r  rQ   _load_class@  s0   

z%OpenApiGeneratorExtension._load_classr  ra   c                 C   s^   t | jtr
|   | jd u rdS | jr(z	tt|| jW S  ty'   Y dS w t|| jkS r   )rq   r  r   r  match_subclassesrj   rh   	TypeError)r   r  rP   rP   rQ   _matchesU  s   
z"OpenApiGeneratorExtension._matchesc                 C   s4   t | jdd ddD ]}||r||  S q
d S )Nc                 S   s   | j S rb   )priority)r  rP   rP   rQ   <lambda>g  s    z5OpenApiGeneratorExtension.get_match.<locals>.<lambda>T)r  ry  )r   r  r  )r   r  	extensionrP   rP   rQ   rs   e  s
   
z#OpenApiGeneratorExtension.get_match)rM   rN   rO   r  r   r   r^   __annotations__r  r   r   r   r  r  r  r  r  classmethodr  r   rr   r  r   rs   __classcell__rP   rP   r  rQ   r  2  s   
 
r  )	metaclassr  c              	   C   sb   zt | W S  ty   Y nw z| d^ }}t d|}t||W S  ttfy0   Y dS w )zB augmented import from string, e.g. MODULE.CLASS/OBJECT.ATTRIBUTE rt  N)r'   r  r   r   r   AttributeError)r  r  attrrg   rP   rP   rQ   deep_import_stringm  s   
r  c                   C   s
   t t S rb   )_load_enum_name_overridesr(   rP   rP   rP   rQ   load_enum_name_overrides{  r  r  languagec                 C   s  i }t j D ]q\}}t|trt|}|std| d qt|r,t	|t
r,|j}t|r=t	|tr=dd |D }g }|D ])}t|tsL|d u rT|||f qAt|d ttfre||d  qA|| qAdd |D }||t|< qtt jt|krtd |S )Nz#unable to load choice override for z; from ENUM_NAME_OVERRIDES. please check module path string.c                 S   s   g | ]}|j |jfqS rP   )r   r   r   rP   rP   rQ   r         z-_load_enum_name_overrides.<locals>.<listcomp>r  c                 S   r'  r(  rP   r4  rP   rP   rQ   r         zENUM_NAME_OVERRIDES has duplication issues. Encountered multiple names for the same choice set. Enum naming might be unexpected.)r<   ENUM_NAME_OVERRIDESr   rq   r   r  r;   rc   rd   rj   rJ   r+  r   r,  r)  tupleextendr1  rg  r9   )r  	overridesr   r+  normalized_choicesr   hashable_valuesrP   rP   rQ   r    s:   

r  r   c                 C   s*   t tjt| dtd  d d S )NT)	sort_keysr      )hashlibsha256jsondumpsr)  r3   encode	hexdigest)r   rP   rP   rQ   r1    s   *r1  r  c                 C   s(   |  ds	d|  } | ds| d } | S )N^$)rA  r   )r  rP   rP   rQ   anchor_pattern  s
   

r  c                    s  t  }t| D ]}|d|d}}d}tjr!|dkr!d}ntjr2|dr2|dd  d}||kr7q|s< dS |	d	rX|t
d	d d
} fdd|D }d}n|dkrcdd  D }|tjv rtj| }	t|	rvt|	}
n>t|	trt|	}
n4td| d  dS |tv rtt| }
n||v rttj}
t|| j|
d< ntd| d  dS t||
tj|d  S dS )zE
    convert django style path parameters to OpenAPI parameters.
    	converter	parameterNpkid_pk_iddrf_format_suffix_r   c                    s   g | ]}| v rd | qS rt  rP   r   suffixavailable_formatsrP   rQ   r     s    z1resolve_django_path_parameter.<locals>.<listcomp>drf_format_suffixc                 S   s   g | ]}d | qS r"  rP   r#  rP   rP   rQ   r     s    z+Unable to use path converter override for "z8". Please refer to the documentation on how to use this.r  zEncountered path converter "z" that is unknown to Django.)r   r   r  r  )r   r   finditergroupr1   SCHEMA_COERCE_PATH_PKr<   SCHEMA_COERCE_PATH_PK_SUFFIXr   rA  rg  r   PATH_CONVERTER_OVERRIDESr   r   rq   r   r;   r=   r@   r   r  regexr9   r  rC   r  )r  variabler&  registered_convertersmatchr  r  enum_valuesexplicit_formatsoverrider   rP   r%  rQ   resolve_django_path_parameter  sX   









r4  c                 C   s   t |  D ]:\}}tjr|dkrd}ntjr%|dr%|dd  d}||kr*q|dkr1 dS t|tt	j
t|tjd  S dS )	z
    convert regex path parameter to OpenAPI parameter, if pattern is
    explicitly chosen and not the generic non-empty default '[^/.]+'.
    r  r  r  Nr  r   z[^/.]+)r   r   r  r  )analyze_named_regex_patternr   r1   r*  r<   r+  r   r  r   r@   r   r  rC   r  )r  r.  r  r  rP   rP   rQ   resolve_regex_path_parameter  s    
r6  c                 C   s   t | tjtjtjfS rb   )rj   r.   URLPathVersioningNamespaceVersioningAcceptHeaderVersioning)versioning_classrP   rP   rQ   is_versioning_supported  s
   r;  c                 C   sF   z| j | jfi | j\}}W n tjy   Y dS w t|t|kS r   )determine_versionrequestr   r*   NotAcceptabler   )r   requested_versionrI  r   rP   rP   rQ   operation_matches_version  s   r@  c                 C   s   |j r|jsJ |sJ ||j_t|j tjr3|j j}tj|||id}t	|t
r,|j}||j|< |S t|j tjr^zttt| d||j_W |S  ty]   td| d Y |S w t|j tjrt|jdsy||j}|\|j_|j_t|jj}|j d|j j d| |j_|S )N)var_dict)urlconfz0namespace versioning path resolution failed for z. Path will be ignored.accepted_renderer; =)r:  r=  rI  rj   r.   r7  version_paramuritemplater   rq   r7   urir   r8  r$   detype_patternsr
  resolveresolver_matchr    r9   r9  r   perform_content_negotiationrC  accepted_media_typer4   	full_type)patternsr  r  r   r?  rF  
negotiated
media_typerP   rP   rQ   modify_for_versioning  s<   


rR  media_typesc                    sd   j r
tj tjs|S tjj}|jj j	 t
   r& j jkr(|S  fdd|D S )Nc                    s$   g | ]}| d j j d  qS )rD  rE  )r:  rF  )r   rQ  rI  r   rP   rQ   r   R  s    z5modify_media_types_for_versioning.<locals>.<listcomp>)r:  rj   r.   r9  r4   r=  rM  paramsr  rF  r/   default_version)r   rS  rQ  rP   rT  rQ   !modify_media_types_for_versioningD  s   rW  c           
      C   s>  i }d}d\}}d\}}d}|t | k rd}| | dkrd}	nS| ||d  dkr0d}d}d}	nB| | d	v r?|r?|d
7 }d
}	n3| | dkrT|rT|sKJ d}d}d}d
}	n| | dv rp|rp|sid}|||< d\}}n|d
8 }d
}	nd
}	|r|s|| |||	  7 }n|r|s|| |||	  7 }||	7 }|t | k s|rJ |S )zH safely extract named groups and their pattern from given regex pattern r   )Fr   F\r  r  (?P<T(r  >r   )r   r   )rg  )
r  resultstackname_capturename_bufferregex_captureregex_bufferiskipffrP   rP   rQ   r5  X  sL   
"r5  c                 C   s   t dd | D S )zMCache detyped patterns due to the expensive nature of rebuilding URLResolver.c                 s   s    | ]}t |V  qd S rb   detype_pattern)r   r  rP   rP   rQ   r     r   z"detype_patterns.<locals>.<genexpr>)r
  )rO  rP   rP   rQ   rI    s   rI  c                 C   s   t | trtt| jdd | jD | j| j| jdS t | tr-tt| j| j	| j
| jdS t | trAttdd| j| j| jdS t | tro| j}t| j D ]\}}|d| d	| d
d| d}qPt|| j| jdS td|  d | S )z
    return an equivalent pattern that accepts arbitrary values for path parameters.
    de-typing the path will ease determining a matching route without having properly
    formatted dummy values for all path parameters.
    c                 S      g | ]}t |qS rP   re  )r   prP   rP   rQ   r         z"detype_pattern.<locals>.<listcomp>)r  urlconf_namedefault_kwargsapp_name	namespace)r  r  default_argsr   z<\w+:(\w+)>z<\1>)router   is_endpointrY  r[  r   z>[^/]+))r-  r   rp  zunexpected pattern "z," encountered while simplifying urlpatterns.)rq   r#   rf  r  url_patternsrk  rl  rm  r"   r  rn  r   r!   resub_route_is_endpointr   _regexr5  r   r   r;   )r  detyped_regexr   r-  rP   rP   rQ   rf    sF   




rf  c                 C   s   t | ts
t | trdd |  D S t | tst | tr$dd | D S t | tr-t| S tt	t
tfD ]}t | |r@||   S q3| S )zP resolve non-serializable objects like lazy translation strings and OrderedDict c                 S      i | ]	\}}|t |qS rP   normalize_result_objectr  rP   rP   rQ   r    r  z+normalize_result_object.<locals>.<dictcomp>c                 S   rg  rP   ry  )r   r	  rP   rP   rQ   r     ri  z+normalize_result_object.<locals>.<listcomp>)rq   r   r   r   r)  r
  r%   r   rr   r#  r   )r\  	base_typerP   rP   rQ   rz    s   

rz  c           
      C   s   t t}| d  D ]\}}| D ]\}}||d  ||f qq
| D ]C\}}t|dkr2q'td| d| d tt|dd  ddD ] \}\}}tj	rVt
|nd	| }	| d | | d  |	7  < qIq'| S )
NrL  operationIdr  zoperationId "z" has collisions z". resolving with numeral suffixes.r  )startr   )r   r)  r   r,  rg  r;   	enumerater   r<   CAMELIZE_NAMESr   )
r\  
operationsr  methodsr  	operationoperation_idrL  idxr$  rP   rP   rQ   sanitize_result_object  s   $r  c                 C   s@   i }|   D ]\}}td|std|d q|||< q|S )Nz^x-zinvalid extension z(. vendor extensions must start with "x-")r   rr  r0  r;   )r  r  r  r   rP   rP   rQ   r    s   
r  c              	   C   s   t d| D ]}| d| ddt|d d} q|dg D ]}|d tjkr4t|d d|d< q!t|d d|d< | |fS )	Nz	\{(\w+)\}r  }Fr  r  r   r|  )rr  findallr   r   r   r  rC   r  )r  r  path_variabler  rP   rP   rQ   camelize_operation  s   
r  c                 K   sl   t t |  |d}||}|r4|j|_|j|_|j D ]\}}|ds)q|dv r.q||j|< q|S )zK build a mocked request and use original request as reference if available )r  r7  )HTTP_ACCEPTHTTP_COOKIEHTTP_AUTHORIZATION)	r   r2   r   initialize_requestuserauthMETAr   rA  )r  r  r   original_requestr   r=  r   r   rP   rP   rQ   build_mock_request  s   

r  c                 K   sl   t | } tj| \}}}}}}tj|}|dd | D  tjj|dd}tj||||||fS )zP deconstruct url, safely attach query parameters in kwargs, and serialize again c                 S   s   i | ]\}}|d ur||qS rb   rP   r  rP   rP   rQ   r  	  r  z(set_query_parameters.<locals>.<dictcomp>T)doseq)	r   urllibparseurlparseparse_qsr   r   	urlencode
urlunparse)urlr   r=  netlocr  rU  r  fragmentrP   rP   rQ   set_query_parameters  s   r  r  c                 C   s8   t | } tj| \}}}}}}tjdd||||fS )Nr   )r   r  r  r  r  )r  r=  r  r  rU  r  r  rP   rP   rQ   get_relative_url  s   r  c              
   C   sh   t jdkrt| t| fS t| dd}t| dd}tjttjt	tj
ttjttjti||}||fS )z3 graceful fallback for py 3.8 typing functionality rX   
__origin__N__args__)sysversion_infor   
get_originget_argsr   r   r)  r	   r   r   r
  Setset	FrozenSet	frozensetr  )hintr  r  rP   rP   rQ   r    s   
r  c                 C   sB   d}t | drdd | jD }tdd t|  D |t| dS )z9resolve required fields for TypedDicts if on 3.9 or aboveN__required_keys__c                 S   s   g | ]}|qS rP   rP   )r   hrP   rP   rQ   r   *  s    z&_resolve_typeddict.<locals>.<listcomp>c                 S   rx  rP   resolve_type_hintr  rP   rP   rQ   r  -  s    z&_resolve_typeddict.<locals>.<dictcomp>)r   r   r   )r   r  r   r   r   r   )r  r   rP   rP   rQ   _resolve_typeddict%  s   

r  c              	   C   s2   t | ttdtttdtttdtttdtfS )NGenericAliasrS   _GenericAlias_UnionGenericAlias)rq   r   typesr_   r   )r  rP   rP   rQ   is_higher_order_type_hint5  s   



r  c                    s  t | \} |du rt| ddrt| S |du rBt| rBt| trBt| r2dd t|  D }ndd | j	D }t
|| dS |tu sN| tu sN| tu r^t rXt d S ttjS |tu rqtt d t t d	S |tu s|tu s|tu s| tu rttj} r d
 tjurt d
 |d< |S |tu rtt d S |tu rtt d S |tv rdt i}t fdd D r|tt d  |S t| rt| t rddd | D i}dd | j!D }|r|t|d  |S t"| t#rt$| S t"| t%rt| j&S |t'v r@dd  D }t|d
kr-ddd |D i}nt|d }td v r>d|d< |S |t(j)j*u rOtt d S t+| )z+ resolve return value type hints to schema NF)r   c                 S   rx  rP   r  r  rP   rP   rQ   r  G  r  z%resolve_type_hint.<locals>.<dictcomp>c                 S   s   i | ]}|t tjqS rP   )r   r@   ANY)r   r  rP   rP   rQ   r  I  r  )r   r   r   )r   r   r   r  r   r  c                 3   s$    | ]}t  d  t |u V  qdS )r   Nr  r  r  rP   rQ   r   b  r6  z$resolve_type_hint.<locals>.<genexpr>c                 S   s   g | ]}|j qS rP   )r   )r   r   rP   rP   rQ   r   f  s    z%resolve_type_hint.<locals>.<listcomp>c                 S   s   g | ]}t |r|qS rP   )r   )r   trP   rP   rQ   r   g  r  c                 S   r  rb   r  r  rP   rP   rQ   r   p  r  rk  c                 S   rg  rP   r  r  rP   rP   rQ   r   r  ri  Tr  ),r  r   r   rc   rd   rj   r
  r   r   _fieldsr   r  r)  r6   r   r  r@   r  rg  r   r   r   r5   r   r   r   r  r  rU   r-  r   r   r   r   rq   rV   r  rW   	__value__rT   r   r   Iterabler`   )r  r  r   r   mixin_base_typesr  rP   r  rQ   r  >  sn   
 


r  classesc                 C   s(   |d u rdS |r| j |v S t| t|S NT)re   rq   r
  )rg   r  exactrP   rP   rQ   whitelisted~  s
   
r  r  c           	         s   ddl m m} |G  fddd|j}| }| }t|  ||d |_	i |_
|j}||_||_||_d|_|  |_|S )Nr   )parsersr   c                       s   e Zd Z jgZdS )z"build_mocked_view.<locals>.TmpViewN)rM   rN   rO   
JSONParserparser_classesrP   r  rP   rQ   TmpView  s    r  r   )r   r  r   r   as_viewr   r<   GET_MOCK_REQUESTupperr=  r   r   registryr  r  path_prefixr  )	r  r  extend_schema_decoratorr  r   r  view_callabler   r   rP   r  rQ   build_mocked_view  s    
r  r   c              	      sx   |r|dkr	gS t  }||}||u rgS  fdd z ||W S  ttfy;   td|j d  Y S w )Nr=  c                    s>   |  u rgS d|   v r fdd| d  D S | d S )Nr   c                    s   i | ]
\}}| |qS rP   rP   )r   
field_namefield_schema)drilldown_schema_examplesentinelrP   rQ   r    s    
zPbuild_listed_example_value.<locals>.drilldown_schema_example.<locals>.<dictcomp>r   )r  r   )r   r  r  r   )r  rQ   r    s   
z<build_listed_example_value.<locals>.drilldown_schema_examplez.OpenApiExample could not be paginated because z either has an unknown schema structure or the individual pagination fields did not provide example values themselves. Using the plain example value as fallback.)r   get_paginated_response_schemar  KeyErrorr;   re   )r   	paginatorr   r  r   rP   r  rQ   build_listed_example_value  s   
r  c                    s    t |   fdd| D S )Nc                    s    i | ]\}}| j v r||qS rP   )r  )r   r  valsigrP   rQ   r    r  z.filter_supported_arguments.<locals>.<dictcomp>)rc   	signaturer   )r   r   rP   r  rQ   filter_supported_arguments  s   

r  c                 C   s    z|   W S    d| ji Y S )Nr=  )get_serializer_contextr=  )r   rP   rP   rQ   build_serializer_context  s   
r  rT  r  c                 C   s$  i }| D ]}t |jtr|j}nd|ji}i }| D ]n\}}t |tr+||| < qt|d||d}i }	|j }
|
r@|
|	d< |j }|rK||	d< |j	 }|rV||	d< |j
d}|rb||	d< |j }|rm||	d	< |jd
|	d< |j }|r|	t| |	|| < q|||j< q|S )a  
    Creates a mocked view for every webhook. The given extend_schema decorator then
    specifies the expectations on the receiving end of the callback. Effectively
    simulates a sub-schema from the opposing perspective via a virtual view definition.
    postr  )r  r  r  r  r   r   rR  r   requestBodyr  r=  r  )rq   	decoratorr   r   r   r  r   get_descriptionget_summaryget_tags_get_request_bodyis_deprecated_get_response_bodiesget_extensionsr   r  r   )rT  r  r\  webhookr  
path_itemsr  r  mocked_viewr  r   r   rR  request_bodyr  r  rP   rP   rQ   process_webhooks  sN   






r  )F)Tr  r  )NNN)FNNNFNNNTNNrb   r  )r   r   r  rc   r  rr  r  r  r   urllib.parser  r   r   r   r   decimalr   r  r   r   r   r	   r
   r   r   r   r   r   r   r   r  r   typing_extensionsr   rG  django.appsr   django.db.models.constantsr   +django.db.models.fields.related_descriptorsr   r   r   r   'django.db.models.fields.reverse_relatedr   django.db.models.sql.queryr   django.urls.convertersr   django.urls.resolversr   r   r    r!   r"   r#   r$   django.utils.functionalr%   r&   django.utils.module_loadingr'   django.utils.translationr(   r)   r   r   r*   r+   r,   r-   r.   rest_framework.compatr/   rest_framework.fieldsr0   rest_framework.settingsr1   rest_framework.testr2   rest_framework.utils.encodersr3   rest_framework.utils.mediatypesr4   'rest_framework.utils.serializer_helpersr5   r6   r7   drf_spectacular.drainager8   r9   r:   r;   drf_spectacular.settingsr<   drf_spectacular.typesr=   r>   r?   r@   rA   drf_spectacular.utilsrB   rC   rD   rE   rF   rG   rH   rI   django.db.models.enumsrJ   r  r   rS   rT   r  rU   rV   rW   rZ   
_PyLiteralr[   _PyTypedDictMetar]   
_PxLiteral_PxTypedDictMetarw  r^   r_   r   r`   r   rh   rn   ru   rw   rz   rr   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r3  r0  rF  rd  rh  rs  r  r  r  r  r  r  r  r  r  r  r  	lru_cacher  r1  r  r4  r6  r;  r@  rR  rW  r5  rI  rf  rz  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  rP   rP   rP   rQ   <module>   sh  
 4
$(



			
	



	

	
9,
$ 8
!H;)>	%-
,
	$@	 