
v^]-                 @   s  d  Z  d d l m Z d d l m Z d d l m Z e   Z Gd d   d e	  Z
 Gd d   d e  Z Gd	 d
   d
 e  Z Gd d   d e  Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd 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               @   s   e  Z d  Z d Z d S)SerializerDoesNotExistz'The requested serializer was not found.N)__name__
__module____qualname____doc__ r
   r
   >/tmp/pip-build-8lau8j11/django/django/core/serializers/base.pyr      s   r   c               @   s   e  Z d  Z d Z d S)SerializationErrorz,Something bad happened during serialization.N)r   r   r   r	   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   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   ,   s    		zProgressBar.__init__c             C   s   |  j  s d  S| d |  j } | |  j d } |  j | k rB d  S| |  _ |  j d k r` d n d } |  j  j | d d | d |  j | d  | |  j k r |  j  j d	  |  j  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   r-   r
   r
   r
   r   r   )   s   r   c               @   s   e  Z d  Z d Z d Z e Z e Z d d d d d 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.
    FstreamNfieldsuse_natural_foreign_keysuse_natural_primary_keysprogress_outputobject_countr   c            K   s   | |  _  | d k	 r | n	 |  j   |  _ | |  _ | |  _ | |  _ |  j | |  }	 |  j   d |  _ xt	 | d d D]\ }
 } |  j
 |  | j j } |  j r | j j } | j r | j j r | n d } n d } x | j j D] } | j s	| | k r | j d k rL|  j d k s9| j |  j k r|  j | |  q |  j d k sw| j d d  |  j k r |  j | |  q WxN | j j D]@ } | j r|  j d k s| j |  j k r|  j | |  qW|  j |  |	 j |
  |  j od |  _ q} W|  j   |  j   S)z'
        Serialize a queryset.
        NTstartr      F)optionsstream_classr/   Zselected_fieldsr1   r2   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/   r0   r1   r2   r3   r4   r8   Zprogress_barr)   objr@   r   Z	pk_parentfieldr
   r
   r   rB   K   s>    	!			
		$!+	!
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   r;   y   s    zSerializer.start_serializationc             C   s   d S)z?
        Called when serializing of the queryset ends.
        Nr
   )r   r
   r
   r   rH      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() methodN)rL   )r   rJ   r
   r
   r   r>      s    zSerializer.start_objectc             C   s   d S)z<
        Called when serializing of an object ends.
        Nr
   )r   rJ   r
   r
   r   rG      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() methodN)rL   )r   rJ   rK   r
   r
   r   rD      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() methodN)rL   )r   rJ   rK   r
   r
   r   rE      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() methodN)rL   )r   rJ   rK   r
   r
   r   rF      s    zSerializer.handle_m2m_fieldc             C   s,   t  t |  j d d   r( |  j j   Sd S)zn
        Return the fully serialized queryset (or None if the output stream is
        not seekable).
        rI   N)callablegetattrr/   rI   )r   r
   r
   r   rI      s    zSerializer.getvalue)r   r   r   r	   Zinternal_use_onlyr   r:   r   r9   rB   r;   rH   r>   rG   rD   rE   rF   rI   r
   r
   r
   r   r.   @   s   -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   s7   | |  _  t | t  r* t |  |  _ n	 | |  _ d S)zA
        Init this serializer given a stream or a string
        N)r8   
isinstancestrr   r/   )r   Zstream_or_stringr8   r
   r
   r   r      s    	zDeserializer.__init__c             C   s   |  S)Nr
   )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__() methodN)rL   )r   r
   r
   r   __next__   s    zDeserializer.__next__N)r   r   r   r	   r   rR   rS   r
   r
   r
   r   rO      s   
rO   c               @   sU   e  Z d  Z d Z d d d d  Z d d   Z d 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)N)objectm2m_datadeferred_fields)r   rJ   rV   rW   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   rU   r?   labelr   )r   r
   r
   r   __repr__   s    	zDeserializedObject.__repr__Tc             K   sw   t  j j |  j d | d d | |  j rj | rj x6 |  j j   D]% \ } } t |  j |  j |  qA Wd  |  _ d  S)NusingrawT)r   ModelZ	save_baserU   rV   itemsrN   set)r   Zsave_m2mr[   kwargsZaccessor_nameobject_listr
   r
   r   save   s
    "zDeserializedObject.savec       	      C   st  i  |  _  xZ|  j j   D]I\ } } |  j j } | j d | j } t | j t	 j
  r y t | | | d d } WnI t k
 r } z) t j | j | |  j j | j   WYd  d  } ~ Xn X| |  j  | j <q t | j t	 j  r y t | | | d d } WnC t k
 rK} z# t j | | |  j j |   WYd  d  } ~ Xn Xt |  j | j |  q W|  j   d  S)Nr"   handle_forward_referencesF)rV   rW   r^   rU   r?   Z	app_labelZ
model_namerP   rA   r   ZManyToManyReldeserialize_m2m_valuesr   r   r   r   r   nameZManyToOneReldeserialize_fk_value	ExceptionsetattrrC   rb   )	r   r[   rK   r   optsrY   valuesevaluer
   r
   r   save_deferred_fields   s"    	71z'DeserializedObject.save_deferred_fields)r   r   r   r	   r   rZ   rb   rm   r
   r
   r
   r   rT      s
   
rT   c             C   s   |  j  j } | j |  j  j j  } | d k r t | d  r t |  d  r |  |   j   } y; |  j  j j | j |  j	 |   j  | |  j  j j
 <Wn |  j k
 r Yn X|  |   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)r?   default_managergetr   re   hasattrro   	to_python
db_managerrn   rC   ZDoesNotExist)r]   datadbrp   r   ro   r
   r
   r   build_instance   s    /rw   c                s   |  j  j   t   j d  r6    f d d   } n   f d d   } y2 g  } x! | D] } | j | |   qX W| SWnM t k
 r } z- t | t  r | r t St	 | |   WYd  d  } ~ Xn Xd  S)Nrn   c                sR   t  |  d  r; t |  t  r;   j j   j |    j S  j j j |   Sd  S)NrR   )	rr   rP   rQ   _default_managerrt   rn   r   r?   rs   )rl   )r   r[   r
   r   m2m_convert  s    z+deserialize_m2m_values.<locals>.m2m_convertc                s     j  j j |   S)N)r?   r   rs   )v)r   r
   r   ry     s    )
rA   r   rr   rx   appendrg   rP   r   DEFER_FIELDr   )rK   r   r[   rc   ry   rj   r   rk   r
   )r   r[   r   rd     s    rd   c       	      C   s   | d  k r d  S|  j  j } | j } |  j  j } t | d  r t | d  r t | t  r y | j |  j |   } Wn t	 k
 r | r t
 S  Yn Xt | |  } | j j j  r | j } | S| j j |  j |  S)Nrn   rR   )rA   r   rx   
field_namerr   rP   rQ   rt   rn   r   r|   rN   r?   r   	get_fieldrs   )	rK   r   r[   rc   r   rp   r}   rJ   rl   r
   r
   r   rf   )  s$    		rf   N)r	   ior   Zdjango.core.exceptionsr   Z	django.dbr   rU   r|   KeyErrorr   rg   r   r   r   r   r.   rO   rT   rw   rd   rf   r
   r
   r
   r   <module>   s   	l9