o
    "7h                     @   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                       sZ   e Zd ZdZ fddZdd Zdd Zdd	 Zej	d
kr)dd Z
dd Z  ZS   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                    "   | d| _t j|i | d S N
serializerpopr	   super__init__selfargskwargs	__class__ |/var/www/epreuve.sigeris.cm/public_html/epreuve/venv/lib/python3.10/site-packages/rest_framework/utils/serializer_helpers.pyr         zReturnDict.__init__c                 C   s   t | | jdS N)r	   )r   r	   r   r   r   r   copy   s   zReturnDict.copyc                 C   
   t | S N)dict__repr__r   r   r   r   r         
zReturnDict.__repr__c                 C      t t | ffS r   )r   r   r   r   r   
__reduce__      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__"   
   

zReturnDict.__or__c                 C   s,   t |tstS | j|| jd}||  |S r   r$   r(   r   r   r   __ror__)   r,   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                    r   r   r
   r   r   r   r   r   8   r   zReturnList.__init__c                 C   r   r   )listr   r   r   r   r   r   <   r   zReturnList.__repr__c                 C   r   r   )r6   r   r   r   r   r    ?   r!   zReturnList.__reduce__)r.   r/   r0   r1   r   r   r    r4   r   r   r   r   r5   1   s
    r5   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   fieldr;   r<   prefixr   r   r   r   L   s
   zBoundField.__init__c                 C   s   t | j|S r   )getattrr9   )r   	attr_namer   r   r   __getattr__S      zBoundField.__getattr__c                 C   s   | j jS r   )r9   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.   r;   r<   r   r   r   r   r   Z   s   zBoundField.__repr__c                 C   s4   | j d u s
| j du rdn| j }| | j|| j| jS NFr8   )r;   r   r9   r<   r:   r   r;   r   r   r   as_form_field_   s   zBoundField.as_form_fieldNr8   )
r.   r/   r0   r1   r   rD   propertyrF   r   rI   r   r   r   r   r7   E   s    

r7   c                   @   s   e Zd Zdd ZdS )JSONBoundFieldc                 C   sh   | j }t|dds)ttt tj| j dddd}W d    n1 s$w   Y  | | j	|| j
| jS )Nis_json_stringFT   ),z: )	sort_keysindent
separators)r;   rB   
contextlibsuppress	TypeError
ValueErrorr   dumpsr   r9   r<   r:   rH   r   r   r   rI   e   s   zJSONBoundField.as_form_fieldN)r.   r/   r0   rI   r   r   r   r   rL   d   s    rL   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.
    r8   c                    s4   |d u s|dkst |tsi }t |||| d S )Nr8   )r%   r   r   r   r?   r   r   r   r   {   s   zNestedBoundField.__init__c                 c   s"    | j  D ]}| |j V  qd S r   )fieldsvaluesr=   )r   r@   r   r   r   __iter__   s   zNestedBoundField.__iter__c                 C   s   | j | }| jr| j|nd }t| jtr| 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 )NrY   .)rA   _is_jsonfieldF)rY   r;   getr%   r<   r   hasattrrX   r>   rB   rL   r7   )r   keyr@   r;   errorr   r   r   __getitem__   s   

zNestedBoundField.__getitem__c                 C   sf   i }| j  D ] \}}t|ttfr|||< q|d u s|du r!dnt|||< q| | j|| j| j	S rG   )
r;   itemsr%   r6   r   r   r   r9   r<   r:   )r   rZ   r`   r;   r   r   r   rI      s   
"zNestedBoundField.as_form_fieldrJ   )	r.   r/   r0   r1   r   r[   rb   rI   r4   r   r   r   r   rX   t   s    
rX   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	   rY   )r   r	   r   r   r   r      s   
zBindingDict.__init__c                 C   s   || j |< |j|| jd d S )N)r=   parent)rY   bindr	   )r   r`   r@   r   r   r   __setitem__   s   
zBindingDict.__setitem__c                 C   s
   | j | S r   rY   r   r`   r   r   r   rb      r   zBindingDict.__getitem__c                 C   s   | j |= d S r   rh   ri   r   r   r   __delitem__   rE   zBindingDict.__delitem__c                 C   
   t | jS r   )iterrY   r   r   r   r   r[      r   zBindingDict.__iter__c                 C   rk   r   )lenrY   r   r   r   r   __len__   r   zBindingDict.__len__c                 C   s   t | jS r   )r   r   rY   r   r   r   r   r      rE   zBindingDict.__repr__N)r.   r/   r0   r1   r   rg   rb   rj   r[   rn   r   r   r   r   r   rd      s    rd   )rS   r2   collections.abcr   r   django.utils.encodingr   rest_framework.utilsr   r   r   r6   r5   r7   rL   rX   rd   r   r   r   r   <module>   s    '$