o
    `oi                     @   s4  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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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( e)djZ*e+e,Z-G dd deZ.G dd de.Z/dd Z0dd Z1d_ddZ2dd Z3dd Z4d d! Z5G d"d# d#eZ6d$d% Z7ej8ej9ej:fZ;ej<e;d&ej=fej>e;d'ej?fej@ejAd(ej=fejBejAd)ej?fej@ejCejDfd*ej=fejBejCejDfd+ej?fgZEd,d- ZFd.d/ ZGejHe jIdffejJe jKe jLffejMe jNdffejOe jKe jPffejQe jKe jRffej:eGe jSffejTe jKdffej9e jUdffej8e jIdffejVe jKe jWffejXe jKe jYffejZe jKe j[ffej\e jKdffej]e jKdffej^e jKe j_ffejAe jKdffgZ`e jWe jYd0Zaejbe jKe jcffejZe jKe j[ffejde jKe jeffejVe jKd1d2 ffej^e jKe j_ffejfe jKdffejAe jKdffejMe jNdffej8e jIdffej9e jUdffej:eGe jSffejTe jKdffejQe jKe jRffejOe jKe jPffejge jKdffgZheie*eid3k re`jejke jNdff ehjejke jNdff ehe` Zld4d5 Zmd6d7 Znd8d9 Zod:d; Zpeqe jNdffere jIdffese jKdffete jUdffeue jvdffe
ene jSffejwe jKe j_ffe j e jKe jPffe jxe jKe jRffg	Zyezed<rnej{Z|nd=d> Z|d?d@ Z}eyjej~ejfe}f dAdB ZdCdD ZG dEdF dFeZG dGdH dHeZG dIdJ dJeZG dKdL dLeZG dMdN dNeZG dOdP dPeZG dQdR dReZG dSdT dTeZzd dUlmZ d dVlmZmZ W n ey   d ZZdWdX ZY nw G dYdZ dZeZzd d[lmZ W n ey   G d\d] d]eZY dS w G d^d] d]eZdS )`    N)suppress)OrderedDict)Decimal)	signature)
validators)models)version)serializers)api_settings   )call_view_methodFieldInspector
NotHandledSerializerInspector   )openapi)SwaggerGenerationError)decimal_as_floatfield_value_to_representationfilter_noneget_serializer_classget_serializer_ref_nameZdjangorestframeworkc                   @   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    a/var/www/html/kuke-dev/django-kuke/venv/lib/python3.10/site-packages/drf_yasg/inspectors/field.py
get_schema%      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: generated 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 | ]\}}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>5   s    


zDInlineSerializerInspector.get_request_parameters.<locals>.<listcomp>)r*   itemsr%   )r   r   r)   r&   r$   r    r0   r!   get_request_parameters3   s
   
z0InlineSerializerInspector.get_request_parametersc                 C      |S r   r    r   
field_namer    r    r!   get_property_nameA      z+InlineSerializerInspector.get_property_namec                 C   r4   r   r    r5   r    r    r!   r,   D   r8   z,InlineSerializerInspector.get_parameter_namec                 C   s   t |S r   )r   r   r    r    r!   r   G   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_nameJ   s   
z'InlineSerializerInspector._has_ref_namec                    s*  j ||fi |\ t|tjtjfr/|j }t|p#i }dtj	|d|S t|tj
r|tjkrAtd|j |}|f fdd	}|rUsX| S jtj}	|	||}
|
  t|
dd }t|}|r||kr|o|}|std||f t|	|S tS )Ntyper2   z(cannot instantiate nested serializer as c                    s   t  }g }| j D ]3\}}|}dt|jpd i}t|}j| fi |}|||< |jr=t	|dds=|
| q
dtj||pFd d}t|dt|  |S )Nr'   F)Zuse_field_titler?   
propertiesrequired_NP_serializer)r   r&   r2   r7   boolr'   r   r   rA   r*   appendr   TYPE_OBJECTsetattrr   )r   r@   rA   Zproperty_namechildZprop_kwargschild_schemaresultChildSwaggerTypeSwaggerTyper   use_referencesr    r!   make_schema_definition_   s0   

	zQInlineSerializerInspector.field_to_swagger_object.<locals>.make_schema_definitionrB   zSchema 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 classesr    )_get_partial_types
isinstancer	   ListSerializer	ListFieldr   rG   find_limitsr   
TYPE_ARRAY
Serializerr   r   __name__r   
components
with_scopeSCHEMA_DEFINITIONS
setdefaultZ_remove_read_onlyr*   r   r=   	SchemaRefr   )r   fieldswagger_object_typerM   kwargsrH   limitsr:   rN   definitionsZactual_schemaZactual_serializerZthis_serializerZexplicit_refsr    rJ   r!   field_to_swagger_objectN   s@   

z1InlineSerializerInspector.field_to_swagger_objectN)rV   
__module____qualname____doc__r   r"   r%   r3   r7   r,   r   r=   ra   r    r    r    r!   r      s    r   c                   @      e Zd ZdZdS )ReferencingSerializerInspectorTN)rV   rb   rc   r   r    r    r    r!   rf      s    rf   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)querysetr6   rg   model_fieldr    r    r!   get_queryset_field   s   
rk   c                 C   s6   z|dkr
| j jW S | j |W S  ty   Y dS w )zTry 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)_metarl   	get_field	Exception)rg   r6   r    r    r!   rh      s   
rh   c                 C   sP   zt | dd}|dur|durt|t | ddksJ |W S  ty'   Y dS w )zTry 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 serializer
    :return: queryset or ``None``
    Zget_querysetri   Nr   Zserializer_class)r   r?   ro   )viewr   ri   r    r    r!   get_queryset_from_view   s   rq   c                 C   s*   | durt | tjr| S | j} | dusdS )zqGet the nearest parent ``Serializer`` instance for the given field.

    :return: ``Serializer`` or ``None``
    N)rP   r	   rU   parentr\   r    r    r!   get_parent_serializer   s   rt   c              	   C   sb   t t# z| jjW W  d    S  ty&   | jjj Y W  d    S w 1 s*w   Y  d S r   )r   ro   relZrelated_modelr\   Zremote_fieldrg   )Z
descriptorr    r    r!   get_model_from_descriptor   s   
rv   c                 C   s   t t2 d|v r(|dr(|jddd\}}ttt| ||W  d   S tt| |W  d   S 1 s9w   Y  dS )zTry 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``
    .r   )maxsplitN)r   ro   indexsplitget_related_modelrv   r*   )rg   sourceattrr    r    r!   r{      s   
$r{   c                   @      e Zd ZdZdd ZdS )RelatedFieldInspectorz-Provides conversions for ``RelatedField``\ s.c                 K   s  | j |||fi |\}}t|tjr#| |j||}|tj|ddS t|tjs+t	S t
|dd }t|tjtjfrt
|ddrQ| j|j||fi |}	||	dS t
|dd}
|d urct||
\}}n>t|}t
|d	d }t
|d
d }|st| j|}t
|d
d }t
|ddp|j}|st|jtjr|jj}t||}t||
}t|pdtji}|di |S t|tjr|tjtjdS t	S )NT)r?   r2   Zunique_itemsri   pk_field )Zexisting_objectZ
slug_fieldrl   r9   rg   r|   r?   )r?   formatr    )rO   rP   r	   ZManyRelatedFieldr   Zchild_relationr   rT   ZRelatedFieldr   r*   ZPrimaryKeyRelatedFieldZSlugRelatedFieldr   rk   rt   rq   rp   r6   rr   r{   rh   get_basic_type_infoTYPE_STRINGZHyperlinkedRelatedField
FORMAT_URI)r   r\   r]   rM   r^   rL   rK   rH   Zfield_querysetrI   Ztarget_fieldrg   rj   Zparent_serializerr<   Z
this_modelZview_querysetr|   attrsr    r    r!   ra      sD   


z-RelatedFieldInspector.field_to_swagger_objectNrV   rb   rc   rd   ra   r    r    r    r!   r          r   c                 C   s   d}| j D ]}t|t jr"t|t js|t jkrq|dur  dS |}qztt|dddd}W n tyD   tjdt	|  dd Y dS w |rY|
dsQ|
drY|dd	 d
 }|S )zGiven 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   rP   ZRegexValidatorZURLValidatorZvalidate_ipv4_addressr*   ro   loggerwarningstrendswith)Zregex_fieldZregex_validator	validatorr   r    r    r!   
find_regex&  s&   
r   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 ]4}t|ds"q|j}t|tr2t r2t	|}|D ]\}}}t||rM||vsI|||| rM|||< q4qt drc j
sc|dddk rcd|d< tt| S )zGiven 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    )rP   )r-   r   field_classr}   improvesrs   r    r!   r1   a  s    
zfind_limits.<locals>.<listcomp>limit_valueallow_blankr   r   r   )limit_validatorsrP   r	   DecimalFieldr   r   r;   r   r   floatr   getr   sortedr2   )r\   r_   Zapplicable_limitsr   r   Zvalidator_classr}   r   r    rs   r!   rS   Y  s,   



rS   c                 C   s   t | rtjS tjS r   )r   r   TYPE_NUMBERr   rs   r    r    r!   decimal_field_type~  s   r   )Zipv4Zipv6c                 C   s   t | jd S r   )	ip_formatr   protocolrs   r    r    r!   <lambda>  s    r   z3.14.0c                 C   s   | du rdS t D ]\}}t| |r'|\}}t|r|| }t|r%|| } nqdS d}|tjkr5t| }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?   r   r   )
basic_type_inforP   callabler   r   r   rS   r   updater   )r\   r   Ztype_formatswagger_typer   r   r_   rI   r    r    r!   r     s0   


r   c                   C   s   t jrtjS tjS r   )rest_framework_settingsZCOERCE_DECIMAL_TO_STRINGr   r   r   r    r    r    r!   decimal_return_type  r#   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   sL   t | }|r
|d nt}t|pdtji}tdtjfdtjdi |fgS )Nr   r?   r2   r    )r   r   get_basic_type_info_from_hintr   r   r   rT   Items)r   argsZchild_classZchild_type_infor    r    r!   inspect_collection_hint_class  s   r   c                 C   s   t | }|tju r| jS d S r   )r   typingUnionr   )r   r   r    r    r!   _get_union_types  s   
r   c                 C   s   t | }|r#t|dkr!td|d r!t|d }|rd|d< |S dS tD ]*\}}t| |rOt|r8||   S |\}}t|rC| }td|fd|fg  S q%d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?   r   )r   lenrP   r   hinting_type_infor   r   r   )r   Zunion_typesrI   r   infor   r   r    r    r!   r     s*   	

r   c                   @   r~   )SerializerMethodFieldInspectorzProvides conversion for SerializerMethodField, optionally using information from the swagger_serializer_method
    decorator.
    c                 K   sD  t |tjstS t|j|jd }|d u rtS t|dd }|re|j}|d u r+t|dd }|d u r2|j}|j	}|d u r?t|dd }t
|rS||dd}	|jd	i |	}n	||_||_	d|_| j|||ddS t|j}
t
|
syt|
dry|
jd }
t
|
rt|
t
jst|
}|d ur| j|||fi |\}}|d	i |S tS )
N_swagger_serializer	help_textlabelT)r   r   r'   )r'   r   r   r    )rP   r	   ZSerializerMethodFieldr   r*   rr   method_namer   rd   r   r   r   r   r'   r   inspect_signaturereturn_annotationr;   r   r   _emptyr   rO   )r   r\   r]   rM   r^   methodr   descriptionr   Zserializer_kwargsr   	type_inforL   rK   r    r    r!   ra   >  sL   



z6SerializerMethodFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r   9      r   c                   @   r~   )SimpleFieldInspectorzProvides conversions for fields which can be described using just ``type``, ``format``, ``pattern``
    and min/max validators.
    c                 K   s<   t |}|d u r
tS | j|||fi |\}}|di |S )Nr    )r   r   rO   )r   r\   r]   rM   r^   r   rL   rK   r    r    r!   ra   |  s
   z,SimpleFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r   w  r   r   c                   @   r~   )ChoiceFieldInspectorzEProvides conversions for ``ChoiceField`` and ``MultipleChoiceField``.c                 K   sr  | j |||fi |\}}t|tjrtj}g }|j D ]}	t|tjr.t	||	gd }	nt	||	}	|
|	 qt|}
t|
tjrmtt|
dd}t||jpS|jj}t|dd r^|j}|rlt|}|rl|d|}ndd |D }t|dkrttt|}|r|d|}t|tjr|tj|||d	d
}|tjkr|d tjtjfv rd|_|S |||d	}|S tS )Nr   r9   rg   
base_fieldr?   c                 S   s   h | ]}t |qS r    r?   )r-   vr    r    r!   	<setcomp>  s    z?ChoiceFieldInspector.field_to_swagger_object.<locals>.<setcomp>r   )r?   enumr>   inmulti)rO   rP   r	   ZChoiceFieldr   r   choiceskeysZMultipleChoiceFieldr   rD   rt   ZModelSerializerr*   rh   r|   rr   r   r   r   r   r   nextiterrT   r+   IN_FORMZIN_QUERYZcollection_formatr   )r   r\   r]   rM   r^   rL   rK   Z	enum_typeZenum_valueschoicer   rg   rj   Z
model_typeZenum_value_typesZvalues_typerI   r    r    r!   ra     sP   

z,ChoiceFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r     r   r   c                   @   r~   )FileFieldInspectorz*Provides conversions for ``FileField``\ s.c           
      K   s   | j |||fi |\}}t|tjrHtd}|tjkr0|tjdd}t|dt	j
r.tj|_|S |tjkrF|tjd}	|	d tjkrD||	S |tS )NzFFileField is supported only in a formData Parameter or response SchemaT)r?   r'   Zuse_urlr   r   )rO   rP   r	   Z	FileFieldr   r   r   r   r*   r   ZUPLOADED_FILES_USE_URLr   r   r+   Z	TYPE_FILEr   r   )
r   r\   r]   rM   r^   rL   rK   errrI   paramr    r    r!   ra     s   

z*FileFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r     r   r   c                   @   r~   )DictFieldInspectorz&Provides conversion for ``DictField``.c                 K   sR   | j |||fi |\}}t|tjr'|tjkr'| |j||}|tj|dS t	S )N)r?   Zadditional_properties)
rO   rP   r	   Z	DictFieldr   r   r   rG   rE   r   )r   r\   r]   rM   r^   rL   rK   rH   r    r    r!   ra     s   z*DictFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r     r   r   c                   @   r~   )HiddenFieldInspectorzHide ``HiddenField``.c                 K   s   t |tjrd S tS r   )rP   r	   ZHiddenFieldr   )r   r\   r]   rM   r^   r    r    r!   ra     s   z,HiddenFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r     r   r   c                   @   r~   )JSONFieldInspectorz&Provides conversion for ``JSONField``.c                 K   s@   | j |||fi |\}}t|tjr|tjkr|tjdS tS Nr   )rO   rP   r	   Z	JSONFieldr   r   rE   r   r   r\   r]   rM   r^   rL   rK   r    r    r!   ra     s   z*JSONFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r     r   r   c                   @   r~   )StringDefaultFieldInspectorzRFor otherwise unhandled fields, return them as plain :data:`.TYPE_STRING` objects.c                 K   s&   | j |||fi |\}}|tjdS r   )rO   r   r   r   r    r    r!   ra     s   z3StringDefaultFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r     r   r   )CamelCaseJSONParser)CamelCaseJSONRenderercamelizec                 C   s   | S r   r    )datar    r    r!   r     r8   r   c                   @   sD   e Zd ZdZdd Zdd Zdd Zererdd	 Z	dS 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 )zHack to force ``djangorestframework_camel_case`` to camelize a plain string.

        :param str s: the string
        :return: camelized string
        :rtype: str
        r   )r   r   r   )r   sr    r    r!   camelize_string  s   z#CamelCaseJSONFilter.camelize_stringc                    sX   t |di r(t fdd|j D |_t |dg r* fdd|jD |_dS dS dS )zRecursively 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   s6    | ]\}}  | t| jp|fV  qd S r   )r   camelize_schemar   resolve_refrW   )r-   r.   valr   r    r!   	<genexpr>%  s
     
z6CamelCaseJSONFilter.camelize_schema.<locals>.<genexpr>rA   c                    s   g | ]}  |qS r    )r   )r-   pr   r    r!   r1   +  s    z7CamelCaseJSONFilter.camelize_schema.<locals>.<listcomp>N)r*   r   r@   r2   rA   )r   schemar    r   r!   r     s   
z#CamelCaseJSONFilter.camelize_schemac                 K   s2   t |tjjr|  rt|| j}| | |S r   )rP   r   r   ZOR_REFis_camel_caser   rW   r   )r   rI   r   objr^   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       | ]}t |tV  qd S r   )r   r   )r-   parserr    r    r!   r   7      z4CamelCaseJSONFilter.is_camel_case.<locals>.<genexpr>c                 s   r   r   )r   r   )r-   rendererr    r    r!   r   8  r   )anyZget_parser_classesZget_renderer_classesr   r    r    r!   r   5  s   z!CamelCaseJSONFilter.is_camel_casec                 C   s   dS )NFr    r   r    r    r!   r   ;  r8   N)
rV   rb   rc   rd   r   r   r   r   r   r   r    r    r    r!   r     s    	r   )RecursiveFieldc                   @   re   )RecursiveFieldInspectorbProvides conversion for RecursiveField (https://github.com/heywbj/django-rest-framework-recursive)N)rV   rb   rc   rd   r    r    r    r!   r   B  s    r   c                   @   r~   )r   r   c           	      K   s   t |trQ|tjkrQ|du sJ d|j}t |jtjr|j}t|}|d us1J dt	t
| | jtj}tj||dd}t |jtjrOt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_unresolvedr>   )rP   r   r   r   proxiedr	   rQ   rG   r   r   r?   rW   rX   rY   r[   r   rT   r   )	r   r\   r]   rM   r^   r  r:   r`   refr    r    r!   ra   I  s   z/RecursiveFieldInspector.field_to_swagger_objectNr   r    r    r    r!   r   F  r   r   )datetimer   loggingoperatoruuid
contextlibr   collectionsr   decimalr   r   r   pkg_resourcesr   Zdjango.corer   Z	django.dbr   	packagingr   Zrest_frameworkr	   Zrest_framework.settingsr
   r   baser   r   r   r   r   r   errorsr   utilsr   r   r   r   r   get_distributionZdrf_version	getLoggerrV   r   r   rf   rk   rh   rq   rt   rv   r{   r   r   ZIntegerFieldZ
FloatFieldr   Znumeric_fieldsZMinValueValidator__gt__ZMaxValueValidator__lt__ZMinLengthValidatorZ	CharFieldZMaxLengthValidatorrR   rQ   r   rS   r   Z	AutoFieldZTYPE_INTEGERZBinaryFieldr   ZFORMAT_BINARYZBooleanFieldZTYPE_BOOLEANZ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URLFieldr   Z
RegexFieldZ
ModelFieldZserializer_field_to_basic_typeparserD   ZNullBooleanFieldr   r   r   r   r   rC   intr   r   dictrE   UUIDdater   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
	-