a
    ¥Q•hø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   úU/var/www/sistema_ama/venv/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ÚdoneZ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   Úquerysetr<   r=   r>   r?   r@   rA   rD   Zprogress_barr7   r   rL   r%   Z	pk_parentÚfieldr   r   r   rN   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   rG   ®   s    ÿzSerializer.start_serializationc                 C   s   dS )z?
        Called when serializing of the queryset ends.
        Nr   rZ   r   r   r   rT   ¶   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() methodNrX   r   r   r   r   rJ   ¼   s    ÿzSerializer.start_objectc                 C   s   dS )z<
        Called when serializing of an object ends.
        Nr   r   r   r   r   rS   Ä   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() methodNrX   ©r   r   rW   r   r   r   rP   Ê   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() methodNrX   r[   r   r   r   rQ   Ò   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() methodNrX   r[   r   r   r   rR   Ú   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).
        rU   N)ÚcallableÚgetattrr<   rU   rZ   r   r   r   rU   â   s    zSerializer.getvalue)r   r   r   r   Úinternal_use_onlyr&   rF   r   rE   rN   rG   rT   rJ   rS   rP   rQ   rR   rU   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)rD   Ú
isinstanceÚstrr   r<   )r   Ústream_or_stringrD   r   r   r   r   ð   s    
zDeserializer.__init__c                 C   s   | S r   r   rZ   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__() methodNrX   rZ   r   r   r   Ú__next__ý   s    ÿzDeserializer.__next__N)r   r   r   r   r   rc   rd   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   rg   rh   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   rf   rK   Úlabelr%   rZ   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_baserf   rg   Úitemsr]   Úset)r   Zsave_m2mrl   Ú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)rg   rh   ro   rf   rK   Ú	app_labelÚ
model_namer`   rM   r   ZManyToManyRelÚdeserialize_m2m_valuesr$   r   r"   r   r%   ÚnameZManyToOneRelÚdeserialize_fk_valueÚ	ExceptionÚsetattrrO   rr   )	r   rl   rW   r!   Úoptsrj   ÚvaluesÚeÚvaluer   r   r   Úsave_deferred_fields)  s2    ÿ
ÿÿ
ÿz'DeserializedObject.save_deferred_fields)NN)TN)N)r   r   r   r   r   rk   rr   r   r   r   r   r   re     s
   

re   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)rK   Údefault_managerÚgetr%   rO   ÚhasattrÚ_stateÚdbr�   Ú	to_pythonÚ
db_managerr€   ZDoesNotExist)rn   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 )Nrc   )	r„   r`   ra   Ú_default_managerrˆ   r€   r%   rK   r‡   )r~   ©r    rl   r   r   Úm2m_convertc  s    ÿÿz+deserialize_m2m_values.<locals>.m2m_convertc                    s   ˆ j j | ¡S r   )rK   r%   r‡   )Úv)r    r   r   rŒ   o  s    )rM   r    r„   rŠ   ÚiterÚ	TypeErrorr$   Úappendry   r`   r   ÚDEFER_FIELD)	rW   r!   rl   rs   rŒ   Zpks_iterr}   r|   r%   r   r‹   r   rv   _  s"     rv   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€   rc   )rM   r    rŠ   Ú
field_namer„   r`   ra   rˆ   r€   r   r‘   r]   rK   r%   Ú	get_fieldr‡   )	rW   r!   rl   rs   r    r‚   r’   r   r~   r   r   r   rx   ‚  s,    ÿþý

rx   )r   r	   r   Úior   Údjango.core.exceptionsr   Ú	django.dbr   Údjango.utils.deprecationr   rf   r‘   r   ÚKeyErrorr   ry   r   r   r$   r&   r;   r_   re   r‰   rv   rx   r   r   r   r   Ú<module>   s(    A#