a
    Lcòfø3  ã                   @   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n|| _d S )NzTPickleSerializer is deprecated due to its security risk. Use JSONSerializer instead.)ÚwarningsÚwarnr   ÚpickleÚHIGHEST_PROTOCOLÚprotocol)Úselfr   © r   úY/home/httpd/docs/test/DocsMgr/lib/python3.9/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      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   Ú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 )ÚProgressBaréK   c                 C   s   || _ || _d| _d S )Nr   )ÚoutputÚtotal_countÚ	prev_done)r   r(   r)   r   r   r   r   J   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ÚdoneÚcrr   r   r   ÚupdateO   s    
 ÿ
zProgressBar.updateN)r   r   r   r4   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   s‚  || _ |du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´||u r¢|jdu râ| jdu sÔ|j| jv rà|  ||¡ q¢| jdu �s|jdd… | jv r¢|  ||¡ q¢|jjD ]4}|j�r| jdu �s>|j| jv �r|  ||¡ �q|  |¡ |	 |
¡ | j�old| _qT|  ¡  |  ¡ 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_modelr%   Úremote_fieldZparent_linkZlocal_fieldsÚ	serializeÚattnameÚhandle_fieldÚhandle_fk_fieldZlocal_many_to_manyÚhandle_m2m_fieldÚ
end_objectr;   Úend_serializationÚgetvalue)r   Zquerysetr=   r>   r?   r@   rA   rB   rE   Úprogress_barr7   r   rM   r%   Z	pk_parentÚfieldr   r   r   rO   k   sR    
ÿ
ÿ
þÿþÿ
þ

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   rH   ®   s    ÿzSerializer.start_serializationc                 C   s   dS )z?
        Called when serializing of the queryset ends.
        Nr   r[   r   r   r   rU   ¶   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() methodNrY   r   r   r   r   rK   ¼   s    ÿzSerializer.start_objectc                 C   s   dS )z<
        Called when serializing of an object ends.
        Nr   r   r   r   r   rT   Ä   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() methodNrY   ©r   r   rX   r   r   r   rQ   Ê   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() methodNrY   r\   r   r   r   rR   Ò   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() methodNrY   r\   r   r   r   rS   Ú   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).
        rV   N)ÚcallableÚgetattrr=   rV   r[   r   r   r   rV   â   s    zSerializer.getvalue)r   r   r   r   Zinternal_use_onlyr&   rG   r   rF   rO   rH   rU   rK   rT   rQ   rR   rS   rV   r   r   r   r   r<   `   s&   ÷C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)rE   Ú
isinstanceÚstrr   r=   )r   Zstream_or_stringrE   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   s   t dƒ‚dS )z9Iteration interface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodNrY   r[   r   r   r   Ú__next__ý   s    ÿzDeserializer.__next__N)r   r   r   r   r   rb   rc   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   rf   rg   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   re   rL   Úlabelr%   r[   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_basere   rf   Úitemsr^   Úset)r   Zsave_m2mrk   Ú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yŽ } z$t |j|| jj|j¡‚W Y d }~n
d }~0 0 || j |j< qt|jt	jƒrzt|||dd�}W n8 tyø } z t ||| jj|¡‚W Y d }~n
d }~0 0 t| j|j|ƒ q|  ¡  d S )Nr0   F)Úhandle_forward_references)rf   rg   rn   re   rL   Z	app_labelZ
model_namer`   rN   r   ZManyToManyRelÚdeserialize_m2m_valuesr$   r   r"   r   r%   ÚnameZManyToOneRelÚdeserialize_fk_valueÚ	ExceptionÚsetattrrP   rq   )	r   rk   rX   r!   Úoptsri   ÚvaluesÚeÚvaluer   r   r   Úsave_deferred_fields)  s2    ÿ
ÿÿ
ÿz'DeserializedObject.save_deferred_fields)NN)TN)N)r   r   r   r   r   rj   rq   r|   r   r   r   r   rd     s
   

rd   c                 C   s    | j j}| | j jj¡}|du r’t|dƒr’t| dƒr’| f i |¤Ž}||j_| ¡ }z*| j j 	| 
|¡j|Ž j¡|| j jj< W n | jy�   Y n0 | f 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_key)rL   Údefault_managerÚgetr%   rP   ÚhasattrÚ_stateÚdbr~   Ú	to_pythonÚ
db_managerr}   ZDoesNotExist)rm   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yj } zt||ƒ‚W Y d }~n
d }~0 0 z"g }|D ]}| ||ƒ¡ qv|W S  tyÚ } z4t	|t
ƒr¼|r¼tW  Y d }~S t||ƒ‚W Y d }~n
d }~0 0 d S )Nr}   c                    s:   t | dƒr(t| tƒs(ˆ j ˆ¡j| Ž jS ˆ jj | ¡S d S )Nrb   )	r�   r`   ra   Ú_default_managerr…   r}   r%   rL   r„   )r{   ©r    rk   r   r   Úm2m_convertc  s    ÿÿz+deserialize_m2m_values.<locals>.m2m_convertc                    s   ˆ j j | ¡S r   )rL   r%   r„   )Úv)r    r   r   r‰   o  s    )rN   r    r�   r‡   ÚiterÚ	TypeErrorr$   Úappendrv   r`   r   ÚDEFER_FIELD)	rX   r!   rk   rr   r‰   Zpks_iterrz   ry   r%   r   rˆ   r   rs   _  s"     rs   c           	      C   s¦   |d u rd S | j j}|j}| j j}t|dƒr”t|dƒr”t|tƒs”z| |¡j|Ž }W n  t	yt   |rnt
 Y S ‚ Y n0 t||ƒ}|jjj r�|j}|S |j |¡ |¡S )Nr}   rb   )rN   r    r‡   Ú
field_namer�   r`   ra   r…   r}   r   rŽ   r^   rL   r%   Ú	get_fieldr„   )	rX   r!   rk   rr   r    r   r�   r   r{   r   r   r   ru   ‚  s,    ÿþý

ru   )r   r	   r   Úior   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.utils.deprecationr   re   rŽ   r   ÚKeyErrorr   rv   r   r   r$   r&   r<   r_   rd   r†   rs   ru   r   r   r   r   Ú<module>   s(    A#