U
    zh                     @   s   d dl Z d dl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)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__ o/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/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   )r/   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   fieldr4   r5   prefixr   r   r   r   L   s
    zBoundField.__init__c                 C   s   t | j|S r   )getattrr2   )r   	attr_namer   r   r   __getattr__S   s    zBoundField.__getattr__c                 C   s   | j jS r   )r2   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'   r4   r5   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 NFr1   )r4   r   r2   r5   r3   r   r4   r   r   r   as_form_field_   s    zBoundField.as_form_fieldN)r1   )
r'   r(   r)   r*   r   r=   propertyr>   r   rA   r   r   r   r   r0   E   s   

r0   c                   @   s   e Zd Zdd ZdS )JSONBoundFieldc              	   C   sT   | j }t|dds>ttt tj| j dddd}W 5 Q R X | | j	|| j
| jS )NZis_json_stringFT   ),z: )	sort_keysindent
separators)r4   r;   
contextlibsuppress	TypeError
ValueErrorr   dumpsr   r2   r5   r3   r@   r   r   r   rA   e   s    zJSONBoundField.as_form_fieldN)r'   r(   r)   rA   r   r   r   r   rC   d   s   rC   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.
    r1   c                    s4   |d ks|dkst |tsi }t |||| d S )Nr1   )r   r   r   r   r8   r   r   r   r   {   s    zNestedBoundField.__init__c                 c   s    | j  D ]}| |j V  q
d S r   )fieldsvaluesr6   )r   r9   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 )NrO   .)r:   Z_is_jsonfieldF)rO   r4   getr   r5   r   hasattrrN   r7   r;   rC   r0   )r   keyr9   r4   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?   )
r4   itemsr   r/   r   r   r   r2   r5   r3   )r   rP   rU   r4   r   r   r   rA      s    
"zNestedBoundField.as_form_field)r1   )	r'   r(   r)   r*   r   rQ   rW   rA   r-   r   r   r   r   rN   t   s
   
rN   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   || _ i | _d S r   )r   rO   )r   r   r   r   r   r      s    zBindingDict.__init__c                 C   s   || j |< |j|| jd d S )N)r6   parent)rO   bindr   )r   rU   r9   r   r   r   __setitem__   s    
zBindingDict.__setitem__c                 C   s
   | j | S r   rO   r   rU   r   r   r   rW      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   )iterrO   r   r   r   r   rQ      s    zBindingDict.__iter__c                 C   s
   t | jS r   )lenrO   r   r   r   r   __len__   s    zBindingDict.__len__c                 C   s   t | jS r   )r   r   rO   r   r   r   r   r      s    zBindingDict.__repr__N)r'   r(   r)   r*   r   r\   rW   r_   rQ   rb   r   r   r   r   r   rY      s   rY   )rI   r+   collections.abcr   r   Zdjango.utils.encodingr   Zrest_framework.utilsr   r   r   r/   r.   r0   rC   rN   rY   r   r   r   r   <module>   s   '$