
 X                 @   s   d  Z  d d l m Z d d l m Z d d l m Z d d l m Z d d l	 m
 Z
 d d l m Z m Z d d l m Z d d	 l m Z m Z Gd
 d   d e
 j  Z d d   Z d d   Z d S)z
A Python "serializer". Doesn't do much serializing per se -- just converts to
and from basic Python data types (lists, dicts, strings, etc.). Useful as a basis for
other serializers.
    )unicode_literals)OrderedDict)apps)settings)base)DEFAULT_DB_ALIASmodels)six)
force_textis_protected_typec               @   s   e  Z d  Z d Z 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 d   Z d S)
Serializerz8
    Serializes a QuerySet to basic Python objects.
    Tc             C   s   d  |  _  g  |  _ d  S)N)_currentobjects)self r   L/home/ubuntu/projects/ifolica/build/django/django/core/serializers/python.pystart_serialization   s    	zSerializer.start_serializationc             C   s   d  S)Nr   )r   r   r   r   end_serialization   s    zSerializer.end_serializationc             C   s   t    |  _ d  S)N)r   r   )r   objr   r   r   start_object    s    zSerializer.start_objectc             C   s&   |  j  j |  j |   d  |  _ d  S)N)r   appendget_dump_objectr   )r   r   r   r   r   
end_object#   s    zSerializer.end_objectc             C   sh   t  d t | j  f g  } |  j s8 t | d  rW t | j   d d | d <n  |  j | d <| S)Nmodelnatural_keystrings_onlyTpkfields)r   r
   _metaZuse_natural_primary_keyshasattr_get_pk_valr   )r   r   datar   r   r   r   '   s
    zSerializer.get_dump_objectc             C   sK   | j  |  } t |  r. | |  j | j <n | j |  |  j | j <d  S)N)Zvalue_from_objectr   r   namevalue_to_string)r   r   fieldvaluer   r   r   handle_field.   s    zSerializer.handle_fieldc             C   s   |  j  rN t | j j d  rN t | | j  } | rE | j   } q d  } n3 t | | j    } t |  s | j	 |  } n  | |  j
 | j <d  S)Nr   )use_natural_foreign_keysr   remote_fieldr   getattrr"   r   Zget_attnamer   r#   r   )r   r   r$   relatedr%   r   r   r   handle_fk_field8   s    	zSerializer.handle_fk_fieldc                s   | j  j j j r |  j r? t | j  j d  r? d d     n d d       f d d   t | | j  j	   D |  j
 | j <n  d  S)Nr   c             S   s
   |  j    S)N)r   )r%   r   r   r   	m2m_valueH   s    z.Serializer.handle_m2m_field.<locals>.m2m_valuec             S   s   t  |  j   d d S)Nr   T)r
   r    )r%   r   r   r   r,   K   s    c                s   g  |  ] }   |   q Sr   r   ).0r*   )r,   r   r   
<listcomp>N   s   	 z/Serializer.handle_m2m_field.<locals>.<listcomp>)r(   Zthroughr   Zauto_createdr'   r   r   r)   r"   iteratorr   )r   r   r$   r   )r,   r   handle_m2m_fieldE   s
    zSerializer.handle_m2m_fieldc             C   s   |  j  S)N)r   )r   r   r   r   getvalueQ   s    zSerializer.getvalueN)__name__
__module____qualname____doc__Zinternal_use_onlyr   r   r   r   r   r&   r+   r0   r1   r   r   r   r   r      s   
r   c          )   +   s  | j  d t    | j  d d  } i  } x|  D]} y t | d  } Wn$ t j k
 rq | rj w1 n   Yn Xi  } d | k ry/ | j j j | j d   | | j j j	 <Wqt
 k
 r} z- t j j | | d | j d  d   WYd d } ~ XqXn  i  } | | k r;d d   | j j   D | | <n  | | }	 x[t j | d	  D]F\ }
 } | r}|
 |	 k r}qYn  t | t  rt | | j d
 t j  d d } n  | j j |
  } | j rt | j t j  r| j j  t  j d  r   f d d   } n  f d d   } y< g  | | j <x( | D]  } | | j j | |   qBWWqt
 k
 r} z- t j j | | d | j d  |   WYd d } ~ XqXqY| j r5t | j t j  r5| j j  | d k	 r%y  j } | j j }
 t | d  rt | d  rt | t j  r| j     j! |   } t" | | j j  }  j j j r| j } qn  j j |
  j |  } | | | j	 <n"  j j |
  j |  | | j	 <Wq2t
 k
 r!} z- t j j | | d | j d  |   WYd d } ~ Xq2Xqd | | j	 <qYy | j |  | | j <WqYt
 k
 r} z- t j j | | d | j d  |   WYd d } ~ XqYXqYWt j# | |    } t j$ | |  Vq1 Wd S)z
    Deserialize simple Python objects back into Django ORM instances.

    It's expected that you pass the Python objects themselves (instead of a
    stream or a string) to the constructor
    ZusingZignorenonexistentFr   r   Nc             S   s   h  |  ] } | j   q Sr   )r"   )r-   fr   r   r   	<setcomp>r   s   	 zDeserializer.<locals>.<setcomp>r   encodingr   Tget_by_natural_keyc                sa   t  |  d  r> t |  t j  r>  j j    j |    j St  j	 j j
 |   d d Sd  S)N__iter__r   T)r   
isinstancer	   	text_type_default_manager
db_managerr9   r   r
   r   	to_python)r%   )dbr   r   r   m2m_convert   s    "z!Deserializer.<locals>.m2m_convertc                s   t    j j j |   d d S)Nr   T)r
   r   r   r?   )v)r   r   r   rA      s    r:   )%popr   
_get_modelr   DeserializationErrorr   r   r?   getZattname	ExceptionZWithDataZ
get_fieldsr	   	iteritemsr;   strr
   r   DEFAULT_CHARSET	get_fieldr(   r   ZManyToManyRelr   r   r=   r"   r   ZManyToOneRel
field_namer<   r>   r9   r)   Zbuild_instanceZDeserializedObject)Zobject_listoptionsignoreZfield_names_cachedZModelr!   eZm2m_datafield_namesrL   Zfield_valuer$   rA   r   Zdefault_managerr   r%   r   )r@   r   r   DeserializerU   s|    />#
 $">	"&>?rR   c             C   sC   y t  j |   SWn+ t t f k
 r> t j d |    Yn Xd S)zJ
    Helper to look up a model from an "app_label.model_name" string.
    zInvalid model identifier: '%s'N)r   Z	get_modelLookupError	TypeErrorr   rE   )Zmodel_identifierr   r   r   rD      s    rD   N)r5   
__future__r   collectionsr   Zdjango.appsr   Zdjango.confr   Zdjango.core.serializersr   Z	django.dbr   r   Zdjango.utilsr	   Zdjango.utils.encodingr
   r   r   rR   rD   r   r   r   r   <module>   s   Cf