
    Vh                         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y)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                   P    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y)
Serializerz7
    Serialize a QuerySet to basic Python objects.
    Tc                      d | _         g | _        y N)_currentobjectsselfs    N/home/dcms/DCMS/lib/python3.12/site-packages/django/core/serializers/python.pystart_serializationzSerializer.start_serialization   s        c                      y r    r   s    r   end_serializationzSerializer.end_serialization   s    r   c                     i | _         y r   )r   r   objs     r   start_objectzSerializer.start_object   s	    r   c                 f    | j                   j                  | j                  |             d | _        y r   )r   appendget_dump_objectr   r   s     r   
end_objectzSerializer.end_object   s&    D0056r   c                     dt        |j                        i}| j                  rt        |d      s)| j	                  ||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#   sV    SYY(,,GC4O//SYY\\BDJXr   c                     t        |t              r |D cg c]  }| j                  ||       c}S |j                  |      }t	        |      r|S |j                  |      S c c}w r   )
isinstancer   r(   value_from_objectr   value_to_string)r   r   fieldfvalues        r   r(   zSerializer._value_from_field*   s`    e01<ABqD**32BB'', *%0uPe6K6KC6PP Cs   A c                 V    | j                  ||      | j                  |j                  <   y r   )r(   r   name)r   r   r.   s      r   handle_fieldzSerializer.handle_field3   s!    $($:$:3$Fejj!r   c                 
   | j                   rLt        |j                  j                  d      r,t	        ||j
                        }|r|j                         }nd }n| j                  ||      }|| j                  |j
                  <   y )Nr!   )	use_natural_foreign_keysr'   remote_fieldr    getattrr2   r!   r(   r   )r   r   r.   relatedr0   s        r   handle_fk_fieldzSerializer.handle_fk_field6   so    ((W$$m.
 c5::.G++-**36E$)ejj!r   c                     |j                   j                  j                  j                  r j                  r't        |j                   j                  d      rd }d }n fd}d }t        |di       j                  |j                   |||            }|D cg c]
  } ||       c} j                  |j                  <   y y c c}w )Nr!   c                 "    | j                         S r   )r!   )r0   s    r   	m2m_valuez.Serializer.handle_m2m_field.<locals>.m2m_valueI   s     ,,..r   c                 r    t        | |j                        }t        |dd       rdnd }|j                  |      S )Nprefetch_cache_name  )r7   r2   iterator)r   r.   attr
chunk_sizes       r   queryset_iteratorz6Serializer.handle_m2m_field.<locals>.queryset_iteratorL   s:    "3

3D '.CT JPT   ==44r   c                 P    j                  | | j                  j                        S r   )r(   r%   r"   )r0   r   s    r   r<   z.Serializer.handle_m2m_field.<locals>.m2m_valueU   s    11%HHr   c                     t        | |j                        j                  d       j                  d      }|j                  rdnd }|j                  |      S )Nr"   r?   )rB   )r7   r2   select_relatedonly_prefetch_related_lookupsr@   )r   r.   	query_setrB   s       r   rC   z6Serializer.handle_m2m_field.<locals>.queryset_iteratorX   sM     'UZZ 8 G G M R RSW XI)2)L)LRVJ$---DDr   _prefetched_objects_cache)r6   throughr%   auto_createdr5   r'   r    r7   getr2   r   )r   r   r.   r<   rC   m2m_iterr8   s   `      r   handle_m2m_fieldzSerializer.handle_m2m_fieldC   s    %%++88,,""((-2/5IE
 s$?DHH

!#u-H LT(T7);(TDMM%**%; 9: )Us   C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(   r3   r9   rO   rQ   r   r   r   r
   r
      sE     QG*U@r   r
   c                   X     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        |   |fi | |j                  dd      | _        || _        || _        i | _        d | _        y )Nhandle_forward_referencesF)super__init__popr\   rY   rZ   field_names_cache	_iterator)r   object_listrY   rZ   options	__class__s        r   r^   zDeserializer.__init__o   sJ     	00)05PRW)X&
!2!#r   c              #   d   K   | j                   D ]  }| j                  |      E d {     y 7 wr   )stream_handle_objectr   s     r   __iter__zDeserializer.__iter__y   s0     ;; 	0C**3///	0/s   $0.0c                 d    | j                   t        |       | _         t        | j                         S r   )ra   iternextr   s    r   __next__zDeserializer.__next__}   s&    >>!!$ZDNDNN##r   c           	   #   ^  K   i }i }i }	 | j                  |d         }d|v rV	 |j                  j
                  j                  |j                  d            ||j                  j
                  j                  <   || j                  vr?|j                  j                         D ch c]  }|j                   c}| j                  |<   | j                  |   }|d   j                         D ]*  \  }	}
| j                  r|	|vr|j                  j                  |	      }|j                   r`t#        |j                   t$        j&                        r<	 | j)                  ||
      }|t        j*                  k(  r|
||<   n|||j                  <   |j                   rat#        |j                   t$        j0                        r=	 | j3                  ||
      }|t        j*                  k(  r|
||<   n|||j                  <   	 |j                  |
      ||j                  <   - t        j4                  ||| j6                        }t        j8                  |||       y # t        j                  $ r | j                  rY y  w xY w# t        $ r9}t        j                  j                  ||d   |j                  d      d       d }~ww xY wc c}w # t        j,                  $ rM}t        j                  j                  |j.                  |d   |j                  d      |j
                        d }~ww xY w# t        $ r9}t        j                  j                  ||d   |j                  d      |
      d }~ww xY w# t        $ r9}t        j                  j                  ||d   |j                  d      |
      d }~ww xY ww)Nr    r"   r#   )_get_model_from_noder   DeserializationErrorrZ   r%   r"   	to_pythonrM   attname	ExceptionWithDatar`   
get_fieldsr2   items	get_fieldr6   r+   r   ManyToManyRel_handle_m2m_field_nodeDEFER_FIELDM2MDeserializationErrororiginal_excManyToOneRel_handle_fk_field_nodebuild_instancerY   DeserializedObject)r   r   r)   m2m_datadeferred_fieldsModeler/   field_names
field_namefield_valuer.   valuesr0   model_instances                  r   rg   zDeserializer._handle_object   sK    	--c'l;E
 3;/4{{~~/G/GPT/VU[[^^++, ...=B[[=S=S=U,VQVV,VD""5),,U3 (+8}':':'< ,	#J%%*K*GKK))*5E !!j""F$8$8'	!88LF!1!111<./5, ##
""F$7$7)	 66ukJE 0 001<..3U]]+',{'CD$Q,	\ ,,UD$**E%%nhPPA (( 	%%	  //88s7|SWWT]D  -W* 33 33<<GcggdmQTT  ! 33<<3w<  ! 33<<3w< s   N-I N-AI6 8*N-"J;5BN-:K 1N-7:L#1N-4M(>N-I3/N-1I33N-6	J8?4J33J88N- L ALL  N-#	M%,4M  M%%N-(	N*14N%%N**N-c                 Z    t        j                  ||| j                  | j                        S r   )r   deserialize_m2m_valuesrY   r\   r   r.   r   s      r   rx   z#Deserializer._handle_m2m_field_node   s(    **;

D,J,J
 	
r   c                 Z    t        j                  ||| j                  | j                        S r   )r   deserialize_fk_valuerY   r\   r   s      r   r}   z"Deserializer._handle_fk_field_node   s(    ((;

D,J,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   ro   )model_identifiers    r   rn   z!Deserializer._get_model_from_node   sJ    	>>"233Y' 	++,-=,>? 	s    (?)rR   rS   rT   rU   r   r^   rh   rl   rg   rx   r}   staticmethodrn   __classcell__)rd   s   @r   rX   rX   g   sD     %50$
HQT



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