
    EvgW1                     ,   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dS )z;
Module for abstract serializer/unserializer base classes.
    )StringIO)ObjectDoesNotExist)modelsc                       e Zd ZdZdS )SerializerDoesNotExistz'The requested serializer was not found.N__name__
__module____qualname____doc__     Y/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/core/serializers/base.pyr   r      s        11Dr   r   c                       e Zd ZdZdS )SerializationErrorz,Something bad happened during serialization.Nr   r   r   r   r   r      s        66Dr   r   c                   (    e Zd ZdZed             ZdS )DeserializationErrorz.Something bad happened during deserialization.c           
      0     | |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   s6     s||UUUBBB5
 
 	
r   N)r	   r
   r   r   classmethodr   r   r   r   r   r      s3        88
 
 [
 
 
r   r   c                       e Zd ZdZd ZdS )M2MDeserializationErrorzCSomething bad happened during deserialization of a ManyToManyField.c                 "    || _         || _        d S 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M    r   r   c                       e Zd ZdZd Zd ZdS )ProgressBarK   c                 0    || _         || _        d| _        d S )Nr   )outputtotal_count	prev_done)r"   r(   r)   s      r   r#   zProgressBar.__init__3   s    &r   c                 v   | j         sd S |dz  | j        z  }|| j        z  dz  }| j        |k    rd S || _        | j        dk    rdnd}| j                             |dz   d|z  z   d| j        |z
  z  z   dz              || j        k    r| j                             d	           | j                                          d S )
Nd       [. ]
)r(   r)   progress_widthr*   writeflush)r"   countpercdonecrs        r   updatezProgressBar.update8   s    { 	Fs{d..d))S0>T!!F#q((RRdHsTz!C4+>+E$FFL	
 	
 	
 4&&&Kd###r   N)r	   r
   r   r5   r#   r<   r   r   r   r%   r%   0   s7        N  
    r   r%   c                   d    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dS )
Serializerz)
    Abstract serializer base class.
    FNr   )streamfieldsuse_natural_foreign_keysuse_natural_primary_keysprogress_outputobject_countc                   || _         ||n|                                 | _        || _        || _        || _        |                     ||          }	|                                  d| _        t          |d          D ]M\  }
}| 
                    |           |j        j        }| j        r$|j        j        }|j        r|j        j        r|nd}nd}|j        j        D ]s}|j        s||u rf|j        ,| j        |j        | j        v r|                     ||           @| j        |j        dd         | j        v r|                     ||           t|j        j        D ]4}|j        r+| j        |j        | j        v r|                     ||           5|                     |           |	                    |
           | j        od| _        O|                                  |                                 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-     & 2ff8I8I8K8K%(@%(@%**?LII  """
#HA666 &	. &	.JE3c""" !Y5N , !#),/Sbo.ISBBt 	 !	'-: = =? =ey&8&8)1 08$}0DDD --c5999 !08$}SbS1T5III 00e<<<'-@ : :? :,4 =D,@@@--c5999OOC   &&&-DJJ   }}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                     dS )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                     dS )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                 ~    t          t          | j        dd                    r| j                                        S dS )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   s@    
 GDK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 A A A AF
 
 
  
 
 
  
 
 

 
 

 
 
* * * * *r   r>   c                   $    e Zd ZdZd Zd Zd ZdS )Deserializerz+
    Abstract base deserializer class.
    c                 x    || _         t          |t                    rt          |          | _        dS || _        dS )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44DKKK*DKKKr   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      sK         + + +  
 
 
 
 
r   rv   c                   0    e Zd ZdZddZd Zd	dZd
dZdS )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                 0    || _         || _        || _        d S 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__   s8     N###K###KNNN
 	
r   Tc                     t          j        j        | j        f|dd| | j        rI|rG| j                                        D ]-\  }}t          | j        |                              |           .d | _        d S )NT)usingraw)r   Model	save_baser   r   itemsrs   set)r"   save_m2mr   kwargsaccessor_nameobject_lists         r   savezDeserializedObject.save  s     	t{L%TLLVLLL= 	EX 	E.2m.A.A.C.C E E*{]3377DDDD r   c                    i | _         | j                                        D ]3\  }}| j        j        }|j        dz   |j        z   }t          |j        t          j
                  rh	 t          |||d          }nC# t          $ r6}t                              |j        || j        j        |j                  d }~ww xY w|| j         |j        <   t          |j        t          j                  ri	 t'          |||d          }n9# t(          $ r,}t                              ||| j        j        |          d }~ww xY wt+          | j        |j        |           5|                                  d S )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  s   "&"6"<"<">"> 	; 	;E;;$DNS(4?:E%,f.BCC ;3{EU  FF /   .77t{~qt   -3ej))E.0CDD 	;0{EU  EE !   .775$+.+   U]E:::		s0   %A99
B91B44B9,D  
D6
'D11D6)NN)TNr    )r	   r
   r   r   r#   r   r   r   r   r   r   r   r      si        	 	/ / / /

 
 
        r   r   c                    | j         j        }|                    | j         j        j                  }|t          |d          rt          | d          r | di |}||j        _        |                                }	 | j         j        	                     |
                    |          j        | j                  || j         j        j        <   n# | j        $ r Y nw xY w | di |S )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.
    N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     k1O	%+.(	)	)B

O%9:: 	E=)) 	 emmdmm
oo''	+0;>+C+CA**2..A;OR, ,D'(( ! 	 	 	D	5==4==s   <AC 
CCc                   	 | j         j        	t          	j        d          r	fd}n	fd}	 t	          |          }n"# t
          $ r}t          ||          d }~ww xY w	 g }|D ] }|                     ||                     !|S # t          $ r8}t          |t                    r|rt          cY d }~S t          ||          d }~ww xY w)Nr   c                     t          | d          r<t          | t                    s' j                                      j        |  j        S 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  sj    uj)) 7*UC2H2H 7(E*55e<<'0 {~//666r   c                 B    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 	7 	7 	7 	7 	7 	7	/ 	/ 	/ 	/ 	/6$$ 6 6 6%a5556	1 	+ 	+BMM++b//**** 1 1 1a+,, 	11J 	1)!R000	1s;   A 
A AA $&B 
CC2C8CCc                    |d S | j         j        }|j        }| j         j        }t	          |d          rt	          |d          rxt          |t                    sc	  |                    |          j        | }n# t          $ r |r	t          cY S  w xY wt          ||          }|j        j        j         r|j        }|S |j                            |                              |          S )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   t$E,O#.J!566K,, ;,,
	F/,,U33FTCC! 	 	 	( """"		
 Z(( ;>& 	HE;  ,,66{CCCs   A8 8BB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 5 5 5 5 5      fhh	 	 	 	 	X 	 	 		 	 	 	 	 	 	 	
 
 
 
 
9 
 
 
    i          2H* H* H* H* H* H* H* H*V
 
 
 
 
 
 
 
2> > > > > > > >B  4 1  1  1FD D D D Dr   