U
    Ç½„b™†  ã                   @   sÜ  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	 d dlm
Z d dlmZ d dlmZ d dlmZ d dlmZ 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 m!Z!m"Z"m#Z# e $e%¡Z&G dd„ de"ƒZ'G dd„ de'ƒZ(dd„ Z)dd„ Z*dYdd„Z+dd„ Z,dd„ Z-G dd„ de ƒZ.dd „ Z/ej0ej1ej2fZ3ej4e3d!ej5fej6e3d"ej7fej8ej9d#ej5fej:ej9d$ej7fej8ej;ej<fd%ej5fej:ej;ej<fd&ej7fgZ=d'd(„ Z>d)d*„ Z?ej@ejAdffejBejCejDffejEejFdffejGejFdffejHejCejIffejJejCejKffej2e?ejLffejMejAdffej1ejNdffej0ejAdffejOejCejPffejQejCejRffejSejCejTffejUejCdffejVejCdffejWejCejXffej9ejCdffgZYejPejRd+œZZej[ejCej\ffejSejCejTffej]ejCej^ffejOejCd,d-„ ffejWejCejXffej_ejCdffej9ejCdffejEejFdffejGejFdffej0ejAdffej1ejNdffej2e?ejLffejMejNdffejJejCejKffejHejCejIffej`ejCdffgZaeaeY Zbd.d/„ Zcd0d1„ Zdd2d3„ Zed4d5„ ZfegejFdffehejAdffeiejCdffejejNdffekejldffe	edejLffejmejCejXffe j ejCejIffe jnejCejKffg	Zoeped6ƒ�r‚ejqZrnd7d8„ Zrd9d:„ Zseo tejuejvfesf¡ d;d<„ Zwd=d>„ ZxG d?d@„ d@e ƒZyG dAdB„ dBe ƒZzG dCdD„ dDe ƒZ{G dEdF„ dFe ƒZ|G dGdH„ dHe ƒZ}G dIdJ„ dJe ƒZ~G dKdL„ dLe ƒZG dMdN„ dNe ƒZ€z d dOl�m‚Z‚ d dPlƒm„Z„m…Z… W n& e†k
�r~   d Z‚Z„dQdR„ Z…Y nX G dSdT„ dTe ƒZ‡zd dUlˆm‰Z‰ W n& e†k
�rÆ   G dVdW„ dWe ƒZŠY nX G dXdW„ dWe ƒZŠdS )Zé    N)ÚOrderedDict)ÚDecimal)Ú	signature)Ú
validators)Úmodels)Úserializers)Úapi_settingsé   )Úopenapi)ÚSwaggerGenerationError)Údecimal_as_floatÚfield_value_to_representationÚfilter_noneÚget_serializer_classÚget_serializer_ref_nameé   )ÚFieldInspectorÚ
NotHandledÚSerializerInspectorÚcall_view_methodc                   @   sT   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚInlineSerializerInspectorzVProvides serializer conversions using :meth:`.FieldInspector.field_to_swagger_object`.Fc                 C   s   |   |tj| j¡S ©N)Úprobe_field_inspectorsr
   ÚSchemaÚuse_definitions©ÚselfÚ
serializer© r   ú=/tmp/pip-unpacked-wheel-o6yr43pd/drf_yasg/inspectors/field.pyÚ
get_schema    s    z$InlineSerializerInspector.get_schemac                 C   s   |S )a¦  Add/replace parameters from the given list of automatically generated request parameters. This method
        is called only when the serializer is converted into a list of parameters for use in a form data request.

        :param serializer: serializer instance
        :param list[openapi.Parameter] parameters: genereated parameters
        :return: modified parameters
        :rtype: list[openapi.Parameter]
        r   )r   r   Ú
parametersr   r   r   Úadd_manual_parameters#   s    	z/InlineSerializerInspector.add_manual_parametersc                    s0   t |di ƒ}‡ ‡fdd„| ¡ D ƒ}ˆ ||¡S )NÚfieldsc              	      s:   g | ]2\}}t |d dƒsˆj|tjˆjˆ |¡ˆ d�‘qS )Ú	read_onlyF)ÚnameÚin_)Úgetattrr   r
   Ú	Parameterr   Úget_parameter_name)Ú.0ÚkeyÚvalue©r&   r   r   r   Ú
<listcomp>0   s   ú   þzDInlineSerializerInspector.get_request_parameters.<locals>.<listcomp>)r'   Úitemsr"   )r   r   r&   r#   r!   r   r-   r   Úget_request_parameters.   s
    ú
z0InlineSerializerInspector.get_request_parametersc                 C   s   |S r   r   ©r   Ú
field_namer   r   r   Úget_property_name<   s    z+InlineSerializerInspector.get_property_namec                 C   s   |S r   r   r1   r   r   r   r)   ?   s    z,InlineSerializerInspector.get_parameter_namec                 C   s   t |ƒS r   )r   r   r   r   r   r   B   s    z1InlineSerializerInspector.get_serializer_ref_namec                 C   s   t |dd ƒ}t|dƒS )NÚMetaÚref_name)r'   Úhasattr)r   r   Úserializer_metar   r   r   Ú_has_ref_nameE   s    z'InlineSerializerInspector._has_ref_namec                    s0  ˆj ||ˆf|Ž\‰‰ t|tjtjfƒrZˆ |jˆ ˆ¡}t|ƒpBi }ˆf tj	|dœ|—ŽS t|tj
ƒ�r,|tjkr€td|j ƒ‚ˆ |¡}|f‡ ‡‡‡fdd„	}|r¨ˆs®|ƒ S ˆj tj¡}	|	 ||¡}
|
 ¡  t|
dd ƒ}t|ƒ}|�r ||k�r ˆ |¡�oˆ |¡}|�s td||f ƒ‚t |	|¡S tS )N©Útyper/   z(cannot instantiate nested serializer as c                    s¢   t ƒ }g }| j ¡ D ]b\}}ˆ |¡}dt|jƒp4d i}t|ƒ}ˆj|ˆ ˆf|Ž}|||< |jrt	|ddƒs| 
|¡ qˆdtj||pˆd d�}t|dt| ƒƒ |S )Nr$   F)Zuse_field_titler:   Ú
propertiesÚrequiredÚ_NP_serializer)r   r#   r/   r3   Úboolr$   r   r   r<   r'   Úappendr
   ÚTYPE_OBJECTÚsetattrr   )r   r;   r<   Zproperty_nameÚchildZprop_kwargsÚchild_schemaÚresult©ÚChildSwaggerTypeÚSwaggerTyper   Úuse_referencesr   r   Úmake_schema_definitionZ   s4    
 ÿ  ÿÿú	zQInlineSerializerInspector.field_to_swagger_object.<locals>.make_schema_definitionr=   z¬Schema for %s would override distinct serializer %s because they implicitly share the same ref_name; explicitly set the ref_name attribute on both serializers' Meta classes)Ú_get_partial_typesÚ
isinstancer   ÚListSerializerÚ	ListFieldr   rB   Úfind_limitsr
   Ú
TYPE_ARRAYÚ
Serializerr   r   Ú__name__r   Ú
componentsÚ
with_scopeÚSCHEMA_DEFINITIONSÚ
setdefaultZ_remove_read_onlyr'   r   r8   Ú	SchemaRefr   )r   ÚfieldÚswagger_object_typerH   ÚkwargsrC   Úlimitsr5   rI   ÚdefinitionsZactual_schemaZactual_serializerZthis_serializerZexplicit_refsr   rE   r   Úfield_to_swagger_objectI   s@    þý

þÿz1InlineSerializerInspector.field_to_swagger_objectN)rQ   Ú
__module__Ú__qualname__Ú__doc__r   r    r"   r0   r3   r)   r   r8   r\   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdS )ÚReferencingSerializerInspectorTN)rQ   r]   r^   r   r   r   r   r   r`   Ž   s   r`   c                 C   s   t | ddƒ}t||ƒ}||fS )a  Try to get information about a model and model field from a queryset.

    :param queryset: the queryset
    :param field_name: target field name
    :returns: the model and target field from the queryset as a 2-tuple; both elements can be ``None``
    :rtype: tuple
    ÚmodelN)r'   Úget_model_field)Úquerysetr2   ra   Úmodel_fieldr   r   r   Úget_queryset_field’   s    
re   c                 C   s@   z$|dkr| j jW S | j  |¡W S W n tk
r:   Y dS X dS )z¢Try to get the given field from a django db model.

    :param model: the model
    :param field_name: target field name
    :return: model field or ``None``
    ÚpkN)Z_metarf   Ú	get_fieldÚ	Exception)ra   r2   r   r   r   rb   Ÿ   s    
rb   c                 C   sV   z:t | ddƒ}|dk	r6|dk	r6t|ƒt | ddƒks6t‚|W S  tk
rP   Y dS X dS )zíTry to get the queryset of the given view

    :param view: the view instance or class
    :param serializer: if given, will check that the view's get_serializer_class return matches this serialzier
    :return: queryset or ``None``
    Zget_querysetrc   Nr   Zserializer_class)r   r:   ÚAssertionErrorrh   )Úviewr   rc   r   r   r   Úget_queryset_from_view¯   s    rk   c                 C   s$   | dk	r t | tjƒr| S | j} q dS )zqGet the nearest parent ``Serializer`` instance for the given field.

    :return: ``Serializer`` or ``None``
    N)rK   r   rP   Úparent©rW   r   r   r   Úget_parent_serializerÂ   s
    rn   c                 C   sX   z<t | |ƒ}z|jjW W S  tk
r8   |jjj Y W S X W n tk
rR   Y dS X dS )zÛTry to find the other side of a model relationship given the name of a related field.

    :param model: one side of the relationship
    :param str source: related field name
    :return: related model or ``None``
    N)r'   ÚrelZrelated_modelrh   rW   Zremote_fieldra   )ra   ÚsourceZ
descriptorr   r   r   Úget_related_modelÐ   s    
rq   c                   @   s   e Zd ZdZdd„ ZdS )ÚRelatedFieldInspectorz-Provides conversions for ``RelatedField``\ s.c                 K   sŠ  | j |||f|Ž\}}t|tjƒrB|  |j||¡}|tj|dd�S t|tjƒsRt	S t
|dd ƒ}t|tjtjfƒ�r`t
|ddƒrœ| j|j||f|Ž}	||	d�S t
|ddƒ}
|d k	rÀt||
ƒ\}}n‚t|ƒ}t
|d	d ƒ}t
|d
d ƒ}|süt| j|ƒ}t
|d
d ƒ}t
|ddƒ�p|j}|�s.t|jtjƒ�r.|jj}t||ƒ}t||
ƒ}t|ƒ�pTdtji}|f |ŽS t|tjƒ�r~|tjtjd�S |tjd�S )NT)r:   r/   Zunique_itemsrc   Úpk_fieldÚ )Zexisting_objectZ
slug_fieldrf   r4   ra   rp   r:   )r:   Úformat©r:   )rJ   rK   r   ZManyRelatedFieldr   Zchild_relationr
   rO   ZRelatedFieldr   r'   ZPrimaryKeyRelatedFieldZSlugRelatedFieldrs   re   rn   rk   rj   r2   rl   rq   rb   Úget_basic_type_infoÚTYPE_STRINGZHyperlinkedRelatedFieldÚ
FORMAT_URI)r   rW   rX   rH   rY   rG   rF   rC   Zfield_querysetrD   Ztarget_fieldra   rd   Zparent_serializerr7   Z
this_modelZview_querysetrp   Úattrsr   r   r   r\   ä   sD    ý



z-RelatedFieldInspector.field_to_swagger_objectN©rQ   r]   r^   r_   r\   r   r   r   r   rr   á   s   rr   c                 C   s¸   d}| j D ]:}t|t jƒr
t|t jƒs
|t jkr2q
|dk	r@ dS |}q
ztt|ddƒddƒ}W n, tk
rŠ   tjdt	| ƒ dd� Y dS X |r´| 
d¡s¤| 
d¡r´|dd	… d
 }|S )zíGiven a ``Field``, look for a ``RegexValidator`` and try to extract its pattern and return it as a string.

    :param serializers.Field regex_field: the field instance
    :return: the extracted pattern, or ``None``
    :rtype: str
    NÚregexÚpatternz%failed to compile regex validator of T)Úexc_infoz\Zz\zéþÿÿÿú$)r   rK   ZRegexValidatorZURLValidatorZvalidate_ipv4_addressr'   rh   ÚloggerÚwarningÚstrÚendswith)Zregex_fieldZregex_validatorÚ	validatorr}   r   r   r   Ú
find_regex  s"    
r†   ZminimumÚmaximumÚ
min_lengthÚ
max_lengthZ	min_itemsZ	max_itemsc                    sÖ   i }‡ fdd„t D ƒ}tˆ tjƒr.tˆ ƒs.|S ˆ jD ]h}t|dƒsDq4|j}t|tƒrdtˆ ƒrdt	|ƒ}|D ]2\}}}t||ƒrh||ks’|||| ƒrh|||< qhq4tˆ dƒrÆˆ j
sÆ| dd¡dk rÆd|d< tt| ¡ ƒƒS )zæGiven a ``Field``, look for min/max value/length validators and return appropriate limit validation attributes.

    :param serializers.Field field: the field instance
    :return: the extracted limits
    :rtype: OrderedDict
    c                    s(   g | ] \}}}}t ˆ |ƒr|||f‘qS r   )rK   )r*   r…   Úfield_classÚattrÚimprovesrm   r   r   r.   V  s   

þzfind_limits.<locals>.<listcomp>Úlimit_valueÚallow_blankrˆ   r   r   )Úlimit_validatorsrK   r   ÚDecimalFieldr   r   r6   r�   r   ÚfloatrŽ   Úgetr   Úsortedr/   )rW   rZ   Zapplicable_limitsr…   r�   Zvalidator_classr‹   rŒ   r   rm   r   rN   N  s(    
þ


rN   c                 C   s   t | ƒrtjS tjS r   )r   r
   ÚTYPE_NUMBERrx   rm   r   r   r   Údecimal_field_types  s    r•   )Zipv4Zipv6c                 C   s   t  | jd ¡S r   )Ú	ip_formatr’   Úprotocolrm   r   r   r   Ú<lambda>‘  ó    r˜   c                 C   s¢   | dkrdS t D ]>\}}t| |ƒr|\}}t|ƒr:|| ƒ}t|ƒrJ|| ƒ} qTqdS d}|tjkrjt| ƒ}t| ƒ}td|fd|fd|fgƒ}| |¡ t	|ƒ}|S )a?  Given a serializer or model ``Field``, return its basic type information - ``type``, ``format``, ``pattern``,
    and any applicable min/max limit values.

    :param field: the field instance
    :return: the extracted attributes as a dictionary, or ``None`` if the field type is not known
    :rtype: OrderedDict
    Nr:   ru   r}   )
Úbasic_type_inforK   Úcallabler
   rx   r†   rN   r   Úupdater   )rW   rŠ   Ztype_formatÚswagger_typeru   r}   rZ   rD   r   r   r   rw   £  s.    

ý
rw   c                   C   s   t jrtjS tjS r   )Úrest_framework_settingsZCOERCE_DECIMAL_TO_STRINGr
   rx   r”   r   r   r   r   Údecimal_return_typeÉ  s    rŸ   c                 C   s   t | dd ƒp| S )NÚ
__origin__©r'   )Ú
hint_classr   r   r   Úget_origin_typeÍ  s    r£   c                 C   s   t | ƒ}t |¡ot||ƒS r   )r£   ÚinspectÚisclassÚ
issubclass)r¢   Úcheck_classÚorigin_typer   r   r   Úhint_class_issubclassÑ  s    r©   Úget_argsc                 C   s   t | ddƒS )NÚ__args__r   r¡   )Útpr   r   r   Útyping_get_argsè  s    r­   c                 C   sH   t | ƒ}|r|d nt}t|ƒp(dtji}tdtjfdtjf |ŽfgƒS )Nr   r:   r/   )r­   rƒ   Úget_basic_type_info_from_hintr
   rx   r   rO   ÚItems)r¢   ÚargsZchild_classZchild_type_infor   r   r   Úinspect_collection_hint_classì  s    þr±   c                 C   s   t | ƒ}|tjkr| jS d S r   )r£   ÚtypingÚUnionr«   )r¢   r¨   r   r   r   Ú_get_union_typesú  s    
r´   c                 C   s¤   t | ƒ}|rFt|ƒdkrBtd|d ƒrBt|d ƒ}|r>d|d< |S dS tD ]T\}}t| |ƒrJt|ƒrp|| ƒ  S |\}}t|ƒr†|ƒ }td|fd|fgƒ  S qJdS )	a[  Given a class (eg from a SerializerMethodField's return type hint,
    return its basic type information - ``type``, ``format``, ``pattern``,
    and any applicable min/max limit values.

    :param hint_class: the class
    :return: the extracted attributes as a dictionary, or ``None`` if the field type is not known
    :rtype: OrderedDict
    r	   Nr   r   Tz
x-nullabler:   ru   )r´   ÚlenrK   r®   Úhinting_type_infor©   r›   r   )r¢   Zunion_typesrD   r§   Úinfor�   ru   r   r   r   r®      s(    	
þr®   c                   @   s   e Zd ZdZdd„ ZdS )ÚSerializerMethodFieldInspectorz‚Provides conversion for SerializerMethodField, optionally using information from the swagger_serializer_method
    decorator.
    c                 K   s<  t |tjƒstS t|j|jƒ}|d kr*tS t|dd ƒ}|rÄ|j}|d krTt|dd ƒ}|d krb|j}|j	}|d kr|t|dd ƒ}t
 |¡r ||ddœ}	|jf |	Ž}n||_||_	d|_| j|||dd�S t|ƒj}
t
 |
¡sìt|
dƒrì|
jd }
t
 |
¡�r8t|
t
jƒ�s8t|
ƒ}|d k	�r8| j|||f|Ž\}}|f |ŽS tS )	NÚ_swagger_serializerÚ	help_textÚlabelT)rº   r»   r$   )r$   r«   r   )rK   r   ZSerializerMethodFieldr   r'   rl   Úmethod_namerº   r_   r»   r¤   r¥   r¹   r$   r   Úinspect_signatureÚreturn_annotationr6   r«   r¦   Ú_emptyr®   rJ   )r   rW   rX   rH   rY   Úmethodr   Údescriptionr»   Zserializer_kwargsr¢   Ú	type_inforG   rF   r   r   r   r\   ,  sL    
ý


ÿÿ
z6SerializerMethodFieldInspector.field_to_swagger_objectNr{   r   r   r   r   r¸   '  s   r¸   c                   @   s   e Zd ZdZdd„ ZdS )ÚSimpleFieldInspectorz„Provides conversions for fields which can be described using just ``type``, ``format``, ``pattern``
    and min/max validators.
    c                 K   s4   t |ƒ}|d krtS | j|||f|Ž\}}|f |ŽS r   )rw   r   rJ   )r   rW   rX   rH   rY   rÂ   rG   rF   r   r   r   r\   j  s
    z,SimpleFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rÃ   e  s   rÃ   c                   @   s   e Zd ZdZdd„ ZdS )ÚChoiceFieldInspectorzEProvides conversions for ``ChoiceField`` and ``MultipleChoiceField``.c                 K   sx  | j |||f|Ž\}}t|tjƒ�rttj}g }|j ¡ D ]6}	t|tjƒrZt	||	gƒd }	n
t	||	ƒ}	| 
|	¡ q8t|ƒ}
t|
tjƒrØtt|
dƒdƒ}t||jp¤|jjƒ}t|dd ƒrº|j}|rÖt|ƒ}|rÖ| d|¡}n>dd„ |D ƒ}t|ƒdk�rttt|ƒƒƒ}|�r| d|¡}t|tjƒ�rd|tj|||d	�d
�}|tjk�rp|d tjtjfk�rpd|_n|||d	�}|S tS )Nr   r4   ra   Ú
base_fieldr:   c                 S   s   h | ]}t |ƒ’qS r   rv   )r*   Úvr   r   r   Ú	<setcomp>“  s     z?ChoiceFieldInspector.field_to_swagger_object.<locals>.<setcomp>r   )r:   Úenumr9   ÚinZmulti)rJ   rK   r   ZChoiceFieldr
   rx   ÚchoicesÚkeysZMultipleChoiceFieldr   r?   rn   ZModelSerializerr'   rb   rp   rl   rÅ   rw   r’   rµ   r®   ÚnextÚiterrO   r(   ÚIN_FORMZIN_QUERYZcollection_formatr   )r   rW   rX   rH   rY   rG   rF   Z	enum_typeZenum_valuesÚchoicer   ra   rd   Z
model_typeZenum_value_typesZvalues_typerD   r   r   r   r\   v  sL    
þþz,ChoiceFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rÄ   s  s   rÄ   c                   @   s   e Zd ZdZdd„ ZdS )ÚFileFieldInspectorz*Provides conversions for ``FileField``\ s.c           
      K   s�   | j |||f|Ž\}}t|tjƒrŒtdƒ}|tjkr\|tjdd�}t|dt	j
ƒrXtj|_|S |tjkrˆ|tjd�}	|	d tjkr„|‚|	S |‚tS )NzFFileField is supported only in a formData Parameter or response SchemaT)r:   r$   Zuse_urlrv   rÉ   )rJ   rK   r   Z	FileFieldr   r
   r   rx   r'   rž   ZUPLOADED_FILES_USE_URLry   ru   r(   Z	TYPE_FILErÎ   r   )
r   rW   rX   rH   rY   rG   rF   ÚerrrD   Úparamr   r   r   r\   ¯  s    

z*FileFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rÐ   ¬  s   rÐ   c                   @   s   e Zd ZdZdd„ ZdS )ÚDictFieldInspectorz&Provides conversion for ``DictField``.c                 K   sN   | j |||f|Ž\}}t|tjƒrJ|tjkrJ|  |j||¡}|tj|d�S t	S )N)r:   Zadditional_properties)
rJ   rK   r   Z	DictFieldr
   r   r   rB   r@   r   )r   rW   rX   rH   rY   rG   rF   rC   r   r   r   r\   Ê  s    þz*DictFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rÓ   Ç  s   rÓ   c                   @   s   e Zd ZdZdd„ ZdS )ÚHiddenFieldInspectorzHide ``HiddenField``.c                 K   s   t |tjƒrd S tS r   )rK   r   ZHiddenFieldr   )r   rW   rX   rH   rY   r   r   r   r\   Ú  s    z,HiddenFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rÔ   ×  s   rÔ   c                   @   s   e Zd ZdZdd„ ZdS )ÚJSONFieldInspectorz&Provides conversion for ``JSONField``.c                 K   s<   | j |||f|Ž\}}t|tjƒr8|tjkr8|tjd�S tS ©Nrv   )rJ   rK   r   Z	JSONFieldr
   r   r@   r   ©r   rW   rX   rH   rY   rG   rF   r   r   r   r\   ä  s    z*JSONFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rÕ   á  s   rÕ   c                   @   s   e Zd ZdZdd„ ZdS )ÚStringDefaultFieldInspectorzRFor otherwise unhandled fields, return them as plain :data:`.TYPE_STRING` objects.c                 K   s"   | j |||f|Ž\}}|tjd�S rÖ   )rJ   r
   rx   r×   r   r   r   r\   ð  s    z3StringDefaultFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rØ   í  s   rØ   )ÚCamelCaseJSONParser)ÚCamelCaseJSONRendererÚcamelizec                 C   s   | S r   r   )Údatar   r   r   rÛ   ü  s    rÛ   c                   @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zer6er6dd	„ Z	nd
d	„ Z	dS )ÚCamelCaseJSONFilterzSConverts property names to camelCase if ``djangorestframework_camel_case`` is used.c                 C   s   t tt|diƒƒƒS )z­Hack to force ``djangorestframework_camel_case`` to camelize a plain string.

        :param str s: the string
        :return: camelized string
        :rtype: str
        rt   )rÌ   rÍ   rÛ   )r   Úsr   r   r   Úcamelize_string  s    z#CamelCaseJSONFilter.camelize_stringc                    sP   t |di ƒrLt‡ fdd„|j ¡ D ƒƒ|_t |dg ƒrL‡ fdd„|jD ƒ|_dS )zêRecursively camelize property names for the given schema using ``djangorestframework_camel_case``.
        The target schema object must be modified in-place.

        :param openapi.Schema schema: the :class:`.Schema` object
        r;   c                 3   s4   | ],\}}ˆ   |¡ˆ  t |ˆ j¡¡p(|fV  qd S r   )rß   Úcamelize_schemar
   Úresolve_refrR   )r*   r+   Úval©r   r   r   Ú	<genexpr>  s   ÿz6CamelCaseJSONFilter.camelize_schema.<locals>.<genexpr>r<   c                    s   g | ]}ˆ   |¡‘qS r   )rß   )r*   Úprã   r   r   r.     s     z7CamelCaseJSONFilter.camelize_schema.<locals>.<listcomp>N)r'   r   r;   r/   r<   )r   Úschemar   rã   r   rà     s    þ
z#CamelCaseJSONFilter.camelize_schemac                 K   s2   t |tjjƒr.|  ¡ r.t || j¡}|  |¡ |S r   )rK   r
   r   ZOR_REFÚis_camel_caserá   rR   rà   )r   rD   r¼   ÚobjrY   ræ   r   r   r   Úprocess_result  s    
z"CamelCaseJSONFilter.process_resultc                 C   s,   t dd„ |  ¡ D ƒƒp*t dd„ |  ¡ D ƒƒS )Nc                 s   s   | ]}t |tƒV  qd S r   )r¦   rÙ   )r*   Úparserr   r   r   rä   %  s     z4CamelCaseJSONFilter.is_camel_case.<locals>.<genexpr>c                 s   s   | ]}t |tƒV  qd S r   )r¦   rÚ   )r*   Zrendererr   r   r   rä   &  s     )ÚanyZget_parser_classesZget_renderer_classesrã   r   r   r   rç   #  s    þz!CamelCaseJSONFilter.is_camel_casec                 C   s   dS )NFr   rã   r   r   r   rç   )  s    N)
rQ   r]   r^   r_   rß   rà   ré   rÙ   rÚ   rç   r   r   r   r   rÝ      s   	
rÝ   )ÚRecursiveFieldc                   @   s   e Zd ZdZdS )ÚRecursiveFieldInspectorúbProvides conversion for RecursiveField (https://github.com/heywbj/django-rest-framework-recursive)N)rQ   r]   r^   r_   r   r   r   r   rí   0  s   rí   c                   @   s   e Zd ZdZdd„ ZdS )rí   rî   c           	      K   s¦   t |tƒr¢|tjkr¢|dks$tdƒ‚|j}t |jtjƒr>|j}t	|ƒ}|d k	sbtdt
t|ƒƒ ƒ‚| j tj¡}tj||dd�}t |jtjƒržtjtj|d�}|S tS )NTzECan not create schema for RecursiveField when use_references is Falsez.Can't create RecursiveField schema for inline )Zignore_unresolvedr9   )rK   rì   r
   r   ri   Úproxiedr   rL   rB   r   rƒ   r:   rR   rS   rT   rV   r¯   rO   r   )	r   rW   rX   rH   rY   rï   r5   r[   Úrefr   r   r   r\   7  s    z/RecursiveFieldInspector.field_to_swagger_objectNr{   r   r   r   r   rí   4  s   )N)‹Údatetimer¤   ÚloggingÚoperatorr²   ÚuuidÚcollectionsr   Údecimalr   r   r½   Zdjango.corer   Z	django.dbr   Zrest_frameworkr   Zrest_framework.settingsr   rž   rt   r
   Úerrorsr   Úutilsr   r   r   r   r   Úbaser   r   r   r   Ú	getLoggerrQ   r�   r   r`   re   rb   rk   rn   rq   rr   r†   ZIntegerFieldZ
FloatFieldr�   Znumeric_fieldsZMinValueValidatorÚ__gt__ZMaxValueValidatorÚ__lt__ZMinLengthValidatorZ	CharFieldZMaxLengthValidatorrM   rL   r�   rN   r•   Z	AutoFieldZTYPE_INTEGERZBinaryFieldrx   ZFORMAT_BINARYZBooleanFieldZTYPE_BOOLEANZNullBooleanFieldZDateTimeFieldZFORMAT_DATETIMEZ	DateFieldZFORMAT_DATEZFORMAT_DECIMALZDurationFieldr”   ZIPAddressFieldZFORMAT_IPV4ZGenericIPAddressFieldZFORMAT_IPV6Z	SlugFieldZFORMAT_SLUGZ	TextFieldZ	TimeFieldZ	UUIDFieldZFORMAT_UUIDZmodel_field_to_basic_typer–   Z
EmailFieldZFORMAT_EMAILZURLFieldry   Z
RegexFieldZ
ModelFieldZserializer_field_to_basic_typerš   rw   rŸ   r£   r©   r>   Úintrƒ   r‘   Údictr@   ÚUUIDÚdater¶   r6   rª   r­   r±   r?   ÚSequenceÚAbstractSetr´   r®   r¸   rÃ   rÄ   rÐ   rÓ   rÔ   rÕ   rØ   Z%djangorestframework_camel_case.parserrÙ   Z%djangorestframework_camel_case.renderrÚ   rÛ   ÚImportErrorrÝ   Zrest_framework_recursive.fieldsrì   rí   r   r   r   r   Ú<module>   sä   
t
:#õ%ïð&÷'>9
	-