ó
I()Qc           @  sI  d  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 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 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   u   
XML serializer.
iÿÿÿÿ(   t   unicode_literals(   t   settings(   t   base(   t   modelst   DEFAULT_DB_ALIAS(   t   SimplerXMLGenerator(   t
   smart_text(   t   pulldom(   t   handler(   t   ExpatParsert
   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(
   u'   
    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(   Nu   indentu   
u    (   t   optionst   gett   Nonet   xmlt   ignorableWhitespace(   t   selft   level(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   indent   s    c         C  sR   t  |  j |  j j d t j ƒ ƒ |  _ |  j j ƒ  |  j j d i d d 6ƒ d S(   uT   
        Start serialization -- open the XML document and the root element.
        u   encodingu   django-objectsu   1.0u   versionN(	   R   t   streamR   R   R   t   DEFAULT_CHARSETR   t   startDocumentt   startElement(   R   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   start_serialization   s    'c         C  s.   |  j  d ƒ |  j j d ƒ |  j j ƒ  d S(   u8   
        End serialization -- end the document.
        i    u   django-objectsN(   R   R   t
   endElementt   endDocument(   R   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   end_serialization!   s    c         C  s©   t  | d ƒ s+ t j d t | ƒ ƒ ‚ n  |  j d ƒ | j ƒ  } | d k ri i t | j ƒ d 6} n) i t | j ƒ  ƒ d 6t | j ƒ d 6} |  j	 j
 d | ƒ d S(   u3   
        Called as each object is handled.
        u   _metau6   Non-model object (%s) encountered during serializationi   u   modelu   pku   objectN(   t   hasattrR   t   SerializationErrort   typeR   t   _get_pk_valR   R   t   _metaR   R   (   R   t   objt   obj_pkt   attrs(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   start_object)   s    c         C  s!   |  j  d ƒ |  j j d ƒ d S(   uA   
        Called after handling all fields for an object.
        i   u   objectN(   R   R   R   (   R   R    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt
   end_object<   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(   up   
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        i   u   fieldu   nameu   typeu   NoneN(   R   R   R   t   namet   get_internal_typet   getattrR   t
   characterst   value_to_stringt   addQuickElementR   (   R   R    t   field(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   handle_fieldC   s    
c         C  sô   |  j  | ƒ t | | j ƒ  ƒ } | d k	 rÐ |  j r· t | j j d ƒ r· t | | j ƒ } | j	 ƒ  } x` | D]? } |  j
 j d i  ƒ |  j
 j t | ƒ ƒ |  j
 j d ƒ qq Wqà |  j
 j t | ƒ ƒ n |  j
 j d ƒ |  j
 j d ƒ d S(   uy   
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        u   natural_keyu   naturalu   Noneu   fieldN(   t   _start_relational_fieldR'   t   get_attnameR   t   use_natural_keysR   t   relt   toR%   t   natural_keyR   R   R(   R   R   R*   (   R   R    R+   t   related_attt   relatedt	   key_value(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   handle_fk_fieldV   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(   uÆ   
        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).
        u   natural_keyc           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(   Nu   objectu   natural(   R2   R   R   R(   R   R   (   t   valuet   naturalR5   (   R   (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt
   handle_m2mw   s    c           s-   ˆ  j  j d d i t |  j ƒ  ƒ d 6ƒd  S(   Nu   objectR"   u   pk(   R   R*   R   R   (   R7   (   R   (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR9      s    u   fieldN(   R0   t   throughR   t   auto_createdR-   R/   R   R1   R'   R%   t   iteratorR   R   (   R   R    R+   R9   t   relobj(    (   R   s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   handle_m2m_fieldm   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(   uL   
        Helper to output the <field> element for relational fields
        i   u   fieldu   nameu   relu   toN(
   R   R   R   R%   R0   t	   __class__t   __name__R   R1   R   (   R   R+   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR-   Š   s
    
(   R@   t
   __module__t   __doc__R   R   R   R#   R$   R,   R6   R>   R-   (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR
      s   								t   Deserializerc           B  sM   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   u   
    Deserialize XML.
    c         K  sP   t  t |  ƒ j | |  t j |  j |  j ƒ  ƒ |  _ | j d t	 ƒ |  _
 d  S(   Nu   using(   t   superRC   t   __init__R   t   parseR   t   _make_parsert   event_streamt   popR   t   db(   R   t   stream_or_stringR   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRE   š   s    c         C  s   t  ƒ  S(   u;   Create a hardened XML parser (no custom/external entities).(   t   DefusedExpatParser(   R   (    (    s?   ../Django//lib/python/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(   Nu   START_ELEMENTu   object(   RH   t   nodeNamet
   expandNodet   _handle_objectt   StopIteration(   R   t   eventt   node(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   __next__£   s
    c   
      C  s  |  j  | d ƒ } | j d ƒ r3 | j d ƒ } n d } 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(   uC   
        Convert an <object> node to a DeserializedObject.
        u   modelu   pku   fieldu   nameu,   <field> node is missing the 'name' attributeu   NoneN(   t   _get_model_from_nodet   hasAttributet   getAttributeR   R   t   pkt	   to_pythont   attnamet   getElementsByTagNameR   t   DeserializationErrort	   get_fieldR0   t
   isinstanceR   t   ManyToManyRelt   _handle_m2m_field_nodeR%   t   ManyToOneRelt   _handle_fk_field_nodet   getInnerTextt   stript   DeserializedObject(
   R   RR   t   ModelRW   t   datat   m2m_datat
   field_nodet
   field_nameR+   R7   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRO   ª   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(   u8   
        Handle a <field> node for a ForeignKey
        u   Noneu   get_by_natural_keyu   naturalN(   RZ   R   R   R0   R1   t   _default_managerRb   Rc   t
   db_managerRJ   t   get_by_natural_keyR'   Ri   R   RW   R\   RX   (   R   RR   R+   t   keyst   kt   field_valueR    R!   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRa   Û   s    %$'c           sb   t  ˆ j j j d ƒ r- ‡ ‡  f d †  } n ‡ f d †  } g  | j d ƒ D] } | | ƒ ^ qL S(   u>   
        Handle a <field> node for a ManyToManyField.
        u   get_by_natural_keyc           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(   Nu   naturalu   pk(   RZ   Rb   Rc   R0   R1   Rj   Rk   RJ   Rl   RW   R   RX   RV   (   t   nRm   Rn   Ro   R!   (   R+   R   (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   m2m_convertü   s    %*$c           s"   ˆ  j  j j j j |  j d ƒ ƒ S(   Nu   pk(   R0   R1   R   RW   RX   RV   (   Rp   (   R+   (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   <lambda>  s    u   object(   R   R0   R1   Rj   RZ   (   R   RR   R+   Rq   t   c(    (   R   R+   s?   ../Django//lib/python/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(   uo   
        Helper to look up a model from a <object model=...> or a <field
        rel=... to=...> node.
        u0   <%s> node is missing the required '%s' attributeu   .u,   <%s> node has invalid model identifier: '%s'N(	   RV   R   R[   RM   R   t	   get_modelt   splitt	   TypeErrorR   (   R   RR   t   attrt   model_identifierRe   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRT   
  s    
(
   R@   RA   RB   RE   RG   RS   RO   Ra   R_   RT   (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRC   •   s   				1		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(   u=   
    Get all the inner text of a DOM node (recursively).
    u    (
   t
   childNodest   nodeTypet	   TEXT_NODEt   CDATA_SECTION_NODEt   appendRf   t   ELEMENT_NODEt   extendRb   t   join(   RR   t
   inner_textt   child(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRb     s    $RL   c           B  sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   uk   
    An expat parser hardened against XML bomb attacks.

    Forbids DTDs, external entity references

    c         O  s=   t  j |  | | Ž |  j t j t ƒ |  j t j t ƒ d  S(   N(   t   _ExpatParserRE   t
   setFeatureR   t   feature_external_gest   Falset   feature_external_pes(   R   t   argst   kwargs(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRE   9  s    c         C  s   t  | | | ƒ ‚ d  S(   N(   t   DTDForbidden(   R   R%   t   sysidt   pubidt   has_internal_subset(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   start_doctype_decl>  s    c         C  s   t  | | | | | | ƒ ‚ d  S(   N(   t   EntitiesForbidden(   R   R%   t   is_parameter_entityR7   R   R‹   RŒ   t   notation_name(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   entity_declA  s    c         C  s   t  | d  | | | | ƒ ‚ d  S(   N(   R   R   (   R   R%   R   R‹   RŒ   R‘   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   unparsed_entity_declE  s    c         C  s   t  | | | | ƒ ‚ d  S(   N(   t   ExternalReferenceForbidden(   R   t   contextR   R‹   RŒ   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   external_entity_ref_handlerI  s    c         C  sJ   t  j |  ƒ |  j } |  j | _ |  j | _ |  j | _ |  j	 | _
 d  S(   N(   Rƒ   t   resett   _parserRŽ   t   StartDoctypeDeclHandlerR’   t   EntityDeclHandlerR“   t   UnparsedEntityDeclHandlerR–   t   ExternalEntityRefHandler(   R   t   parser(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR—   L  s    	(	   R@   RA   RB   RE   RŽ   R’   R“   R–   R—   (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRL   2  s   					t   DefusedXmlExceptionc           B  s   e  Z d  Z d „  Z RS(   u   Base exception.c         C  s
   t  |  ƒ S(   N(   t   str(   R   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   __repr__W  s    (   R@   RA   RB   R    (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRž   U  s   RŠ   c           B  s    e  Z d  Z d „  Z d „  Z RS(   u&   Document type definition is forbidden.c         C  s2   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ d  S(   N(   RD   RŠ   RE   R%   R‹   RŒ   (   R   R%   R‹   RŒ   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRE   ]  s    		c         C  s"   d } | j  |  j |  j |  j ƒ S(   Nu7   DTDForbidden(name='{}', system_id={!r}, public_id={!r})(   t   formatR%   R‹   RŒ   (   R   t   tpl(    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   __str__c  s    (   R@   RA   RB   RE   R£   (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRŠ   [  s   	R   c           B  s    e  Z d  Z d „  Z d „  Z RS(   u   Entity definition is forbidden.c         C  sM   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(	   RD   R   RE   R%   R7   R   R‹   RŒ   R‘   (   R   R%   R7   R   R‹   RŒ   R‘   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRE   j  s    					c         C  s"   d } | j  |  j |  j |  j ƒ S(   Nu<   EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})(   R¡   R%   R‹   RŒ   (   R   R¢   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR£   s  s    (   R@   RA   RB   RE   R£   (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR   h  s   		R”   c           B  s    e  Z d  Z d „  Z d „  Z RS(   u-   Resolving an external reference is forbidden.c         C  s;   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ | |  _ d  S(   N(   RD   R”   RE   R•   R   R‹   RŒ   (   R   R•   R   R‹   RŒ   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyRE   z  s
    			c         C  s   d } | j  |  j |  j ƒ S(   Nu8   ExternalReferenceForbidden(system_id='{}', public_id={})(   R¡   R‹   RŒ   (   R   R¢   (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR£     s    (   R@   RA   RB   RE   R£   (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyR”   x  s   	N(   RB   t
   __future__R    t   django.confR   t   django.core.serializersR   t	   django.dbR   R   t   django.utils.xmlutilsR   t   django.utils.encodingR   t   xml.domR   t   xml.saxR   t   xml.sax.expatreaderR	   Rƒ   R
   RC   Rb   RL   t
   ValueErrorRž   RŠ   R   R”   (    (    (    s?   ../Django//lib/python/django/core/serializers/xml_serializer.pyt   <module>   s"   …Š	#