U
    d$                     @   s   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	 G dd deZ
G dd	 d	eZG d
d dZG dd deZG dd deZG dd deZdS )    N)OrderedDict)MappingMutableMapping)	force_str)jsonc                       sR   e Zd ZdZ fddZdd Zdd Zdd	 Zej	d
krJdd Z
dd Z  ZS )
ReturnDictz
    Return object from `serializer.data` for the `Serializer` class.
    Includes a backlink to the serializer instance for renderers
    to use if they need richer field information.
    c                    s   | d| _t j|| d S N
serializerpopr	   super__init__selfargskwargs	__class__ K/tmp/pip-unpacked-wheel-quko9yh2/rest_framework/utils/serializer_helpers.pyr      s    zReturnDict.__init__c                 C   s   t | | jdS N)r	   )r   r	   r   r   r   r   copy   s    zReturnDict.copyc                 C   s
   t | S N)dict__repr__r   r   r   r   r      s    zReturnDict.__repr__c                 C   s   t t | ffS r   )r   r   r   r   r   
__reduce__   s    zReturnDict.__reduce__)   	   c                 C   s,   t |tstS | j| | jd}|| |S r   
isinstancer   NotImplementedr   r	   updater   othernewr   r   r   __or__"   s
    

zReturnDict.__or__c                 C   s,   t |tstS | j|| jd}||  |S r   r   r#   r   r   r   __ror__)   s
    

zReturnDict.__ror__)__name__
__module____qualname____doc__r   r   r   r   sysversion_infor&   r'   __classcell__r   r   r   r   r   
   s   
r   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )
ReturnListz
    Return object from `serializer.data` for the `SerializerList` class.
    Includes a backlink to the serializer instance for renderers
    to use if they need richer field information.
    c                    s   | d| _t j|| d S r   r
   r   r   r   r   r   8   s    zReturnList.__init__c                 C   s
   t | S r   )listr   r   r   r   r   r   <   s    zReturnList.__repr__c                 C   s   t t | ffS r   )r0   r   r   r   r   r   ?   s    zReturnList.__reduce__)r(   r)   r*   r+   r   r   r   r.   r   r   r   r   r/   1   s   r/   c                   @   s>   e Zd ZdZdddZdd Zedd Zd	d
 Zdd Z	dS )
BoundFieldz
    A field object that also includes `.value` and `.error` properties.
    Returned when iterating over a serializer instance,
    providing an API similar to Django forms and form fields.
     c                 C   s(   || _ || _|| _|| _|| j | _d S r   )_field_prefixvalueerrors
field_namenamer   fieldr5   r6   prefixr   r   r   r   L   s
    zBoundField.__init__c                 C   s   t | j|S r   )getattrr3   )r   	attr_namer   r   r   __getattr__S   s    zBoundField.__getattr__c                 C   s   | j jS r   )r3   r   r   r   r   r   _proxy_classV   s    zBoundField._proxy_classc                 C   s   d| j j| j| jf S )Nz<%s value=%s errors=%s>)r   r(   r5   r6   r   r   r   r   r   Z   s
      zBoundField.__repr__c                 C   s4   | j d ks| j dkrdn| j }| | j|| j| jS NFr2   )r5   r   r3   r6   r4   r   r5   r   r   r   as_form_field_   s    zBoundField.as_form_fieldN)r2   )
r(   r)   r*   r+   r   r>   propertyr?   r   rB   r   r   r   r   r1   E   s   

r1   c                   @   s   e Zd Zdd ZdS )JSONBoundFieldc              	   C   sZ   | j }t|ddsDztj| j dddd}W n ttfk
rB   Y nX | | j|| j| j	S )NZis_json_stringFT   ),z: )	sort_keysindent
separators)
r5   r<   r   dumps	TypeError
ValueErrorr   r3   r6   r4   rA   r   r   r   rB   e   s    
zJSONBoundField.as_form_fieldN)r(   r)   r*   rB   r   r   r   r   rD   d   s   rD   c                       s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )NestedBoundFieldz
    This `BoundField` additionally implements __iter__ and __getitem__
    in order to support nested bound fields. This class is the type of
    `BoundField` that is used for serializer fields.
    r2   c                    s4   |d ks|dkst |tsi }t |||| d S )Nr2   )r    r   r   r   r9   r   r   r   r   }   s    zNestedBoundField.__init__c                 c   s    | j  D ]}| |j V  q
d S r   )fieldsvaluesr7   )r   r:   r   r   r   __iter__   s    zNestedBoundField.__iter__c                 C   s   | j | }| jr| j|nd }t| jtr8| j|nd }t|dr\t|||| jd dS t	|ddr~t
|||| jd dS t|||| jd dS )NrN   .)r;   Z_is_jsonfieldF)rN   r5   getr    r6   r   hasattrrM   r8   r<   rD   r1   )r   keyr:   r5   errorr   r   r   __getitem__   s    

zNestedBoundField.__getitem__c                 C   sf   i }| j  D ]@\}}t|ttfr.|||< q|d ks>|dkrBdnt|||< q| | j|| j| j	S r@   )
r5   itemsr    r0   r   r   r   r3   r6   r4   )r   rO   rT   r5   r   r   r   rB      s    
"zNestedBoundField.as_form_field)r2   )	r(   r)   r*   r+   r   rP   rV   rB   r.   r   r   r   r   rM   v   s
   
rM   c                   @   sH   e 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S )BindingDictz
    This dict-like object is used to store fields on a serializer.

    This ensures that whenever fields are added to the serializer we call
    `field.bind()` so that the `field_name` and `parent` attributes
    can be set correctly.
    c                 C   s   || _ t | _d S r   )r	   r   rN   )r   r	   r   r   r   r      s    zBindingDict.__init__c                 C   s   || j |< |j|| jd d S )N)r7   parent)rN   bindr	   )r   rT   r:   r   r   r   __setitem__   s    
zBindingDict.__setitem__c                 C   s
   | j | S r   rN   r   rT   r   r   r   rV      s    zBindingDict.__getitem__c                 C   s   | j |= d S r   r\   r]   r   r   r   __delitem__   s    zBindingDict.__delitem__c                 C   s
   t | jS r   )iterrN   r   r   r   r   rP      s    zBindingDict.__iter__c                 C   s
   t | jS r   )lenrN   r   r   r   r   __len__   s    zBindingDict.__len__c                 C   s   t | jS r   )r   r   rN   r   r   r   r   r      s    zBindingDict.__repr__N)r(   r)   r*   r+   r   r[   rV   r^   rP   ra   r   r   r   r   r   rX      s   rX   )r,   collectionsr   collections.abcr   r   Zdjango.utils.encodingr   Zrest_framework.utilsr   r   r0   r/   r1   rD   rM   rX   r   r   r   r   <module>   s   '$