o
    b-                     @   s   d Z ddlmZ ddlmZ ddlmZ e 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.
    )StringIO)ObjectDoesNotExist)modelsc                   @      e Zd ZdZdS )SerializerDoesNotExistz'The requested serializer was not found.N__name__
__module____qualname____doc__ r   r   [/var/www/secure340b-portal/env/lib/python3.10/site-packages/django/core/serializers/base.pyr          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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 N)r   pk)selfr   r   r   r   r   __init__$   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 )ProgressBarK   c                 C   s   || _ || _d| _d S )Nr   )outputtotal_count	prev_done)r   r   r   r   r   r   r   ,      
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 )
Nd       [. ]
)r   r   progress_widthr    writeflush)r   countpercdonecrr   r   r   update1   s   
*
zProgressBar.updateN)r   r	   r
   r+   r   r2   r   r   r   r   r   )   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od| _q*|   |  S )z'
        Serialize a queryset.
        NTr#   )startF)optionsstream_classr4   Zselected_fieldsr6   r7   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_objectr2   end_serializationgetvalue)r   Zquerysetr4   r5   r6   r7   r8   r9   r<   progress_barr.   objrD   r   Z	pk_parentfieldr   r   r   rF   K   sD   



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   r?   y      zSerializer.start_serializationc                 C      dS )z?
        Called when serializing of the queryset ends.
        Nr   rT   r   r   r   rL         zSerializer.end_serializationc                 C   rQ   )z>
        Called when serializing of an object starts.
        z=subclasses of Serializer must provide a start_object() methodrR   r   rO   r   r   r   rB      rU   zSerializer.start_objectc                 C   rV   )z<
        Called when serializing of an object ends.
        Nr   rX   r   r   r   rK      rW   zSerializer.end_objectc                 C   rQ   )zW
        Called to handle each individual (non-relational) field on an object.
        z=subclasses of Serializer must provide a handle_field() methodrR   r   rO   rP   r   r   r   rH      rU   zSerializer.handle_fieldc                 C   rQ   )z6
        Called to handle a ForeignKey field.
        z@subclasses of Serializer must provide a handle_fk_field() methodrR   rY   r   r   r   rI      rU   zSerializer.handle_fk_fieldc                 C   rQ   )z5
        Called to handle a ManyToManyField.
        zAsubclasses of Serializer must provide a handle_m2m_field() methodrR   rY   r   r   r   rJ      rU   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).
        rM   N)callablegetattrr4   rM   rT   r   r   r   rM      s   
zSerializer.getvalue)r   r	   r
   r   Zinternal_use_onlyr   r>   r   r=   rF   r?   rL   rB   rK   rH   rI   rJ   rM   r   r   r   r   r3   @   s     .r3   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)r<   
isinstancestrr   r4   )r   Zstream_or_stringr<   r   r   r   r      s   

zDeserializer.__init__c                 C   s   | S r   r   rT   r   r   r   __iter__   s   zDeserializer.__iter__c                 C   rQ   )z9Iteration interface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodrR   rT   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   rO   rc   rd   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   rb   rC   labelr   rT   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   ModelZ	save_baserb   rc   itemsr[   set)r   Zsave_m2mrh   kwargsZaccessor_nameZ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 )Nr'   F)handle_forward_references)rc   rd   rk   rb   rC   Z	app_labelZ
model_namer]   rE   r   ZManyToManyReldeserialize_m2m_valuesr   r   r   r   r   nameZManyToOneReldeserialize_fk_value	ExceptionsetattrrG   rn   )	r   rh   rP   r   optsrf   valuesevaluer   r   r   save_deferred_fields   s,   z'DeserializedObject.save_deferred_fields)NN)TNr   )r   r	   r
   r   r   rg   rn   ry   r   r   r   r   ra      s    

ra   c                 C   s   | j j}|| j jj}|du rCt|drCt| drC| di | }z| j j||j	| j|| j jj< W n
 | j
yB   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   )rC   default_managergetr   rG   hasattrr{   	to_python
db_managerrz   ZDoesNotExist)rj   datadbr|   r   r{   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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 )Nrz   c                    s6   t | drt| ts jj|  jS  jj| S )Nr_   )	r~   r]   r^   _default_managerr   rz   r   rC   r   )rx   r   rh   r   r   m2m_convert  s   z+deserialize_m2m_values.<locals>.m2m_convertc                    s    j j| S r   )rC   r   r   )v)r   r   r   r     s   )rE   r   r~   r   iter	TypeErrorr   appendrs   r]   r   DEFER_FIELD)	rP   r   rh   ro   r   Zpks_iterrw   rv   r   r   r   r   rp     s*   

rp   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 )Nrz   r_   )rE   r   r   
field_namer~   r]   r^   r   rz   r   r   r[   rC   r   	get_fieldr   )	rP   r   rh   ro   r   r|   r   rO   rx   r   r   r   rr   -  s,   


rr   N)r   ior   Zdjango.core.exceptionsr   Z	django.dbr   rb   r   KeyErrorr   rs   r   r   r   r   r3   r\   ra   r   rp   rr   r   r   r   r   <module>   s     l9