o
    ˜¨Ê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| _d S || _d S )NzTPickleSerializer is deprecated due to its security risk. Use JSONSerializer instead.)ÚwarningsÚwarnr   ÚpickleÚHIGHEST_PROTOCOLÚprotocol)Úselfr   © r   úN/var/www/html/env/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 )ÚProgressBaréK   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 )
Néd   é   Ú úú[Ú.ú ú]Ú
)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o¯d| _q*|  ¡  |  ¡ S )z'
        Serialize a queryset.
        NTr1   )ÚstartéýÿÿÿF)Ú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#