B
    ©0H[4  ã               @   s�   d Z ddlmZ ddlm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S )z;
Module for abstract serializer/unserializer base classes.
é    )ÚStringIO)Úmodelsc               @   s   e Zd ZdZdS )ÚSerializerDoesNotExistz'The requested serializer was not found.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r	   r	   ú`C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\core\serializers\base.pyr   	   s   r   c               @   s   e Zd ZdZdS )ÚSerializationErrorz,Something bad happened during serialization.N)r   r   r   r   r	   r	   r	   r
   r      s   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	   )ÚclsZoriginal_excÚmodelZfkZ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d„ ZdS )ÚProgressBaréK   c             C   s   || _ || _d| _d S )Nr   )ÚoutputÚtotal_countÚ	prev_done)Úselfr   r   r	   r	   r
   Ú__init__"   s    zProgressBar.__init__c             C   sš   | j s
d S |d | j }|| j d }| j|kr4d S || _| jdkrHdnd}| j  |d d|  d| j|   d ¡ || jkrŒ| j  d	¡ | j  ¡  d S )
Néd   é   Ú úú[Ú.ú ú]Ú
)r   r   Úprogress_widthr   ÚwriteÚflush)r   ÚcountÚpercÚdoneZcrr	   r	   r
   Úupdate'   s    
*
zProgressBar.updateN)r   r   r   r!   r   r'   r	   r	   r	   r
   r      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   sP  || _ |dk	r|n|  ¡ | _|| _|| _|| _|  ||¡}	|  ¡  d| _xöt	|dd�D ]æ\}
}|  
|¡ |jj}xn|jjD ]b}|jrz|jdkr²| jdks¤|j| jkrÜ|  ||¡ qz| jdksÐ|jdd… | jkrz|  ||¡ qzW x:|jjD ].}|jrê| jdk�s|j| jkrê|  ||¡ qêW |  |¡ |	 |
¡ | jrVd| _qVW |  ¡  |  ¡ S )z'
        Serialize a queryset.
        NTr   )ÚstartéýÿÿÿF)ÚoptionsÚstream_classr)   Zselected_fieldsr+   r,   Úprogress_classÚstart_serializationÚfirstÚ	enumerateÚstart_objectÚ_metaÚconcrete_modelZlocal_fieldsÚ	serializeZremote_fieldZattnameÚhandle_fieldÚhandle_fk_fieldZmany_to_manyÚhandle_m2m_fieldÚ
end_objectr'   Úend_serializationÚgetvalue)r   Zquerysetr)   r*   r+   r,   r-   r.   r1   Úprogress_barr$   Úobjr9   Úfieldr	   r	   r
   r:   A   s8    




zSerializer.serializec             C   s   t dƒ‚dS )zA
        Called when serializing of the queryset starts.
        zDsubclasses of Serializer must provide a start_serialization() methodN)ÚNotImplementedError)r   r	   r	   r
   r4   h   s    zSerializer.start_serializationc             C   s   dS )z?
        Called when serializing of the queryset ends.
        Nr	   )r   r	   r	   r
   r?   n   s    zSerializer.end_serializationc             C   s   t dƒ‚dS )z>
        Called when serializing of an object starts.
        z=subclasses of Serializer must provide a start_object() methodN)rD   )r   rB   r	   r	   r
   r7   t   s    zSerializer.start_objectc             C   s   dS )z<
        Called when serializing of an object ends.
        Nr	   )r   rB   r	   r	   r
   r>   z   s    zSerializer.end_objectc             C   s   t dƒ‚dS )zW
        Called to handle each individual (non-relational) field on an object.
        z>subclasses of Serializer must provide an handle_field() methodN)rD   )r   rB   rC   r	   r	   r
   r;   €   s    zSerializer.handle_fieldc             C   s   t dƒ‚dS )z6
        Called to handle a ForeignKey field.
        zAsubclasses of Serializer must provide an handle_fk_field() methodN)rD   )r   rB   rC   r	   r	   r
   r<   †   s    zSerializer.handle_fk_fieldc             C   s   t dƒ‚dS )z5
        Called to handle a ManyToManyField.
        zBsubclasses of Serializer must provide an handle_m2m_field() methodN)rD   )r   rB   rC   r	   r	   r
   r=   Œ   s    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Úgetattrr)   r@   )r   r	   r	   r
   r@   ’   s    zSerializer.getvalue)r   r   r   r   Zinternal_use_onlyr   r3   r   r2   r:   r4   r?   r7   r>   r;   r<   r=   r@   r	   r	   r	   r
   r(   6   s   &r(   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|ƒ| _n|| _dS )zA
        Init this serializer given a stream or a string
        N)r1   Ú
isinstanceÚstrr   r)   )r   Zstream_or_stringr1   r	   r	   r
   r       s    
zDeserializer.__init__c             C   s   | S )Nr	   )r   r	   r	   r
   Ú__iter__ª   s    zDeserializer.__iter__c             C   s   t dƒ‚dS )z8Iteration iterface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodN)rD   )r   r	   r	   r
   Ú__next__­   s    zDeserializer.__next__N)r   r   r   r   r   rJ   rK   r	   r	   r	   r
   rG   ›   s   
rG   c               @   s,   e Zd ZdZd
dd„Z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 )N)ÚobjectÚm2m_data)r   rB   rN   r	   r	   r
   r   ¾   s    zDeserializedObject.__init__c             C   s   d| j j| jjj| jjf S )Nz<%s: %s(pk=%s)>)Ú	__class__r   rM   r8   ÚlabelÚpk)r   r	   r	   r
   Ú__repr__Â   s    zDeserializedObject.__repr__Tc             K   sZ   t jj| jf|ddœ|—Ž | jrP|rPx(| j ¡ D ]\}}t| j|ƒ |¡ q2W d | _d S )NT)ÚusingÚraw)r   ÚModelZ	save_baserM   rN   ÚitemsrF   Úset)r   Zsave_m2mrS   ÚkwargsZaccessor_nameÚobject_listr	   r	   r
   ÚsaveÉ   s
    
zDeserializedObject.save)N)TN)r   r   r   r   r   rR   rZ   r	   r	   r	   r
   rL   ²   s   

rL   c             C   sh   | f |Ž}|j dkrdt| dƒrdt| jdƒrd| ¡ }y| j |¡j|Ž j |_ W n | jk
rb   Y nX |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Únatural_keyÚget_by_natural_key)rQ   ÚhasattrZ_default_managerr[   Z
db_managerr\   ZDoesNotExist)rU   ÚdataÚdbrB   r[   r	   r	   r
   Úbuild_instance×   s    
r`   N)r   Úior   Z	django.dbr   ÚKeyErrorr   Ú	Exceptionr   r   r   r(   rG   rL   r`   r	   r	   r	   r
   Ú<module>   s   e%