a
    5Xh                     @   sf   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 G dd dej
Z
edd	d
dZdd ZdS )z
A Python "serializer". Doesn't do much serializing per se -- just converts to
and from basic Python data types (lists, dicts, strings, etc.). Useful as a basis for
other serializers.
    )apps)base)DEFAULT_DB_ALIASmodels)is_protected_typec                   @   sd   e Zd 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d Zdd Zdd ZdS )
Serializerz7
    Serialize a QuerySet to basic Python objects.
    Tc                 C   s   d | _ g | _d S N)_currentobjectsself r   c/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/django/core/serializers/python.pystart_serialization   s    zSerializer.start_serializationc                 C   s   d S r   r   r   r   r   r   end_serialization   s    zSerializer.end_serializationc                 C   s
   i | _ d S r   )r	   r   objr   r   r   start_object   s    zSerializer.start_objectc                 C   s   | j | | d | _d S r   )r
   appendget_dump_objectr	   r   r   r   r   
end_object   s    zSerializer.end_objectc                 C   s@   dt |ji}| jrt|ds2| ||jj|d< | j|d< |S )Nmodelnatural_keypkfields)str_metaZuse_natural_primary_keyshasattr_value_from_fieldr   r	   )r   r   datar   r   r   r   "   s
    
zSerializer.get_dump_objectc                 C   s    | |}t|r|S ||S r   )Zvalue_from_objectr   Zvalue_to_string)r   r   fieldvaluer   r   r   r   )   s    
zSerializer._value_from_fieldc                 C   s   |  ||| j|j< d S r   )r   r	   name)r   r   r    r   r   r   handle_field0   s    zSerializer.handle_fieldc                 C   sP   | j r4t|jjdr4t||j}|r.| }q@d }n| ||}|| j|j< d S )Nr   )	use_natural_foreign_keysr   remote_fieldr   getattrr"   r   r   r	   )r   r   r    relatedr!   r   r   r   handle_fk_field3   s    
zSerializer.handle_fk_fieldc                    s   |j jjjr|jr2t|j jdr2dd  dd }nfdd dd }t|di |j	|||} fd	d
|D j
|j	< d S )Nr   c                 S   s   |   S r   )r   r!   r   r   r   	m2m_valueF   s    z.Serializer.handle_m2m_field.<locals>.m2m_valuec                 S   s   t | |j S r   )r&   r"   iteratorr   r    r   r   r   queryset_iteratorI   s    z6Serializer.handle_m2m_field.<locals>.queryset_iteratorc                    s     | | jjS r   )r   r   r   r)   r   r   r   r*   N   s    c                 S   s   t | |jd d S )Nr   )r&   r"   Zselect_relatedonlyr+   r,   r   r   r   r-   Q   s    Z_prefetched_objects_cachec                    s   g | ]} |qS r   r   ).0r'   )r*   r   r   
<listcomp>]       z/Serializer.handle_m2m_field.<locals>.<listcomp>)r%   Zthroughr   Zauto_createdr$   r   r   r&   getr"   r	   )r   r   r    r-   Zm2m_iterr   )r*   r   r   handle_m2m_field@   s    
zSerializer.handle_m2m_fieldc                 C   s   | j S r   )r
   r   r   r   r   getvalue_   s    zSerializer.getvalueN)__name__
__module____qualname____doc__Zinternal_use_onlyr   r   r   r   r   r   r#   r(   r3   r4   r   r   r   r   r      s   r   F)usingignorenonexistentc                k   s  | dd}i }| D ]}zt|d }W n  tjyJ   |rDY qn Y n0 i }d|v rz"|jj|d||jjj< W n@ t	y }	 z(tj
|	|d |ddW Y d}	~	n
d}	~	0 0 i }
i }||vrdd |j D ||< || }|d  D ]\}}|r||vrq|j|}|jrt|jtjrzt||||}W nH tjy }	 z,tj
|	j|d |d|	jW Y d}	~	n
d}	~	0 0 |tjkr|||< n
||
|j< q|jrJt|jtjrJzt||||}W nB t	y& }	 z(tj
|	|d |d|W Y d}	~	n
d}	~	0 0 |tjkr>|||< n
|||j< qz||||j< W q t	y }	 z(tj
|	|d |d|W Y d}	~	qd}	~	0 0 qt|||}t||
|V  qdS )	z
    Deserialize simple Python objects back into Django ORM instances.

    It's expected that you pass the Python objects themselves (instead of a
    stream or a string) to the constructor
    handle_forward_referencesFr   r   Nc                 S   s   h | ]
}|j qS r   )r"   )r/   fr   r   r   	<setcomp>   r1   zDeserializer.<locals>.<setcomp>r   )pop
_get_modelr   DeserializationErrorr   r   Z	to_pythonr2   Zattname	ExceptionZWithDataZ
get_fieldsitems	get_fieldr%   
isinstancer   ZManyToManyRelZdeserialize_m2m_valuesZM2MDeserializationErrorZoriginal_excZDEFER_FIELDr"   ZManyToOneRelZdeserialize_fk_valueZbuild_instanceZDeserializedObject)Zobject_listr9   r:   optionsr;   Zfield_names_cachedZModelr   eZm2m_dataZdeferred_fieldsfield_names
field_nameZfield_valuer    valuesr!   r   r   r   r   Deserializerc   s|    	
"



rK   c              	   C   s6   zt | W S  ttfy0   td|  Y n0 dS )z6Look up a model from an "app_label.model_name" string.zInvalid model identifier: '%s'N)r   Z	get_modelLookupError	TypeErrorr   r@   )Zmodel_identifierr   r   r   r?      s    r?   N)r8   Zdjango.appsr   Zdjango.core.serializersr   Z	django.dbr   r   Zdjango.utils.encodingr   r   rK   r?   r   r   r   r   <module>   s   WY