
    gW1                         d Z ddlmZ ddlmZ ddlmZ  e       Z G d de	      Z
 G d de      Z G d	 d
e      Z G d de      Z G d d      Z G d d      Z G d d      Z G d d      Zd Zd Zd Zy)z;
Module for abstract serializer/unserializer base classes.
    )StringIO)ObjectDoesNotExist)modelsc                       e Zd ZdZy)SerializerDoesNotExistz'The requested serializer was not found.N__name__
__module____qualname____doc__     t/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/core/serializers/base.pyr   r      s    1r   r   c                       e Zd ZdZy)SerializationErrorz,Something bad happened during serialization.Nr   r   r   r   r   r      s    6r   r   c                        e Zd ZdZed        Zy)DeserializationErrorz.Something bad happened during deserialization.c           
      *     | |d|d|d|d      S )zs
        Factory method for creating a deserialization error which has a more
        explanatory message.
        z: (z:pk=z) field_value was ''r   )clsoriginal_excmodelfkfield_values        r   WithDatazDeserializationError.WithData   s     UB5
 	
r   N)r	   r
   r   r   classmethodr   r   r   r   r   r      s    8
 
r   r   c                       e Zd ZdZd Zy)M2MDeserializationErrorzCSomething bad happened during deserialization of a ManyToManyField.c                      || _         || _        y N)r   pk)selfr   r!   s      r   __init__z M2MDeserializationError.__init__+   s    (r   N)r	   r
   r   r   r#   r   r   r   r   r   (   s
    Mr   r   c                       e Zd ZdZd Zd Zy)ProgressBarK   c                 .    || _         || _        d| _        y )Nr   )outputtotal_count	prev_done)r"   r(   r)   s      r   r#   zProgressBar.__init__3   s    &r   c                    | j                   sy |dz  | j                  z  }|| j                  z  dz  }| j                  |k\  ry || _        | j                  dk(  rdnd}| j                   j	                  |dz   d|z  z   d| j                  |z
  z  z   dz          || j                  k(  r| j                   j	                  d	       | j                   j                          y )
Nd       [. ]
)r(   r)   progress_widthr*   writeflush)r"   countpercdonecrs        r   updatezProgressBar.update8   s    {{s{d...d)))S0>>T!##q(RdHsTz!C4+>+>+E$FFL	
 4&&&KKd#r   N)r	   r
   r   r5   r#   r<   r   r   r   r%   r%   0   s    N
r   r%   c                   b    e Zd ZdZdZeZeZddddddddZ	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zy)
Serializerz)
    Abstract serializer base class.
    FNr   )streamfieldsuse_natural_foreign_keysuse_natural_primary_keysprogress_outputobject_countc                   || _         ||n| j                         | _        || _        || _        || _        | j                  ||      }	| j                          d| _        t        |d      D ]  \  }
}| j                  |       |j                  j                  }| j
                  r=|j                  j                  }|j                  r|j                  j                  r|nd}nd}|j                  j                   D ]  }|j"                  s||u s|j                  8| j                  |j$                  | j                  v sE| j'                  ||       X| j                  |j$                  dd | j                  v s| j)                  ||        |j                  j*                  D ]F  }|j"                  s| j                  |j$                  | j                  v s5| j-                  ||       H | j/                  |       |	j1                  |
       | j                  xr d| _         | j3                          | j5                         S )z'
        Serialize a queryset.
        NTr-   )startF)optionsstream_classr?   selected_fieldsrA   rB   progress_classstart_serializationfirst	enumeratestart_object_metaconcrete_modelr!   remote_fieldparent_linklocal_fields	serializeattnamehandle_fieldhandle_fk_fieldlocal_many_to_manyhandle_m2m_field
end_objectr<   end_serializationgetvalue)r"   querysetr?   r@   rA   rB   rC   rD   rH   progress_barr8   objrQ   r!   	pk_parentfields                   r   rU   zSerializer.serializeT   s      & 2f8I8I8K%(@%(@%**?LI  "
#HA66JE3c" !YY55N ,,#)),,//boo.I.IBt  !	'--::??ey&8))1 008$}}0D0DD --c59 !008$}}Sb1T5I5II 00e< ; (--@@??,,4 ==D,@,@@--c59 A OOC &-DJM 7N 	 }}r   c                     t        d      )zA
        Called when serializing of the queryset starts.
        zDsubclasses of Serializer must provide a start_serialization() methodNotImplementedErrorr"   s    r   rL   zSerializer.start_serialization   s     "R
 	
r   c                      y)z?
        Called when serializing of the queryset ends.
        Nr   rf   s    r   r\   zSerializer.end_serialization        	r   c                     t        d      )z>
        Called when serializing of an object starts.
        z=subclasses of Serializer must provide a start_object() methodrd   r"   r`   s     r   rO   zSerializer.start_object        "K
 	
r   c                      y)z<
        Called when serializing of an object ends.
        Nr   rj   s     r   r[   zSerializer.end_object   rh   r   c                     t        d      )zW
        Called to handle each individual (non-relational) field on an object.
        z=subclasses of Serializer must provide a handle_field() methodrd   r"   r`   rb   s      r   rW   zSerializer.handle_field   rk   r   c                     t        d      )z6
        Called to handle a ForeignKey field.
        z@subclasses of Serializer must provide a handle_fk_field() methodrd   rn   s      r   rX   zSerializer.handle_fk_field   s     "N
 	
r   c                     t        d      )z5
        Called to handle a ManyToManyField.
        zAsubclasses of Serializer must provide a handle_m2m_field() methodrd   rn   s      r   rZ   zSerializer.handle_m2m_field   s     "O
 	
r   c                 x    t        t        | j                  dd            r| j                  j                         S y)zn
        Return the fully serialized queryset (or None if the output stream is
        not seekable).
        r]   N)callablegetattrr?   r]   rf   s    r   r]   zSerializer.getvalue   s1    
 GDKKT:;;;'')) <r   )r	   r
   r   r   internal_use_onlyr%   rK   r   rI   rU   rL   r\   rO   r[   rW   rX   rZ   r]   r   r   r   r>   r>   I   s\      NL !&!&AF




*r   r>   c                   "    e Zd ZdZd Zd Zd Zy)Deserializerz+
    Abstract base deserializer class.
    c                 b    || _         t        |t              rt        |      | _        y|| _        y)zA
        Init this serializer given a stream or a string
        N)rH   
isinstancestrr   r?   )r"   stream_or_stringrH   s      r   r#   zDeserializer.__init__   s*     &,"#34DK*DKr   c                     | S r    r   rf   s    r   __iter__zDeserializer.__iter__   s    r   c                     t        d      )z9Iteration interface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodrd   rf   s    r   __next__zDeserializer.__next__   s    !I
 	
r   N)r	   r
   r   r   r#   r|   r~   r   r   r   rv   rv      s    +
r   rv   c                   .    e Zd ZdZddZd ZddZd	dZy)
DeserializedObjectae  
    A deserialized model.

    Basically a container for holding the pre-saved deserialized data along
    with the many-to-many data saved with the object.

    Call ``save()`` to save the object (with the many-to-many data) to the
    database; call ``save(save_m2m=False)`` to save just the object fields
    (and not touch the many-to-many stuff.)
    Nc                 .    || _         || _        || _        y r    )objectm2m_datadeferred_fields)r"   r`   r   r   s       r   r#   zDeserializedObject.__init__   s     .r   c                     d| j                   j                  d| j                  j                  j                  d| j                  j
                  dS )N<z: z(pk=z)>)	__class__r	   r   rP   labelr!   rf   s    r   __repr__zDeserializedObject.__repr__   s7    NN##KK##KKNN
 	
r   c                    t        j                  j                  | j                  f|dd| | j                  rI|rG| j                  j                         D ]*  \  }}t        | j                  |      j                  |       , d | _        y )NT)usingraw)r   Model	save_baser   r   itemsrs   set)r"   save_m2mr   kwargsaccessor_nameobject_lists         r   savezDeserializedObject.save  sn     	t{{L%TLVL==X.2mm.A.A.C*{]377D /D
 r   c                 >   i | _         | j                  j                         D ]  \  }}| j                  j                  }|j
                  dz   |j                  z   }t        |j                  t        j                        r*	 t        |||d      }|| j                   |j"                  <   t        |j                  t        j$                        s	 t'        |||d      }t+        | j                  |j,                  |        | j/                          y # t        $ rE}t        j                  |j                  || j                  j                   |j                         d }~ww xY w# t(        $ r1}t        j                  ||| j                  j                   |      d }~ww xY w)Nr1   F)handle_forward_references)r   r   r   r   rP   	app_label
model_namerx   rR   r   ManyToManyReldeserialize_m2m_valuesr   r   r   r   r!   nameManyToOneReldeserialize_fk_value	ExceptionsetattrrV   r   )	r"   r   rb   r   optsr   valuesevalues	            r   save_deferred_fieldsz'DeserializedObject.save_deferred_fields  sQ   "&"6"6"<"<">E;;;$$DNNS(4??:E%,,f.B.BC3{EUF -3ejj)E..0C0CD0{EUE U]]E:- #?. 			 / .77t{{~~qtt  ! .775$++..+ s1   ?DE"	EA EE"	F+,FF)NN)TNr    )r	   r
   r   r   r#   r   r   r   r   r   r   r   r      s    	/

r   r   c                 &   | j                   j                  }|j                  | j                   j                  j                        }|t        |d      rt        | d      r | di |}||j                  _        |j                         }	 | j                   j                  j                   |j                  |      j                  | j                        || j                   j                  j                  <    | di |S # | j                  $ r Y w xY w)z
    Build a model instance.

    If the model instance doesn't have a primary key and the model supports
    natural keys, try to retrieve it from the database.
    get_by_natural_keynatural_keyr   )rP   default_managergetr!   rV   hasattr_statedbr   	to_python
db_managerr   DoesNotExist)r   datar   r   r!   r`   r   s          r   build_instancer   .  s     kk11O	%++..((	)B

O%9:E=)mdm

oo'	+0;;>>+C+CA**2.AA;ORR,D''(
 =4= !! 		s   
A,C> >DDc                   	 | j                   j                  	t        	j                  d      r	fd}n	fd}	 t	        |      }	 g }|D ]  }|j                   ||              |S # t
        $ r}t        ||      d }~ww xY w# t        $ r.}t        |t              r|rt        cY d }~S t        |      d }~ww xY w)Nr   c                     t        | d      rBt        | t              s2 j                  j	                        j
                  |  j                  S j                  j                  j                  |       S )Nr|   )	r   rx   ry   _default_managerr   r   r!   rP   r   )r   r   r   s    r   m2m_convertz+deserialize_m2m_values.<locals>.m2m_convertL  s`    uj)*UC2H(E**55e<''0R {{~~//66r   c                 N    j                   j                  j                  |       S r    )rP   r!   r   )vr   s    r   r   z+deserialize_m2m_values.<locals>.m2m_convertX  s    ;;>>++A..r   )rR   r   r   r   iter	TypeErrorr   appendr   rx   r   DEFER_FIELD)
rb   r   r   r   r   pks_iterr   r   r!   r   s
     `      @r   r   r   H  s    $$Eu%%';<	7	/6$	1BMM+b/*   6%a556  1a+,1J)!R00	1s;   A* !B *	B3A??B	B>B9'B>-B99B>c                    |y | j                   j                  }|j                  }| j                   j                  }t	        |d      rut	        |d      rit        |t              sY	  |j                  |      j                  | }t        ||      }|j                  j                  j                   r|j                  }|S |j                  j                  |      j                  |      S # t        $ r |rt        cY S  w xY w)Nr   r|   )rR   r   r   
field_namer   rx   ry   r   r   r   r   rs   rP   r!   	get_fieldr   )	rb   r   r   r   r   r   r   r`   r   s	            r   r   r   k  s    $$E,,O##..J!56K,;,	F/,,U3FFTC Z( ;;>>&&HHE;;  ,66{CC " 	(""		s   %C' 'C<:C<N)r   ior   django.core.exceptionsr   	django.dbr   r   r   KeyErrorr   r   r   r   r   r%   r>   rv   r   r   r   r   r   r   r   <module>r      s     5 h	X 		 	
9 
i  2H* H*V
 
2> >B4 1FDr   