o
    <gW1                     @   s   d Z ddlmZ ddlmZ ddlmZ e ZG dd de	Z
G dd deZG d	d
 d
eZG dd deZG dd dZG dd dZG dd dZG dd dZdd Zdd Zd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__ r   r   O/var/www/html/venv/lib/python3.10/site-packages/django/core/serializers/base.pyr          r   c                   @   r   )SerializationErrorz,Something bad happened during serialization.Nr   r   r   r   r   r      r   r   c                   @   s   e Zd ZdZedd ZdS )DeserializationErrorz.Something bad happened during deserialization.c                 C   s   | d||||f S )zs
        Factory method for creating a deserialization error which has a more
        explanatory message.
        z#%s: (%s:pk=%s) field_value was '%s'r   )clsoriginal_excmodelfkfield_valuer   r   r   WithData   s
   
zDeserializationError.WithDataN)r   r	   r
   r   classmethodr   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdd ZdS )M2MDeserializationErrorzCSomething bad happened during deserialization of a ManyToManyField.c                 C   s   || _ || _d S N)r   pk)selfr   r   r   r   r   __init__+   s   
z M2MDeserializationError.__init__N)r   r	   r
   r   r   r   r   r   r   r   (   s    r   c                   @   s    e Zd ZdZdd Zdd ZdS )ProgressBarK   c                 C   s   || _ || _d| _d S )Nr   )outputtotal_count	prev_done)r   r   r    r   r   r   r   3      
zProgressBar.__init__c                 C   s   | j sd S |d | j }|| j d }| j|krd S || _| jdkr$dnd}| j |d d|  d| j|   d  || jkrF| j d	 | j   d S )
Nd       [. ]
)r   r    progress_widthr!   writeflush)r   countpercdonecrr   r   r   update8   s   
 
zProgressBar.updateN)r   r	   r
   r,   r   r3   r   r   r   r   r   0   s    r   c                   @   st   e Zd ZdZdZeZeZddddddd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 )
Serializerz)
    Abstract serializer base class.
    FNr   )streamfieldsuse_natural_foreign_keysuse_natural_primary_keysprogress_outputobject_countc                K   st  || _ |dur	|n|  | _|| _|| _|| _| ||}	|   d| _t	|ddD ]\}
}| 
| |jj}| jrJ|jj}|jrG|jjrG|nd}nd}|jjD ]5}|jsY||u r|jdu rp| jdu si|j| jv ro| || qP| jdu s|jdd | jv r| || qP|jjD ]}|jr| jdu s|j| jv r| || q| | |	|
 | jod| _q*|   |  S )z'
        Serialize a queryset.
        NTr$   )startF)optionsstream_classr5   selected_fieldsr7   r8   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_objectr3   end_serializationgetvalue)r   querysetr5   r6   r7   r8   r9   r:   r=   progress_barr/   objrF   r   	pk_parentfieldr   r   r   rJ   T   sL   






zSerializer.serializec                 C      t d)zA
        Called when serializing of the queryset starts.
        zDsubclasses of Serializer must provide a start_serialization() methodNotImplementedErrorr   r   r   r   rA         zSerializer.start_serializationc                 C      dS )z?
        Called when serializing of the queryset ends.
        Nr   r[   r   r   r   rQ         zSerializer.end_serializationc                 C   rX   )z>
        Called when serializing of an object starts.
        z=subclasses of Serializer must provide a start_object() methodrY   r   rU   r   r   r   rD      r\   zSerializer.start_objectc                 C   r]   )z<
        Called when serializing of an object ends.
        Nr   r_   r   r   r   rP      r^   zSerializer.end_objectc                 C   rX   )zW
        Called to handle each individual (non-relational) field on an object.
        z=subclasses of Serializer must provide a handle_field() methodrY   r   rU   rW   r   r   r   rL      r\   zSerializer.handle_fieldc                 C   rX   )z6
        Called to handle a ForeignKey field.
        z@subclasses of Serializer must provide a handle_fk_field() methodrY   r`   r   r   r   rM      r\   zSerializer.handle_fk_fieldc                 C   rX   )z5
        Called to handle a ManyToManyField.
        zAsubclasses of Serializer must provide a handle_m2m_field() methodrY   r`   r   r   r   rO      r\   zSerializer.handle_m2m_fieldc                 C   s    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).
        rR   N)callablegetattrr5   rR   r[   r   r   r   rR      s   
zSerializer.getvalue)r   r	   r
   r   internal_use_onlyr   r@   r   r>   rJ   rA   rQ   rD   rP   rL   rM   rO   rR   r   r   r   r   r4   I   s(    Cr4   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Deserializerz+
    Abstract base deserializer class.
    c                 K   s(   || _ t|trt|| _dS || _dS )zA
        Init this serializer given a stream or a string
        N)r=   
isinstancestrr   r5   )r   stream_or_stringr=   r   r   r   r      s   

zDeserializer.__init__c                 C   s   | S r   r   r[   r   r   r   __iter__   s   zDeserializer.__iter__c                 C   rX   )z9Iteration interface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodrY   r[   r   r   r   __next__   s   zDeserializer.__next__N)r   r	   r
   r   r   rh   ri   r   r   r   r   rd      s
    
rd   c                   @   s6   e Zd ZdZdddZdd Zddd	Zd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                 C   s   || _ || _|| _d S r   )objectm2m_datadeferred_fields)r   rU   rl   rm   r   r   r   r      r"   zDeserializedObject.__init__c                 C   s   d| j j| jjj| jjf S )Nz<%s: %s(pk=%s)>)	__class__r   rk   rE   labelr   r[   r   r   r   __repr__   s
   zDeserializedObject.__repr__Tc                 K   sV   t jj| jf|dd| | jr&|r&| j D ]\}}t| j|| qd | _d S )NT)usingraw)r   Model	save_baserk   rl   itemsrb   set)r   save_m2mrq   kwargsaccessor_nameobject_listr   r   r   save  s
   

zDeserializedObject.savec           	      C   s   i | _ | j D ]q\}}| jj}|jd |j }t|jt	j
rIz
t|||dd}W n tyA } zt|j|| jj|jd }~ww || j |j< qt|jt	jryz
t|||dd}W n typ } z
t||| jj|d }~ww t| j|j| q|   d S )Nr(   F)handle_forward_references)rl   rm   ru   rk   rE   	app_label
model_namere   rG   r   ManyToManyReldeserialize_m2m_valuesr   r   r   r   r   nameManyToOneReldeserialize_fk_value	ExceptionsetattrrK   r{   )	r   rq   rW   r   optsro   valuesevaluer   r   r   save_deferred_fields  s<   

z'DeserializedObject.save_deferred_fields)NN)TNr   )r   r	   r
   r   r   rp   r{   r   r   r   r   r   rj      s    

rj   c                 C   s   | j j}|| j jj}|du rIt|drIt| drI| di |}||j_| }z| j j	|
|j| j|| j jj< W n
 | jyH   Y n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   )rE   default_managergetr   rK   hasattr_statedbr   	to_python
db_managerr   DoesNotExist)rs   datar   r   r   rU   r   r   r   r   build_instance.  s$   r   c           	   
      s   | j j t jdr fdd}n fdd}zt|}W n ty/ } zt||d }~ww zg }|D ]	}||| q5|W S  tya } zt	|t
rX|rXtW  Y d }~S t||d }~ww )Nr   c                    s6   t | drt| ts jj|  jS  jj| S )Nrh   )	r   re   rf   _default_managerr   r   r   rE   r   )r   r   rq   r   r   m2m_convertL  s   
z+deserialize_m2m_values.<locals>.m2m_convertc                    s    j j| S r   )rE   r   r   )v)r   r   r   r   X  s   )rG   r   r   r   iter	TypeErrorr   appendr   re   r   DEFER_FIELD)	rW   r   rq   r|   r   pks_iterr   r   r   r   r   r   r   H  s*   

r   c           	      C   s   |d u rd S | j j}|j}| j j}t|drHt|drHt|tsHz
||j| }W n t	y8   |r7t
 Y S  w t||}|jjj rF|j}|S |j||S )Nr   rh   )rG   r   r   
field_namer   re   rf   r   r   r   r   rb   rE   r   	get_fieldr   )	rW   r   rq   r|   r   r   r   rU   r   r   r   r   r   k  s.   

r   N)r   ior   django.core.exceptionsr   	django.dbr   rk   r   KeyErrorr   r   r   r   r   r   r4   rd   rj   r   r   r   r   r   r   r   <module>   s"     A#