
 X                 @   s   d  Z  d d l m Z d d l m Z Gd d   d 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 e j  Z Gd d   d e
  Z d d   Z d S)z;
Module for abstract serializer/unserializer base classes.
    )models)sixc               @   s   e  Z d  Z d Z d S)SerializerDoesNotExistz'The requested serializer was not found.N)__name__
__module____qualname____doc__ r	   r	   J/home/ubuntu/projects/ifolica/build/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	   )clsZoriginal_excmodelZfkZ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 d   Z d S)ProgressBarK   c             C   s   | |  _  | |  _ d |  _ d  S)Nr   )outputtotal_count	prev_done)selfr   r   r	   r	   r
   __init__!   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	  n  |  j  j   d  S)
Nd       [. ]
)r   r   progress_widthr   writeflush)r   countpercdonecrr	   r	   r
   update&   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 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.
    Fc             K   s  | |  _  | j d t j    |  _ | j d d  |  _ | j d d  |  _ | j d d  |  _ |  j | j d d  | j d d	   } |  j	   d
 |  _
 xft | d d D]R\ } } |  j |  | j j } x | j j D] } | j r | j d k r:|  j d k s$| j |  j k rx|  j | |  qxq{|  j d k se| j d d  |  j k r{|  j | |  q{q q WxT | j j D]F } | j r|  j d k s| j |  j k r|  j | |  qqqW|  j |  | j |  |  j
 r d |  _
 q q W|  j   |  j   S)z'
        Serialize a queryset.
        streamfieldsNuse_natural_foreign_keysFuse_natural_primary_keysZprogress_outputZobject_countr   Tstartr      )optionspopr   StringIOr*   Zselected_fieldsr,   r-   progress_classstart_serializationfirst	enumeratestart_object_metaconcrete_modelZlocal_fields	serializeZremote_fieldZattnamehandle_fieldhandle_fk_fieldZmany_to_manyhandle_m2m_field
end_objectr(   end_serializationgetvalue)r   Zquerysetr1   Zprogress_barr$   objr:   fieldr	   r	   r
   r;   ?   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
   r5   g   s    zSerializer.start_serializationc             C   s   d S)z?
        Called when serializing of the queryset ends.
        Nr	   )r   r	   r	   r
   r@   m   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)rD   )r   rB   r	   r	   r
   r8   s   s    zSerializer.start_objectc             C   s   d S)z<
        Called when serializing of an object ends.
        Nr	   )r   rB   r	   r	   r
   r?   y   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 an handle_field() methodN)rD   )r   rB   rC   r	   r	   r
   r<      s    zSerializer.handle_fieldc             C   s   t  d   d S)z6
        Called to handle a ForeignKey field.
        zAsubclasses of Serializer must provide an handle_fk_field() methodN)rD   )r   rB   rC   r	   r	   r
   r=      s    zSerializer.handle_fk_fieldc             C   s   t  d   d S)z5
        Called to handle a ManyToManyField.
        zBsubclasses of Serializer must provide an handle_m2m_field() methodN)rD   )r   rB   rC   r	   r	   r
   r>      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).
        rA   N)callablegetattrr*   rA   )r   r	   r	   r
   rA      s    zSerializer.getvalueN)r   r   r   r   Zinternal_use_onlyr   r4   r;   r5   r@   r8   r?   r<   r=   r>   rA   r	   r	   r	   r
   r)   5   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   s=   | |  _  t | t j  r0 t j |  |  _ n	 | |  _ d S)zA
        Init this serializer given a stream or a string
        N)r1   
isinstancer   string_typesr3   r*   )r   Zstream_or_stringr1   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)z8Iteration iterface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodN)rD   )r   r	   r	   r
   __next__   s    zDeserializer.__next__N)r   r   r   r   r   rJ   rK   r	   r	   r	   r
   rG      s   
rG   c               @   sC   e  Z d  Z d Z d d d  Z d d   Z d 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)r   rB   rN   r	   r	   r
   r      s    	zDeserializedObject.__init__c             C   s   d |  j  j j |  j  j f S)Nz<DeserializedObject: %s(pk=%s)>)rM   r9   labelpk)r   r	   r	   r
   __repr__   s    zDeserializedObject.__repr__Tc             K   sz   t  j j |  j d | d d | |  j rm | rm x9 |  j j   D]% \ } } t |  j |  j |  qA Wn  d  |  _ d  S)NusingrawT)r   ModelZ	save_baserM   rN   itemsrF   set)r   Zsave_m2mrR   kwargsZaccessor_nameZobject_listr	   r	   r
   save   s
    " zDeserializedObject.save)r   r   r   r   r   rQ   rX   r	   r	   r	   r
   rL      s   
rL   c             C   s   |  |   } | j  d k r t |  d  r t |  j d  r | j   } y% |  j j |  j |   j  | _  Wq |  j k
 r Yq Xn  | 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natural_keyget_by_natural_key)rP   hasattrZ_default_managerrY   Z
db_managerrZ   ZDoesNotExist)rT   datadbrB   rY   r	   r	   r
   build_instance   s    %r^   N)r   Z	django.dbr   Zdjango.utilsr   KeyErrorr   	Exceptionr   r   rM   r   r)   IteratorrG   rL   r^   r	   r	   r	   r
   <module>   s   e"