3
Ah`                 @   s   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 )    )OrderedDict)MappingMutableMapping)	force_str)jsonc                   s8   e Zd ZdZ fddZdd Zd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   |j d| _t j|| d S )N
serializer)popr   super__init__)selfargskwargs)	__class__ V/tmp/pip-build-9m32_hle/djangorestframework/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 j| S )N)dict__repr__)r   r   r   r   r      s    zReturnDict.__repr__c             C   s   t t | ffS )N)r   )r   r   r   r   
__reduce__   s    zReturnDict.__reduce__)	__name__
__module____qualname____doc__r   r   r   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   |j d| _t j|| d S )Nr   )r	   r   r
   r   )r   r   r   )r   r   r   r   '   s    zReturnList.__init__c             C   s
   t j| S )N)listr   )r   r   r   r   r   +   s    zReturnList.__repr__c             C   s   t t | ffS )N)r   )r   r   r   r   r   .   s    zReturnList.__reduce__)r   r   r   r   r   r   r   r   r   r   )r   r   r       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 )N)_field_prefixvalueerrors
field_namename)r   fieldr!   r"   prefixr   r   r   r   ;   s
    zBoundField.__init__c             C   s   t | j|S )N)getattrr   )r   	attr_namer   r   r   __getattr__B   s    zBoundField.__getattr__c             C   s   | j jS )N)r   r   )r   r   r   r   _proxy_classE   s    zBoundField._proxy_classc             C   s   d| j j| j| jf S )Nz<%s value=%s errors=%s>)r   r   r!   r"   )r   r   r   r   r   I   s    zBoundField.__repr__c             C   s4   | j d ks| j dkrdn| j }| j| j|| j| jS )NFr   )r!   r   r   r"   r    )r   r!   r   r   r   as_form_fieldN   s    zBoundField.as_form_fieldN)r   )
r   r   r   r   r   r)   propertyr*   r   r+   r   r   r   r   r   4   s   
r   c               @   s   e Zd Zdd ZdS )JSONBoundFieldc             C   sZ   | j }t|ddsDytj| j dddd}W n ttfk
rB   Y nX | j| j|| j| j	S )	NZis_json_stringFT   ,: )	sort_keysindent
separators)r/   r0   )
r!   r'   r   dumps	TypeError
ValueErrorr   r   r"   r    )r   r!   r   r   r   r+   T   s    zJSONBoundField.as_form_fieldN)r   r   r   r+   r   r   r   r   r-   S   s   r-   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.
    r   c                s6   |d ks|dkst |t r i }t j|||| d S )Nr   )
isinstancer   r
   r   )r   r%   r!   r"   r&   )r   r   r   r   l   s    zNestedBoundField.__init__c             c   s$   x| j j D ]}| |j V  qW d S )N)fieldsvaluesr#   )r   r%   r   r   r   __iter__q   s    zNestedBoundField.__iter__c             C   s   | j | }| jr| jj|nd }t| jtr8| j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 )Nr9   .)r&   Z_is_jsonfieldF)r9   r!   getr8   r"   r   hasattrr7   r$   r'   r-   r   )r   keyr%   r!   errorr   r   r   __getitem__u   s    

zNestedBoundField.__getitem__c             C   sj   i }xN| j j D ]@\}}t|ttfr0|||< q|d ks@|dkrDdnt|||< qW | j| j|| j| j	S )NFr   )
r!   itemsr8   r   r   r   r   r   r"   r    )r   r:   r?   r!   r   r   r   r+      s    
$zNestedBoundField.as_form_field)r   )	r   r   r   r   r   r;   rA   r+   r   r   r   )r   r   r7   e   s
   
r7   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 )N)r   r   r9   )r   r   r   r   r   r      s    zBindingDict.__init__c             C   s   || j |< |j|| jd d S )N)r#   parent)r9   bindr   )r   r?   r%   r   r   r   __setitem__   s    
zBindingDict.__setitem__c             C   s
   | j | S )N)r9   )r   r?   r   r   r   rA      s    zBindingDict.__getitem__c             C   s   | j |= d S )N)r9   )r   r?   r   r   r   __delitem__   s    zBindingDict.__delitem__c             C   s
   t | jS )N)iterr9   )r   r   r   r   r;      s    zBindingDict.__iter__c             C   s
   t | jS )N)lenr9   )r   r   r   r   __len__   s    zBindingDict.__len__c             C   s   t j| jS )N)r   r   r9   )r   r   r   r   r      s    zBindingDict.__repr__N)r   r   r   r   r   rF   rA   rG   r;   rJ   r   r   r   r   r   rC      s   rC   N)collectionsr   collections.abcr   r   Zdjango.utils.encodingr   Zrest_framework.utilsr   r   r   r   r   r-   r7   rC   r   r   r   r   <module>   s   $