o
    "7h                     @   sl   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 ddl
mZ G dd dejZG d	d
 d
ej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)CompositePrimaryKey)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   s/var/www/epreuve.sigeris.cm/public_html/epreuve/venv/lib/python3.10/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s| ||jj|d< | j|d< |S )Nmodelnatural_keypkfields)str_metause_natural_primary_keyshasattr_value_from_fieldr   r
   )r   r   datar   r   r   r   #   s
   
zSerializer.get_dump_objectc                    s>   t |tr fdd|D S | }t|r|S | S )Nc                    s   g | ]}  |qS r   )r    .0fr   r   r   r   
<listcomp>,   s    z0Serializer._value_from_field.<locals>.<listcomp>)
isinstancer   value_from_objectr   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_field3   s   zSerializer.handle_fieldc                 C   sP   | j rt|jjdrt||j}|r| }n	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_field6   s   
zSerializer.handle_fk_fieldc                    s   |j jjjr@jrt|j jdrdd  dd }n
fdd dd }t|di |j	|||} fd	d
|D j
|j	< d S d S )Nr   c                 S   s   |   S r	   )r   r+   r   r   r   	m2m_valueI   s   z.Serializer.handle_m2m_field.<locals>.m2m_valuec                 S   s*   t | |j}t |dd rdnd }||S )Nprefetch_cache_name  )r0   r,   iterator)r   r*   attr
chunk_sizer   r   r   queryset_iteratorL   s   
z6Serializer.handle_m2m_field.<locals>.queryset_iteratorc                    s     | | jjS r	   )r    r   r   r3   r   r   r   r4   U   s   c                 S   s2   t | |jd d}|jrdnd }|j|dS )Nr   r6   )r9   )r0   r,   select_relatedonly_prefetch_related_lookupsr7   )r   r*   	query_setr9   r   r   r   r:   X   s   _prefetched_objects_cachec                    s   g | ]} |qS r   r   )r#   r1   )r4   r   r   r&   a   s    z/Serializer.handle_m2m_field.<locals>.<listcomp>)r/   throughr   auto_createdr.   r   r   r0   getr,   r
   )r   r   r*   r:   m2m_iterr   )r4   r   r   handle_m2m_fieldC   s   
	zSerializer.handle_m2m_fieldc                 C   s   | j S r	   )r   r   r   r   r   getvaluec   s   zSerializer.getvalueN)__name__
__module____qualname____doc__internal_use_onlyr   r   r   r   r   r    r-   r2   rD   rE   r   r   r   r   r      s    	 r   c                       s\   e Zd ZdZedd fdd
Zdd Zdd	 Zd
d Zdd Z	dd Z
edd Z  ZS )Deserializerz
    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
    F)usingignorenonexistentc                   s>   t  j|fi | |dd| _|| _|| _i | _d | _d S )Nhandle_forward_referencesF)super__init__poprN   rL   rM   field_names_cache	_iterator)r   object_listrL   rM   options	__class__r   r   rP   o   s   
zDeserializer.__init__c                 c   s"    | j D ]
}| |E d H  qd S r	   )stream_handle_objectr   r   r   r   __iter__y   s   
zDeserializer.__iter__c                 C   s   | j d u r
t| | _ t| j S r	   )rS   iternextr   r   r   r   __next__}   s   


zDeserializer.__next__c                 c   sd   i }i }i }z	|  |d }W n tjy   | jrY d S  w d|v rPz|jj|d||jjj< W n t	yO } ztj
||d |dd d }~ww || jvrbdd |j D | j|< | j| }|d  D ]\}}	| jry||vryqm|j|}
|
jrt|
jtjrz| |
|	}|tjkr|	||
< n|||
j< W qm tjy } ztj
|j|d |d|jd }~ww |
jrt|
jtjrz| |
|	}|tjkr|	||
< n|||
j< W qm t	y } ztj
||d |d|	d }~ww z
|
|	||
j< W qm t	y } ztj
||d |d|	d }~ww t||| j}t|||V  d S )Nr   r   c                 S   s   h | ]}|j qS r   )r,   r"   r   r   r   	<setcomp>   s    z.Deserializer._handle_object.<locals>.<setcomp>r   )_get_model_from_noder   DeserializationErrorrM   r   r   	to_pythonrB   attname	ExceptionWithDatarR   
get_fieldsitems	get_fieldr/   r'   r   ManyToManyRel_handle_m2m_field_nodeDEFER_FIELDr,   M2MDeserializationErrororiginal_excManyToOneRel_handle_fk_field_nodebuild_instancerL   DeserializedObject)r   r   r!   m2m_datadeferred_fieldsModelefield_names
field_namefield_valuer*   valuesr+   model_instancer   r   r   rY      s   "







zDeserializer._handle_objectc                 C      t ||| j| jS r	   )r   deserialize_m2m_valuesrL   rN   r   r*   rw   r   r   r   ri         z#Deserializer._handle_m2m_field_nodec                 C   rz   r	   )r   deserialize_fk_valuerL   rN   r|   r   r   r   rn      r}   z"Deserializer._handle_fk_field_nodec              	   C   s0   zt | W S  ttfy   td|  w )z6Look up a model from an "app_label.model_name" string.zInvalid model identifier: )r   	get_modelLookupError	TypeErrorr   r`   )model_identifierr   r   r   r_      s   z!Deserializer._get_model_from_node)rF   rG   rH   rI   r   rP   rZ   r]   rY   ri   rn   staticmethodr_   __classcell__r   r   rV   r   rK   g   s    
JrK   N)rI   django.appsr   django.core.serializersr   	django.dbr   r   django.db.modelsr   django.utils.encodingr   r   rK   r   r   r   r   <module>   s    Y