ó
TR¹Nc           @   s«   d  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 d d l m Z d e j f d	 „  ƒ  YZ d
 e j f d „  ƒ  YZ d „  Z d S(   s   
XML serializer.
iÿÿÿÿ(   t   settings(   t   base(   t   modelst   DEFAULT_DB_ALIAS(   t   SimplerXMLGenerator(   t   smart_unicode(   t   pulldomt
   Serializerc           B   s_   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z RS(
   s'   
    Serializes a QuerySet to XML.
    c         C   sM   |  j  j d d  ƒ d  k	 rI |  j j d d |  j  j d d  ƒ | ƒ n  d  S(   Nt   indents   
t    (   t   optionst   gett   Nonet   xmlt   ignorableWhitespace(   t   selft   level(    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyR      s    c         C   sR   t  |  j |  j j d t j ƒ ƒ |  _ |  j j ƒ  |  j j d i d d 6ƒ d S(   sT   
        Start serialization -- open the XML document and the root element.
        t   encodings   django-objectss   1.0t   versionN(	   R   t   streamR
   R   R    t   DEFAULT_CHARSETR   t   startDocumentt   startElement(   R   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   start_serialization   s    'c         C   s.   |  j  d ƒ |  j j d ƒ |  j j ƒ  d S(   s8   
        End serialization -- end the document.
        i    s   django-objectsN(   R   R   t
   endElementt   endDocument(   R   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   end_serialization   s    c         C   sr   t  | d ƒ s+ t j d t | ƒ ƒ ‚ n  |  j d ƒ |  j j d i t | j ƒ  ƒ d 6t | j	 ƒ d 6ƒ d S(   s3   
        Called as each object is handled.
        t   _metas6   Non-model object (%s) encountered during serializationi   t   objectt   pkt   modelN(
   t   hasattrR   t   SerializationErrort   typeR   R   R   R   t   _get_pk_valR   (   R   t   obj(    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   start_object%   s    c         C   s!   |  j  d ƒ |  j j d ƒ d S(   sA   
        Called after handling all fields for an object.
        i   R   N(   R   R   R   (   R   R#   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt
   end_object2   s    c         C   s   |  j  d ƒ |  j j d i | j d 6| j ƒ  d 6ƒ t | | j ƒ d k	 rk |  j j | j | ƒ ƒ n |  j j	 d ƒ |  j j
 d ƒ d S(   sp   
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        i   t   fieldt   nameR!   R   N(   R   R   R   R'   t   get_internal_typet   getattrR   t
   characterst   value_to_stringt   addQuickElementR   (   R   R#   R&   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   handle_field9   s    
c         C   s  |  j  | ƒ t | | j ƒ } | d k	 rô |  j rœ t | d ƒ rœ | j ƒ  } xŸ | D]? } |  j j d i  ƒ |  j j	 t
 | ƒ ƒ |  j j d ƒ qV Wq| j j | j j j k rÆ | j ƒ  } n t | | j j ƒ } |  j j	 t
 | ƒ ƒ n |  j j d ƒ |  j j d ƒ d S(   sy   
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        t   natural_keyt   naturalR   R&   N(   t   _start_relational_fieldR)   R'   R   t   use_natural_keysR   R.   R   R   R*   R   R   t   relt
   field_nameR   R   R"   R,   (   R   R#   R&   t   relatedt	   key_value(    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   handle_fk_fieldL   s    c            s¢   | j  j j j rž ˆ  j | ƒ ˆ  j rO t | j  j d ƒ rO ‡  f d †  } n ‡  f d †  } x* t | | j	 ƒ j
 ƒ  D] } | | ƒ qw Wˆ  j j d ƒ n  d S(   sÆ   
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        R.   c            s}   |  j  ƒ  } ˆ  j j d i  ƒ xG | D]? } ˆ  j j d i  ƒ ˆ  j j t | ƒ ƒ ˆ  j j d ƒ q& Wˆ  j j d ƒ d  S(   NR   R/   (   R.   R   R   R*   R   R   (   t   valueR/   R5   (   R   (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt
   handle_m2mr   s    c            s-   ˆ  j  j d d i t |  j ƒ  ƒ d 6ƒd  S(   NR   t   attrsR   (   R   R,   R   R"   (   R7   (   R   (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyR8   |   s    R&   N(   R2   t   throughR   t   auto_createdR0   R1   R   t   toR)   R'   t   iteratorR   R   (   R   R#   R&   R8   t   relobj(    (   R   sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   handle_m2m_fieldh   s    
c         C   sT   |  j  d ƒ |  j j d i | j d 6| j j j d 6t | j j j	 ƒ d 6ƒ d S(   sL   
        Helper to output the <field> element for relational fields
        i   R&   R'   R2   R<   N(
   R   R   R   R'   R2   t	   __class__t   __name__R   R<   R   (   R   R&   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyR0   …   s
    
(   RA   t
   __module__t   __doc__R   R   R   R$   R%   R-   R6   R?   R0   (    (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyR      s   								t   Deserializerc           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s   
    Deserialize XML.
    c         K   sG   t  t |  ƒ j | |  t j |  j ƒ |  _ | j d t ƒ |  _	 d  S(   Nt   using(
   t   superRD   t   __init__R   t   parseR   t   event_streamt   popR   t   db(   R   t   stream_or_stringR
   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyRG   •   s    c         C   s\   xO |  j  D]D \ } } | d k r
 | j d k r
 |  j  j | ƒ |  j | ƒ Sq
 Wt ‚ d  S(   Nt   START_ELEMENTR   (   RI   t   nodeNamet
   expandNodet   _handle_objectt   StopIteration(   R   t   eventt   node(    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   nextš   s
    c   
      C   s  |  j  | d ƒ } | j d ƒ } | s9 t j d ƒ ‚ n  i | j j j | ƒ | j j j 6} i  } x| j d ƒ D]ó } | j d ƒ } | s¡ t j d ƒ ‚ n  | j j	 | ƒ } | j
 rí t | j
 t j ƒ rí |  j | | ƒ | | j <qt | j
 r't | j
 t j ƒ r'|  j | | ƒ | | j <qt | j d ƒ r?d }	 n | j t | ƒ j ƒ  ƒ }	 |	 | | j <qt Wt j | |   | ƒ S(	   sC   
        Convert an <object> node to a DeserializedObject.
        R   R   s+   <object> node is missing the 'pk' attributeR&   R'   s,   <field> node is missing the 'name' attributeR   N(   t   _get_model_from_nodet   getAttributeR   t   DeserializationErrorR   R   t	   to_pythont   attnamet   getElementsByTagNamet	   get_fieldR2   t
   isinstanceR   t   ManyToManyRelt   _handle_m2m_field_nodeR'   t   ManyToOneRelt   _handle_fk_field_nodeR   t   getInnerTextt   stript   DeserializedObject(
   R   RS   t   ModelR   t   datat   m2m_datat
   field_nodeR3   R&   R7   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyRP   ¡   s(    %	c         C   s:  | j  d ƒ r d St | j j j d ƒ rÿ | j  d ƒ } | rÂ g  | D] } t | ƒ j ƒ  ^ qG } | j j j j |  j	 ƒ j
 | Œ  } t | | j j ƒ } | j j j j j rû | j } qû n9 t | ƒ j ƒ  } | j j j j | j j ƒ j | ƒ } | St | ƒ j ƒ  } | j j j j | j j ƒ j | ƒ Sd S(   s8   
        Handle a <field> node for a ForeignKey
        R   t   get_by_natural_keyR/   N(   RZ   R   R   R2   R<   t   _default_managerRa   Rb   t
   db_managerRK   Rh   R)   R3   R   R   R[   RX   (   R   RS   R&   t   keyst   kt   field_valueR#   t   obj_pk(    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyR`   Ñ   s    %$'c            sb   t  ˆ j j j d ƒ r- ‡ ‡  f d †  } n ‡ f d †  } g  | j d ƒ D] } | | ƒ ^ qL S(   s>   
        Handle a <field> node for a ManyToManyField.
        Rh   c            sŒ   |  j  d ƒ } | rd g  | D] } t | ƒ j ƒ  ^ q } ˆ  j j j j ˆ j ƒ j | Œ  j	 } n$ ˆ  j j j
 j	 j |  j d ƒ ƒ } | S(   NR/   R   (   RZ   Ra   Rb   R2   R<   Ri   Rj   RK   Rh   R   R   RX   RV   (   t   nRk   Rl   Rm   Rn   (   R&   R   (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   m2m_convertò   s    %*$c            s"   ˆ  j  j j j j |  j d ƒ ƒ S(   NR   (   R2   R<   R   R   RX   RV   (   Ro   (   R&   (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   <lambda>ý   s    R   (   R   R2   R<   Ri   RZ   (   R   RS   R&   Rp   t   c(    (   R   R&   sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyR^   í   s    c         C   s™   | j  | ƒ } | s4 t j d | j | f ƒ ‚ n  y t j | j d ƒ Œ  } Wn t k
 ri d } n X| d k r• t j d | j | f ƒ ‚ n  | S(   so   
        Helper to look up a model from a <object model=...> or a <field
        rel=... to=...> node.
        s0   <%s> node is missing the required '%s' attributet   .s,   <%s> node has invalid model identifier: '%s'N(	   RV   R   RW   RN   R   t	   get_modelt   splitt	   TypeErrorR   (   R   RS   t   attrt   model_identifierRd   (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyRU      s    
(	   RA   RB   RC   RG   RT   RP   R`   R^   RU   (    (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyRD      s   			0		c         C   s†   g  } xp |  j  D]e } | j | j k s: | j | j k rM | j | j ƒ q | j | j k r | j t | ƒ ƒ q q Wd j	 | ƒ S(   s=   
    Get all the inner text of a DOM node (recursively).
    u    (
   t
   childNodest   nodeTypet	   TEXT_NODEt   CDATA_SECTION_NODEt   appendRe   t   ELEMENT_NODEt   extendRa   t   join(   RS   t
   inner_textt   child(    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyRa     s    $N(   RC   t   django.confR    t   django.core.serializersR   t	   django.dbR   R   t   django.utils.xmlutilsR   t   django.utils.encodingR   t   xml.domR   R   RD   Ra   (    (    (    sS   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/xml_serializer.pyt   <module>   s   „…