ó
®â0_c           @  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 d
 e
 j f d „  ƒ  YZ d „  Z d „  Z d S(   u¸   
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.
iÿÿÿÿ(   t   unicode_literals(   t   OrderedDict(   t   apps(   t   settings(   t   base(   t   DEFAULT_DB_ALIASt   models(   t   six(   t
   force_textt   is_protected_typet
   Serializerc           B  se   e  Z d  Z e Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d	 „  Z RS(
   u8   
    Serializes a QuerySet to basic Python objects.
    c         C  s   d  |  _ g  |  _ d  S(   N(   t   Nonet   _currentt   objects(   t   self(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   start_serialization   s    	c         C  s   d  S(   N(    (   R   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   end_serialization   s    c         C  s   t  ƒ  |  _ d  S(   N(   R   R   (   R   t   obj(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   start_object    s    c         C  s&   |  j  j |  j | ƒ ƒ d  |  _ d  S(   N(   R   t   appendt   get_dump_objectR   R   (   R   R   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt
   end_object#   s    c         C  sh   t  d t | j ƒ f g ƒ } |  j s8 t | d ƒ rW t | j ƒ  d t ƒ| d <n  |  j | d <| S(   Nu   modelu   natural_keyt   strings_onlyu   pku   fields(   R   R   t   _metat   use_natural_primary_keyst   hasattrt   _get_pk_valt   TrueR   (   R   R   t   data(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyR   '   s
    c         C  sK   | j  | ƒ } t | ƒ r. | |  j | j <n | j | ƒ |  j | j <d  S(   N(   t   value_from_objectR	   R   t   namet   value_to_string(   R   R   t   fieldt   value(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   handle_field.   s    c         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(   Nu   natural_key(   t   use_natural_foreign_keysR   t   remote_fieldt   modelt   getattrR   t   natural_keyR   t   get_attnameR	   R   R   (   R   R   R    t   relatedR!   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   handle_fk_field8   s    	c         C  s‡   | j  j j j rƒ |  j r< t | j  j d ƒ r< d „  } n	 d „  } g  t | | j ƒ j	 ƒ  D] } | | ƒ ^ q^ |  j
 | j <n  d  S(   Nu   natural_keyc         S  s
   |  j  ƒ  S(   N(   R'   (   R!   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt	   m2m_valueH   s    c         S  s   t  |  j ƒ  d t ƒS(   NR   (   R   R   R   (   R!   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyR+   K   s    (   R$   t   throughR   t   auto_createdR#   R   R%   R&   R   t   iteratorR   (   R   R   R    R+   R)   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   handle_m2m_fieldE   s
    	c         C  s   |  j  S(   N(   R   (   R   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   getvalueQ   s    (   t   __name__t
   __module__t   __doc__R   t   internal_use_onlyR   R   R   R   R   R"   R*   R/   R0   (    (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyR
      s   						
		c         +  s  | j  d t ƒ ‰  | j  d t ƒ } i  } xN|  D]F} y t | d ƒ } Wn# t j k
 rp | rj q1 qq ‚  n Xi  } d | k ró y/ | j j j | j	 d ƒ ƒ | | j j j
 <Wqó t k
 rï } t j j | | d | j	 d ƒ d ƒ ‚ qó Xn  i  } | | k r%d „  | j j ƒ  Dƒ | | <n  | | }	 xt j | d ƒ D]
\ }
 } | rg|
 |	 k rgqCn  t | t ƒ rt | | j	 d t j ƒ d t ƒ} n  | j j |
 ƒ } | j rŒt | j t j ƒ rŒ| j j ‰ t ˆ j d	 ƒ r ‡  ‡ f d
 †  } n ‡ f d †  } y< g  | | j <x( | D]  } | | j j | | ƒ ƒ q&WWqMt k
 rˆ} t j j | | d | j	 d ƒ | ƒ ‚ qMXqC| j rõt | j t j  ƒ rõ| j j ‰ | d k	 råyâ ˆ j } | j j! }
 t | d	 ƒ rt | d ƒ rVt | t j" ƒ rV| j# ˆ  ƒ j$ | Œ  } t% | | j j! ƒ } ˆ j j j rq| j } qqn ˆ j j |
 ƒ j | ƒ } | | | j
 <n" ˆ j j |
 ƒ j | ƒ | | j
 <Wqòt k
 rá} t j j | | d | j	 d ƒ | ƒ ‚ qòXqMd | | j
 <qCy | j | ƒ | | j <WqCt k
 rL} t j j | | d | j	 d ƒ | ƒ ‚ qCXqCWt j& | | ˆ  ƒ } t j' | | ƒ Vq1 Wd S(   uÃ   
    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
    u   usingu   ignorenonexistentu   modelu   pkc         S  s   h  |  ] } | j  ’ q S(    (   R   (   t   .0t   f(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pys	   <setcomp>r   s   	 u   fieldsu   encodingR   u   get_by_natural_keyc           sa   t  |  d ƒ r> t |  t j ƒ r> ˆ j j ˆ  ƒ j |  Œ  j St ˆ j	 j j
 |  ƒ d t ƒSd  S(   Nu   __iter__R   (   R   t
   isinstanceR   t	   text_typet   _default_managert
   db_managert   get_by_natural_keyt   pkR   R   t	   to_pythonR   (   R!   (   t   dbR%   (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   m2m_convert‡   s    "c           s   t  ˆ  j j j |  ƒ d t ƒS(   NR   (   R   R   R<   R=   R   (   t   v(   R%   (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyR?      s    u   __iter__N((   t   popR   t   Falset
   _get_modelR   t   DeserializationErrorR   R<   R=   t   gett   attnamet	   Exceptiont   WithDataR   t
   get_fieldsR   t	   iteritemsR7   t   strR   R   t   DEFAULT_CHARSETR   t	   get_fieldR$   R   t   ManyToManyRelR%   R   R9   R   R   t   ManyToOneRelt
   field_nameR8   R:   R;   R&   t   build_instancet   DeserializedObject(   t   object_listt   optionst   ignoret   field_names_cachet   dt   ModelR   t   et   m2m_datat   field_namesRP   t   field_valueR    R?   R<   t   default_managerR   R!   (    (   R>   R%   s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   DeserializerU   s|    // 
 $"/	"&/0c         C  sB   y t  j |  ƒ SWn* t t f k
 r= t j d |  ƒ ‚ n Xd S(   uJ   
    Helper to look up a model from an "app_label.model_name" string.
    u   Invalid model identifier: '%s'N(   R   t	   get_modelt   LookupErrort	   TypeErrorR   RD   (   t   model_identifier(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyRC   »   s    N(   R3   t
   __future__R    t   collectionsR   t   django.appsR   t   django.confR   t   django.core.serializersR   t	   django.dbR   R   t   django.utilsR   t   django.utils.encodingR   R	   R
   R^   RC   (    (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/python.pyt   <module>   s   C	f