
    	i                         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ej                  Z G 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                   R    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )
Serializerz7
    Serialize a QuerySet to basic Python objects.
    Tc                 "    d | _         g | _        d S N)_currentobjectsselfs    V/srv/django_bis/venv311/lib/python3.11/site-packages/django/core/serializers/python.pystart_serializationzSerializer.start_serialization   s        c                     d S r    r   s    r   end_serializationzSerializer.end_serialization   s    r   c                     i | _         d S r   )r   r   objs     r   start_objectzSerializer.start_object   s    r   c                 n    | j                             |                     |                     d | _        d S r   )r   appendget_dump_objectr   r   s     r   
end_objectzSerializer.end_object   s1    D0055666r   c                     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   datas      r   r   zSerializer.get_dump_object#   s_    SY(, 	CGC4O4O 	C//SY\BBDJXr   c                      t          |t                    r fd|D             S |                              }t          |          r|n|                              S )Nc                 <    g | ]}                     |          S r   )r(   ).0fr   r   s     r   
<listcomp>z0Serializer._value_from_field.<locals>.<listcomp>,   s)    BBBqD**322BBBr   )
isinstancer   value_from_objectr   value_to_string)r   r   fieldvalues   ``  r   r(   zSerializer._value_from_field*   so    e011 	CBBBBBEBBBB'',, *%00Puue6K6KC6P6PPr   c                 L    |                      ||          | j        |j        <   d S r   )r(   r   name)r   r   r2   s      r   handle_fieldzSerializer.handle_field3   s&    $($:$:3$F$Fej!!!r   c                     | j         rIt          |j        j        d          r/t	          ||j                  }|r|                                }nd }n|                     ||          }|| j        |j        <   d S )Nr!   )	use_natural_foreign_keysr'   remote_fieldr    getattrr5   r!   r(   r   )r   r   r2   relatedr3   s        r   handle_fk_fieldzSerializer.handle_fk_field6   s    ( 		7W$m.
 .
 		7 c5:..G ++--**366E$)ej!!!r   c                 8    |j         j        j        j        r j        r!t          |j         j        d          rd d }n fdd }t          |di                               |j	         |||                    }fd|D              j
        |j	        <   d S d S )Nr!   c                 *    |                                  S r   )r!   )r3   s    r   	m2m_valuez.Serializer.handle_m2m_field.<locals>.m2m_valueI   s     ,,...r   c                     t          | |j                  }t          |dd           rdnd }|                    |          S )Nprefetch_cache_name  )r:   r5   iterator)r   r2   attr
chunk_sizes       r   queryset_iteratorz6Serializer.handle_m2m_field.<locals>.queryset_iteratorL   sF    "3
33D '.CT J JTPT   ==444r   c                 D                         | | j        j                  S r   )r(   r%   r"   )r3   r   s    r   r?   z.Serializer.handle_m2m_field.<locals>.m2m_valueU   s    11%HHHr   c                     t          | |j                                      d                               d          }|j        rdnd }|                    |          S )Nr"   rB   )rE   )r:   r5   select_relatedonly_prefetch_related_lookupsrC   )r   r2   	query_setrE   s       r   rF   z6Serializer.handle_m2m_field.<locals>.queryset_iteratorX   sY     'UZ 8 8 G G M M R RSW X XI)2)L!VRVJ$---DDDr   _prefetched_objects_cachec                 &    g | ]} |          S r   r   )r,   r;   r?   s     r   r.   z/Serializer.handle_m2m_field.<locals>.<listcomp>a   s#    (T(T(T7););(T(T(Tr   )r9   throughr%   auto_createdr8   r'   r    r:   getr5   r   )r   r   r2   rF   m2m_iterr?   s   `    @r   handle_m2m_fieldzSerializer.handle_m2m_fieldC   s   %+8 	U, E"(-2 2 E/ / /5 5 5 5I I I I IE E E
 s$?DDHH
!!#u-- H )U(T(T(T8(T(T(TDM%*%%%;	U 	Ur   c                     | j         S r   )r   r   s    r   getvaluezSerializer.getvaluec   s
    |r   N)__name__
__module____qualname____doc__internal_use_onlyr   r   r   r   r   r(   r6   r<   rS   rU   r   r   r   r
   r
      s                    Q Q QG G G* * *U U U@    r   r
   c                   ^     e Zd ZdZedd fd
Zd Zd Zd Zd Z	d	 Z
ed
             Z x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                     t                      j        |fi | |                    dd          | _        || _        || _        i | _        d | _        d S )Nhandle_forward_referencesF)super__init__popr`   r]   r^   field_names_cache	_iterator)r   object_listr]   r^   options	__class__s        r   rb   zDeserializer.__init__o   s^     	00000)05PRW)X)X&
!2!#r   c              #   T   K   | j         D ]}|                     |          E d {V  d S r   )stream_handle_objectr   s     r   __iter__zDeserializer.__iter__y   sJ      ; 	0 	0C**3//////////	0 	0r   c                 `    | j         t          |           | _         t          | j                   S r   )re   iternextr   s    r   __next__zDeserializer.__next__}   s'    >!!$ZZDNDN###r   c           	   #     K   i }i }i }	 |                      |d                   }n# t          j        $ r | j        rY d S  w xY wd|v r	 |j        j                            |                    d                    ||j        j        j        <   nM# t          $ r@}t          j        
                    ||d         |                    d          d           d }~ww xY w|| j        vr+d |j                                        D             | j        |<   | j        |         }|d                                         D ]\  }}	| j        r||vr|j                            |          }
|
j        rt!          |
j        t"          j                  r	 |                     |
|	          }|t          j        k    r|	||
<   n
|||
j        <   # t          j        $ rJ}t          j        
                    |j        |d         |                    d          |j                  d }~ww xY w|
j        rt!          |
j        t"          j                  r	 |                     |
|	          }|t          j        k    r|	||
<   n
|||
j        <   E# t          $ r@}t          j        
                    ||d         |                    d          |	          d }~ww xY w	 |
                    |	          ||
j        <   # t          $ r@}t          j        
                    ||d         |                    d          |	          d }~ww xY wt          j        ||| j                  }t          j        |||          V  d S )Nr    r"   c                     h | ]	}|j         
S r   )r5   )r,   r-   s     r   	<setcomp>z.Deserializer._handle_object.<locals>.<setcomp>   s    ,V,V,VQV,V,V,Vr   r#   )_get_model_from_noder   DeserializationErrorr^   r%   r"   	to_pythonrQ   attname	ExceptionWithDatard   
get_fieldsitems	get_fieldr9   r/   r   ManyToManyRel_handle_m2m_field_nodeDEFER_FIELDr5   M2MDeserializationErrororiginal_excManyToOneRel_handle_fk_field_nodebuild_instancer]   DeserializedObject)r   r   r)   m2m_datadeferred_fieldsModelefield_names
field_namefield_valuer2   valuesr3   model_instances                 r   rk   zDeserializer._handle_object   s     	--c'l;;EE( 	 	 	% 	 3;;/4{~/G/GPT/V/VU[^+,,   /88s7|SWWT]]D  
 ...,V,VU[=S=S=U=U,V,V,VD"5),U3 (+8}':':'<'< ,	 ,	#J% *K*G*GK))*55E ! $j"F$8' ' $	!88LLF!1111<../5,3   3<<GcggdmmQT   # 
"F$7) ) 	 66ukJJE 0001<...3U]+    3<<3w<  ',{'C'CD$$    3<<3w<  
 ,UD$*EE%nhPPPPPPPsp   & AA	AB 
C;CC	6G  HAHH6I;;
K;K  K	K((
L22;L--L2c                 D    t          j        ||| j        | j                  S r   )r   deserialize_m2m_valuesr]   r`   r   r2   r   s      r   r~   z#Deserializer._handle_m2m_field_node   s%    *;
D,J
 
 	
r   c                 D    t          j        ||| j        | j                  S r   )r   deserialize_fk_valuer]   r`   r   s      r   r   z"Deserializer._handle_fk_field_node   s%    (;
D,J
 
 	
r   c                     	 t          j        |           S # t          t          f$ r t	          j        d|            w xY w)z6Look up a model from an "app_label.model_name" string.zInvalid model identifier: )r   	get_modelLookupError	TypeErrorr   ru   )model_identifiers    r   rt   z!Deserializer._get_model_from_node   sY    	>"2333Y' 	 	 	+?-=??  	s    )?)rV   rW   rX   rY   r   rb   rl   rp   rk   r~   r   staticmethodrt   __classcell__)rh   s   @r   r\   r\   g   s          %5      0 0 0$ $ $
HQ HQ HQT
 
 


 
 

   \    r   r\   N)rY   django.appsr   django.core.serializersr   	django.dbr   r   django.db.modelsr   django.utils.encodingr   r
   r\   r   r   r   <module>r      s           ( ( ( ( ( ( . . . . . . . . 0 0 0 0 0 0 3 3 3 3 3 3V V V V V V V Vrw w w w w4$ w w w w wr   