a
    LcòfÒ  ã                   @   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   ú[/home/httpd/docs/test/DocsMgr/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 r¼z"|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rädd„ |j ¡ D ƒ||< || }|d  ¡ D �]¨\}}|�r||v�rqø|j |¡}|j�r¸t|jtjƒ�r¸z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< qøz| |¡||j< W qø t	�y  }	 z(tj 
|	|d | d¡|¡‚W Y d}	~	qød}	~	0 0 qøt |||¡}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