a
    ‘ÐOcø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   úS/var/www/html/gsl.tools/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   Zquerysetr<   r=   r>   r?   r@   rA   rD   Ú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   Z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   Z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   ra   rb   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   re   rf   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   rd   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_baserd   re   Úitemsr]   Úset)r   Zsave_m2mrj   Ú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)re   rf   rm   rd   rK   Z	app_labelZ
model_namer_   rM   r   ZManyToManyRelÚdeserialize_m2m_valuesr$   r   r"   r   r%   ÚnameZManyToOneRelÚdeserialize_fk_valueÚ	ExceptionÚsetattrrO   rp   )	r   rj   rW   r!   Úoptsrh   ÚvaluesÚeÚvaluer   r   r   Úsave_deferred_fields)  s2    ÿ
ÿÿ
ÿz'DeserializedObject.save_deferred_fields)NN)TN)N)r   r   r   r   r   ri   rp   r{   r   r   r   r   rc     s
   

rc   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)rl   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 )Nra   )	r€   r_   r`   Ú_default_managerr„   r|   r%   rK   rƒ   )rz   ©r    rj   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$   Úappendru   r_   r   ÚDEFER_FIELD)	rW   r!   rj   rq   rˆ   Zpks_iterry   rx   r%   r   r‡   r   rr   _  s"     rr   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|   ra   )rM   r    r†   Ú
field_namer€   r_   r`   r„   r|   r   r�   r]   rK   r%   Ú	get_fieldrƒ   )	rW   r!   rj   rq   r    r~   rŽ   r   rz   r   r   r   rt   ‚  s,    ÿþý

rt   )r   r	   r   Úior   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.utils.deprecationr   rd   r�   r   ÚKeyErrorr   ru   r   r   r$   r&   r;   r^   rc   r…   rr   rt   r   r   r   r   Ú<module>   s(    A#