U
    5øiu/  ã                   @   sØ   d Z ddl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)Úmodelsc                   @   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   |d krt jn|| _d S ©N)ÚpickleÚHIGHEST_PROTOCOLÚprotocol)Úselfr	   © r   ú@/tmp/pip-unpacked-wheel-gcyiijx6/django/core/serializers/base.pyÚ__init__   s    zPickleSerializer.__init__c                 C   s   t  || j¡S r   )r   Údumpsr	   ©r
   Úobjr   r   r   r      s    zPickleSerializer.dumpsc                 C   s
   t  |¡S r   )r   Úloads)r
   Údatar   r   r   r      s    zPickleSerializer.loads)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r      s   
r   c                   @   s   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      s   r   c                   @   s   e Zd ZdZdS )ÚSerializationErrorz,Something bad happened during serialization.Nr   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   )ÚclsÚoriginal_excÚmodelZ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 r   )r   Úpk)r
   r   r"   r   r   r   r   4   s    z M2MDeserializationError.__init__N)r   r   r   r   r   r   r   r   r   r!   2   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)r
   r%   r&   r   r   r   r   <   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   ÚupdateA   s    
*
zProgressBar.updateN)r   r   r   r1   r   r7   r   r   r   r   r#   9   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   s‚  || _ |dk	r|n|  ¡ | _|| _|| _|| _|  ||¡}	|  ¡  d| _t	|dd�D �]\}
}|  
|¡ |jj}| jr–|jj}|jr�|jjr�|nd}nd}|jjD ]l}|js´||kr¢|jdkrâ| jdksÔ|j| jkrà|  ||¡ q¢| jdk�s|jdd… | jkr¢|  ||¡ q¢|jjD ]4}|j�r| jdk�s>|j| jk�r|  ||¡ �q|  |¡ |	 |
¡ | j�old| _qT|  ¡  |  ¡ S )z'
        Serialize a queryset.
        NTr)   )ÚstartéýÿÿÿF)ÚoptionsÚstream_classr9   Zselected_fieldsr;   r<   Úprogress_classÚstart_serializationÚfirstÚ	enumerateÚstart_objectÚ_metaÚconcrete_modelr"   Úremote_fieldZparent_linkZlocal_fieldsÚ	serializeÚattnameÚhandle_fieldÚhandle_fk_fieldZlocal_many_to_manyÚhandle_m2m_fieldÚ
end_objectr7   Úend_serializationÚgetvalue)r
   Zquerysetr9   r:   r;   r<   r=   r>   rA   Úprogress_barr4   r   rI   r"   Z	pk_parentÚfieldr   r   r   rK   [   s>    

 

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   rD   ‰   s    zSerializer.start_serializationc                 C   s   dS )z?
        Called when serializing of the queryset ends.
        Nr   rW   r   r   r   rQ   �   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() methodNrU   r   r   r   r   rG   •   s    zSerializer.start_objectc                 C   s   dS )z<
        Called when serializing of an object ends.
        Nr   r   r   r   r   rP   ›   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 a handle_field() methodNrU   ©r
   r   rT   r   r   r   rM   ¡   s    zSerializer.handle_fieldc                 C   s   t dƒ‚dS )z6
        Called to handle a ForeignKey field.
        z@subclasses of Serializer must provide a handle_fk_field() methodNrU   rX   r   r   r   rN   §   s    zSerializer.handle_fk_fieldc                 C   s   t dƒ‚dS )z5
        Called to handle a ManyToManyField.
        zAsubclasses of Serializer must provide a handle_m2m_field() methodNrU   rX   r   r   r   rO   ­   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).
        rR   N)ÚcallableÚgetattrr9   rR   rW   r   r   r   rR   ³   s    zSerializer.getvalue)r   r   r   r   Zinternal_use_onlyr#   rC   r   rB   rK   rD   rQ   rG   rP   rM   rN   rO   rR   r   r   r   r   r8   P   s"     ÿ.r8   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)rA   Ú
isinstanceÚstrr   r9   )r
   Zstream_or_stringrA   r   r   r   r   Á   s    
zDeserializer.__init__c                 C   s   | S r   r   rW   r   r   r   Ú__iter__Ë   s    zDeserializer.__iter__c                 C   s   t dƒ‚dS )z9Iteration interface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodNrU   rW   r   r   r   Ú__next__Î   s    zDeserializer.__next__N)r   r   r   r   r   r^   r_   r   r   r   r   r[   ¼   s   
r[   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   rb   rc   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   ra   rH   Úlabelr"   rW   r   r   r   Ú__repr__ä   s
    ýzDeserializedObject.__repr__Tc                 K   sV   t jj| jf|ddœ|—Ž | jrL|rL| j ¡ D ]\}}t| j|ƒ |¡ q0d | _d S )NT)ÚusingÚraw)r   ÚModelZ	save_basera   rb   ÚitemsrZ   Úset)r
   Zsave_m2mrg   ÚkwargsZaccessor_nameZobject_listr   r   r   Úsaveë   s
    
zDeserializedObject.savec           	      C   s  i | _ | j ¡ D ]ö\}}| jj}|jd |j }t|jt	j
ƒrœzt|||dd�}W n: tk
rŒ } zt |j|| jj|j¡‚W 5 d }~X Y nX || j |j< qt|jt	jƒrzt|||dd�}W n6 tk
rô } zt ||| jj|¡‚W 5 d }~X Y nX t| j|j|ƒ q|  ¡  d S )Nr-   F)Úhandle_forward_references)rb   rc   rj   ra   rH   Z	app_labelZ
model_namer\   rJ   r   ZManyToManyRelÚdeserialize_m2m_valuesr!   r   r   r   r"   ÚnameZManyToOneRelÚdeserialize_fk_valueÚ	ExceptionÚsetattrrL   rm   )	r
   rg   rT   r   Úoptsre   ÚvaluesÚeÚvaluer   r   r   Úsave_deferred_fieldsø   s"    *&z'DeserializedObject.save_deferred_fields)NN)TN)N)r   r   r   r   r   rf   rm   rx   r   r   r   r   r`   Ó   s
   

r`   c                 C   sŽ   | j j}| | j jj¡}|dkr„t|dƒr„t| dƒr„| f |Ž ¡ }z*| j j | |¡j	|Ž j¡|| j jj< W n | j
k
r‚   Y nX | f |Ž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_key)rH   Údefault_managerÚgetr"   rL   Úhasattrrz   Ú	to_pythonÚ
db_managerry   ZDoesNotExist)ri   r   Údbr{   r"   rz   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k
rh } zt||ƒ‚W 5 d }~X Y nX z"g }|D ]}| ||ƒ¡ qt|W S  tk
rÒ } z(t	|t
ƒr¸|r¸t W Y ¢S t||ƒ‚W 5 d }~X Y nX d S )Nry   c                    s:   t | dƒr(t| tƒs(ˆ j ˆ¡j| Ž jS ˆ jj | ¡S d S )Nr^   )	r}   r\   r]   Ú_default_managerr   ry   r"   rH   r~   )rw   ©r   rg   r   r   Úm2m_convert$  s    z+deserialize_m2m_values.<locals>.m2m_convertc                    s   ˆ j j | ¡S r   )rH   r"   r~   )Úv)r   r   r   r„   *  s    )rJ   r   r}   r‚   ÚiterÚ	TypeErrorr!   Úappendrr   r\   r   ÚDEFER_FIELD)	rT   r   rg   rn   r„   Zpks_iterrv   ru   r"   r   rƒ   r   ro   !  s"    ro   c           	      C   s¨   |d krd S | j j}|j}| j j}t|dƒr–t|dƒr–t|tƒs–z| |¡j|Ž }W n" t	k
rv   |rpt
 Y S ‚ Y nX t||ƒ}|jjj r’|j}|S |j |¡ |¡S )Nry   r^   )rJ   r   r‚   Ú
field_namer}   r\   r]   r   ry   r   r‰   rZ   rH   r"   Ú	get_fieldr~   )	rT   r   rg   rn   r   r{   rŠ   r   rw   r   r   r   rq   =  s*    
ÿÿ

rq   )r   r   Úior   Zdjango.core.exceptionsr   Z	django.dbr   ra   r‰   r   ÚKeyErrorr   rr   r   r   r!   r#   r8   r[   r`   r�   ro   rq   r   r   r   r   Ú<module>   s"   l9