o
    ˷e3                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 e ZG dd d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.
    N)StringIO)ObjectDoesNotExist)models)RemovedInDjango50Warningc                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
PickleSerializerzd
    Simple wrapper around pickle to be used in signing.dumps()/loads() and
    cache backends.
    Nc                 C   s*   t dt |d u rtj| _d S || _d S )NzTPickleSerializer is deprecated due to its security risk. Use JSONSerializer instead.)warningswarnr   pickleHIGHEST_PROTOCOLprotocol)selfr    r   S/var/www/ideatree/venv/lib/python3.10/site-packages/django/core/serializers/base.py__init__   s
   zPickleSerializer.__init__c                 C   s   t || jS N)r	   dumpsr   r   objr   r   r   r         zPickleSerializer.dumpsc                 C   s
   t |S r   )r	   loads)r   datar   r   r   r       s   
zPickleSerializer.loadsr   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s
    
r   c                   @      e Zd ZdZdS )SerializerDoesNotExistz'The requested serializer was not found.Nr   r   r   r   r   r   r   r   r   $       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   WithData3   s
   
zDeserializationError.WithDataN)r   r   r   r   classmethodr&   r   r   r   r   r    0   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 r   )r"   pk)r   r"   r)   r   r   r   r   B   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   J      
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   updateO   s   
 
zProgressBar.updateN)r   r   r   r9   r   r@   r   r   r   r   r*   G   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.
        NTr1   )startF)optionsstream_classrB   selected_fieldsrD   rE   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   querysetrB   rC   rD   rE   rF   rG   rJ   progress_barr<   r   rS   r)   	pk_parentfieldr   r   r   rW   k   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   rN         zSerializer.start_serializationc                 C      dS )z?
        Called when serializing of the queryset ends.
        Nr   rg   r   r   r   r^         zSerializer.end_serializationc                 C   rd   )z>
        Called when serializing of an object starts.
        z=subclasses of Serializer must provide a start_object() methodre   r   r   r   r   rQ      rh   zSerializer.start_objectc                 C   ri   )z<
        Called when serializing of an object ends.
        Nr   r   r   r   r   r]      rj   zSerializer.end_objectc                 C   rd   )zW
        Called to handle each individual (non-relational) field on an object.
        z=subclasses of Serializer must provide a handle_field() methodre   r   r   rc   r   r   r   rY      rh   zSerializer.handle_fieldc                 C   rd   )z6
        Called to handle a ForeignKey field.
        z@subclasses of Serializer must provide a handle_fk_field() methodre   rk   r   r   r   rZ      rh   zSerializer.handle_fk_fieldc                 C   rd   )z5
        Called to handle a ManyToManyField.
        zAsubclasses of Serializer must provide a handle_m2m_field() methodre   rk   r   r   r   r\      rh   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).
        r_   N)callablegetattrrB   r_   rg   r   r   r   r_      s   
zSerializer.getvalue)r   r   r   r   internal_use_onlyr*   rM   r   rK   rW   rN   r^   rQ   r]   rY   rZ   r\   r_   r   r   r   r   rA   `   s(    CrA   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)rJ   
isinstancestrr   rB   )r   stream_or_stringrJ   r   r   r   r      s   

zDeserializer.__init__c                 C   s   | S r   r   rg   r   r   r   __iter__   s   zDeserializer.__iter__c                 C   rd   )z9Iteration interface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodre   rg   r   r   r   __next__   s   zDeserializer.__next__N)r   r   r   r   r   rs   rt   r   r   r   r   ro      s
    
ro   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   r   rw   rx   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   rv   rR   labelr)   rg   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_baserv   rw   itemsrm   set)r   save_m2mr|   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 )Nr5   F)handle_forward_references)rw   rx   r   rv   rR   	app_label
model_namerp   rT   r   ManyToManyReldeserialize_m2m_valuesr(   r    r&   r"   r)   nameManyToOneReldeserialize_fk_value	ExceptionsetattrrX   r   )	r   r|   rc   r%   optsrz   valuesevaluer   r   r   save_deferred_fields)  s<   

z'DeserializedObject.save_deferred_fields)NN)TNr   )r   r   r   r   r   r{   r   r   r   r   r   r   ru     s    

ru   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   )rR   default_managergetr)   rX   hasattr_statedbr   	to_python
db_managerr   DoesNotExist)r~   r   r   r   r)   r   r   r   r   r   build_instanceE  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 )Nrs   )	r   rp   rq   _default_managerr   r   r)   rR   r   )r   r#   r|   r   r   m2m_convertc  s   
z+deserialize_m2m_values.<locals>.m2m_convertc                    s    j j| S r   )rR   r)   r   )v)r#   r   r   r   o  r   )rT   r#   r   r   iter	TypeErrorr(   appendr   rp   r   DEFER_FIELD)	rc   r%   r|   r   r   pks_iterr   r   r)   r   r   r   r   _  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   rs   )rT   r#   r   
field_namer   rp   rq   r   r   r   r   rm   rR   r)   	get_fieldr   )	rc   r%   r|   r   r#   r   r   r   r   r   r   r   r     s.   

r   )r   r	   r   ior   django.core.exceptionsr   	django.dbr   django.utils.deprecationr   rv   r   r   KeyErrorr   r   r   r    r(   r*   rA   ro   ru   r   r   r   r   r   r   r   <module>   s*     A#