a
    còfë  ã                   @   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|i |¤Ž d S ©NÚ
serializer©Úpopr   ÚsuperÚ__init__©ÚselfÚargsÚkwargs©Ú	__class__© úd/home/httpd/docs/test/DocsMgr/lib/python3.9/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|i |¤Ž 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 u s| j du 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   sh   | j }t|ddƒsRt tt¡�$ tj| j dddd�}W d   ƒ n1 sH0    Y  |  | 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 u 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 u s>|du 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   '$