
v^A                 @   sR  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 d d l m Z d d	 l m Z m Z d d
 l m Z m Z Gd d   d e j  Z Gd d   d e j  Z d d   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 d S)z
XML serializer.
    )pulldom)handler)ExpatParser)apps)settings)ObjectDoesNotExist)base)DEFAULT_DB_ALIASmodels)SimplerXMLGeneratorUnserializableContentErrorc               @   s   e  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)
SerializerzSerialize a QuerySet to XML.c             C   sD   |  j  j d  d  k	 r@ |  j j d d |  j  j d  |  d  S)Nindent
 )optionsgetxmlignorableWhitespace)selflevel r   H/tmp/pip-build-8lau8j11/django/django/core/serializers/xml_serializer.pyr      s    zSerializer.indentc             C   sQ   t  |  j |  j j d t j   |  _ |  j j   |  j j d d d i  d S)zT
        Start serialization -- open the XML document and the root element.
        encodingzdjango-objectsversionz1.0N)	r   streamr   r   r   DEFAULT_CHARSETr   startDocumentstartElement)r   r   r   r   start_serialization   s    'zSerializer.start_serializationc             C   s.   |  j  d  |  j j d  |  j j   d S)z8
        End serialization -- end the document.
        r   zdjango-objectsN)r   r   
endElementendDocument)r   r   r   r   end_serialization"   s    zSerializer.end_serializationc             C   s   t  | d  s( t j d t |    |  j d  d t | j  i } |  j sd t  | d  r | j } | d k	 r t |  | d <|  j	 j
 d |  d S)	z3
        Called as each object is handled.
        _metaz6Non-model object (%s) encountered during serialization   modelnatural_keyNpkobject)hasattrr   ZSerializationErrortyper   strr#   Zuse_natural_primary_keysr'   r   r   )r   objattrsobj_pkr   r   r   start_object*   s    	zSerializer.start_objectc             C   s!   |  j  d  |  j j d  d S)zA
        Called after handling all fields for an object.
        r$   r(   N)r   r   r    )r   r,   r   r   r   
end_object:   s    zSerializer.end_objectc             C   s   |  j  d  |  j j d d | j d | j   i  t | | j  d k	 r y |  j j | j |   Wq t k
 r t	 d | j
 j | j | j f   Yq Xn |  j j d  |  j j d  d S)zg
        Handle each field on an object (except for ForeignKeys and
        ManyToManyFields).
           fieldnamer*   Nz0%s.%s (pk:%s) contains unserializable charactersNone)r   r   r   r3   Zget_internal_typegetattr
charactersZvalue_to_stringr   
ValueError	__class____name__r'   addQuickElementr    )r   r,   r2   r   r   r   handle_fieldA   s    	'zSerializer.handle_fieldc             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)zq
        Handle a ForeignKey (they need to be treated slightly
        differently from regular fields).
        Nr&   naturalr4   r2   )_start_relational_fieldr5   Zget_attnameuse_natural_foreign_keysr)   remote_fieldr%   r3   r&   r   r   r6   r+   r    r:   )r   r,   r2   Zrelated_attrelated	key_valuer   r   r   handle_fk_fieldX   s    zSerializer.handle_fk_fieldc                s   | j  j j j r   j |    j rR t | j  j d  rR   f d d   } n   f d d   } x* t | | j	  j
   D] } | |  q} W  j j d  d S)z
        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   r6   r+   r    )valuer<   rA   )r   r   r   
handle_m2my   s    z/Serializer.handle_m2m_field.<locals>.handle_m2mc                s)     j  j d d d t |  j  i d  S)Nr(   r-   r'   )r   r:   r+   r'   )rC   )r   r   r   rD      s    r2   N)r?   Zthroughr#   Zauto_createdr=   r>   r)   r%   r5   r3   iteratorr   r    )r   r,   r2   rD   Zrelobjr   )r   r   handle_m2m_fieldo   s    
zSerializer.handle_m2m_fieldc          	   C   sQ   |  j  d  |  j j d d | j d | j j j d t | j j j	  i  d S)z1Output the <field> element for relational fields.r1   r2   r3   reltoN)
r   r   r   r3   r?   r8   r9   r+   r%   r#   )r   r2   r   r   r   r=      s
    	z"Serializer._start_relational_fieldN)r9   
__module____qualname____doc__r   r   r"   r/   r0   r;   rB   rF   r=   r   r   r   r   r      s   r   c                   s|   e  Z d  Z d Z d e d d   f d d  Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z   S)DeserializerzDeserialize XML.usingignorenonexistentFc               s\   t    j | |  | j d d  |  _ t j |  j |  j    |  _ | |  _	 | |  _
 d  S)Nhandle_forward_referencesF)super__init__poprO   r   parser   _make_parserevent_streamdbignore)r   Zstream_or_stringrM   rN   r   )r8   r   r   rQ      s
    	zDeserializer.__init__c             C   s   t    S)z;Create a hardened XML parser (no custom/external entities).)DefusedExpatParser)r   r   r   r   rT      s    zDeserializer._make_parserc             C   s\   xO |  j  D]D \ } } | d k r
 | j d k r
 |  j  j |  |  j |  Sq
 Wt  d  S)NZSTART_ELEMENTr(   )rU   nodeNameZ
expandNode_handle_objectStopIteration)r   eventnoder   r   r   __next__   s
    zDeserializer.__next__c             C   s1  |  j  | d  } i  } | j d  rR | j j j | j d   | | j j j <i  } i  } d d   | j j   D } x| j d  D]x} | j d  } | s t	 j
 d   |  j r | | k r q | j j |  }	 |	 j rPt |	 j t j  rP|  j | |	  }
 |
 t	 j k r@d d	   | j d
  D | |	 <q|
 | |	 j <q |	 j rt |	 j t j  r|  j | |	  }
 |
 t	 j k rd d	   | j d  D | |	 <q|
 | |	 j <q | j d  rd }
 n |	 j t |  j    }
 |
 | |	 j <q Wt	 j | | |  j  } t	 j | | |  S)z1Convert an <object> node to a DeserializedObject.r%   r'   c             S   s   h  |  ] } | j   q Sr   )r3   ).0fr   r   r   	<setcomp>   s   	 z.Deserializer._handle_object.<locals>.<setcomp>r2   r3   z,<field> node is missing the 'name' attributec             S   s,   g  |  ]" } d  d   | j  d  D  q S)c             S   s"   g  |  ] } t  |  j    q Sr   )getInnerTextstrip)r_   Znat_noder   r   r   
<listcomp>   s   	z:Deserializer._handle_object.<locals>.<listcomp>.<listcomp>r<   )getElementsByTagName)r_   Zobj_noder   r   r   rd      s   	z/Deserializer._handle_object.<locals>.<listcomp>r(   c             S   s"   g  |  ] } t  |  j    q Sr   )rb   rc   )r_   kr   r   r   rd      s   	r<   r4   N)_get_model_from_nodeZhasAttributer#   r'   	to_pythongetAttributeZattnameZ
get_fieldsre   r   DeserializationErrorrW   	get_fieldr?   
isinstancer
   ZManyToManyRel_handle_m2m_field_nodeDEFER_FIELDr3   ZManyToOneRel_handle_fk_field_noderb   rc   Zbuild_instancerV   ZDeserializedObject)r   r]   ZModeldataZm2m_dataZdeferred_fieldsfield_namesZ
field_node
field_namer2   rC   r,   r   r   r   rZ      sB    			zDeserializer._handle_objectc             C   sE  | j  d  r d S| j j } t | j d  r| j  d  } | r d d   | D } y" | j j |  j  j |   } Wn% t k
 r |  j	 r t
 j S  Yn Xt | | j j  } | j j j j j r| j } n3 t |  j   } | j j | j j  j |  } | St |  j   } | j j | j j  j |  Sd S)z8
        Handle a <field> node for a ForeignKey
        r4   Nget_by_natural_keyr<   c             S   s"   g  |  ] } t  |  j    q Sr   )rb   rc   )r_   rf   r   r   r   rd      s   	 z6Deserializer._handle_fk_field_node.<locals>.<listcomp>)re   r?   r%   r)   _default_manager
db_managerrV   rs   r   rO   r   rn   r5   rr   r#   r'   rb   rc   rk   rh   )r   r]   r2   r%   keysfield_valuer,   r.   r   r   r   ro      s*    "	!z"Deserializer._handle_fk_field_nodec                s   | j  j   j   t   d  r?     f d d   } n  f d d   } g  } y1 x* | j d  D] } | j | |   qj WWnV t k
 r } z6 t | t  r  j	 r t
 j St
 j | |   WYd d } ~ Xn X| Sd S)z>
        Handle a <field> node for a ManyToManyField.
        rs   c                sk   |  j  d  } | rI d d   | D }   j  j  j |   j } n  j j j |  j d   } | S)Nr<   c             S   s"   g  |  ] } t  |  j    q Sr   )rb   rc   )r_   rf   r   r   r   rd     s   	 zLDeserializer._handle_m2m_field_node.<locals>.m2m_convert.<locals>.<listcomp>r'   )re   ru   rV   rs   r'   r#   rh   ri   )nrv   rw   r.   )default_managerr%   r   r   r   m2m_convert  s    !z8Deserializer._handle_m2m_field_node.<locals>.m2m_convertc                s     j  j j |  j d   S)Nr'   )r#   r'   rh   ri   )rx   )r%   r   r   rz   #  s    r(   N)r?   r%   rt   r)   re   append	Exceptionrl   r   rO   r   rn   ZM2MDeserializationError)r   r]   r2   rz   valuescer   )ry   r%   r   r   rm     s    	%z#Deserializer._handle_m2m_field_nodec             C   s}   | j  |  } | s1 t j d | j | f   y t j |  SWn4 t t f k
 rx t j d | j | f   Yn Xd S)ze
        Look up a model from a <object model=...> or a <field rel=... to=...>
        node.
        z0<%s> node is missing the required '%s' attributez,<%s> node has invalid model identifier: '%s'N)ri   r   rj   rY   r   Z	get_modelLookupError	TypeError)r   r]   attrZmodel_identifierr   r   r   rg   1  s    z!Deserializer._get_model_from_node)r9   rI   rJ   rK   r	   rQ   rT   r^   rZ   ro   rm   rg   r   r   )r8   r   rL      s   C# rL   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)z3Get all the inner text of a DOM node (recursively). )

childNodesZnodeTypeZ	TEXT_NODEZCDATA_SECTION_NODEr{   rp   ZELEMENT_NODEextendrb   join)r]   Z
inner_textchildr   r   r   rb   C  s    $rb   c                   sd   e  Z d  Z d Z   f d d   Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z	   S)rX   zi
    An expat parser hardened against XML bomb attacks.

    Forbid DTDs, external entity references
    c                s=   t    j | |   |  j t j d  |  j t j d  d  S)NF)rP   rQ   
setFeaturer   feature_external_gesfeature_external_pes)r   argskwargs)r8   r   r   rQ   Z  s    zDefusedExpatParser.__init__c             C   s   t  | | |   d  S)N)DTDForbidden)r   r3   sysidpubidZhas_internal_subsetr   r   r   start_doctype_decl_  s    z%DefusedExpatParser.start_doctype_declc             C   s   t  | | | | | |   d  S)N)EntitiesForbidden)r   r3   Zis_parameter_entityrC   r   r   r   notation_namer   r   r   entity_declb  s    zDefusedExpatParser.entity_declc             C   s   t  | d  | | | |   d  S)N)r   )r   r3   r   r   r   r   r   r   r   unparsed_entity_declf  s    z'DefusedExpatParser.unparsed_entity_declc             C   s   t  | | | |   d  S)N)ExternalReferenceForbidden)r   contextr   r   r   r   r   r   external_entity_ref_handlerj  s    z.DefusedExpatParser.external_entity_ref_handlerc             C   sJ   t  j |   |  j } |  j | _ |  j | _ |  j | _ |  j	 | _
 d  S)N)_ExpatParserreset_parserr   ZStartDoctypeDeclHandlerr   ZEntityDeclHandlerr   ZUnparsedEntityDeclHandlerr   ZExternalEntityRefHandler)r   parserr   r   r   r   m  s    	zDefusedExpatParser.reset)
r9   rI   rJ   rK   rQ   r   r   r   r   r   r   r   )r8   r   rX   T  s   rX   c               @   s"   e  Z d  Z d Z d d   Z d S)DefusedXmlExceptionzBase exception.c             C   s
   t  |   S)N)r+   )r   r   r   r   __repr__x  s    zDefusedXmlException.__repr__N)r9   rI   rJ   rK   r   r   r   r   r   r   v  s   r   c                   s4   e  Z d  Z d Z   f d d   Z d d   Z   S)r   z&Document type definition is forbidden.c                s,   t    j   | |  _ | |  _ | |  _ d  S)N)rP   rQ   r3   r   r   )r   r3   r   r   )r8   r   r   rQ   ~  s    		zDTDForbidden.__init__c             C   s"   d } | j  |  j |  j |  j  S)Nz7DTDForbidden(name='{}', system_id={!r}, public_id={!r}))formatr3   r   r   )r   tplr   r   r   __str__  s    zDTDForbidden.__str__)r9   rI   rJ   rK   rQ   r   r   r   )r8   r   r   |  s   r   c                   s4   e  Z d  Z d Z   f d d   Z d d   Z   S)r   zEntity definition is forbidden.c                sG   t    j   | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S)N)rP   rQ   r3   rC   r   r   r   r   )r   r3   rC   r   r   r   r   )r8   r   r   rQ     s    					zEntitiesForbidden.__init__c             C   s"   d } | j  |  j |  j |  j  S)Nz<EntitiesForbidden(name='{}', system_id={!r}, public_id={!r}))r   r3   r   r   )r   r   r   r   r   r     s    zEntitiesForbidden.__str__)r9   rI   rJ   rK   rQ   r   r   r   )r8   r   r     s   	r   c                   s4   e  Z d  Z d Z   f d d   Z d d   Z   S)r   z-Resolving an external reference is forbidden.c                s5   t    j   | |  _ | |  _ | |  _ | |  _ d  S)N)rP   rQ   r   r   r   r   )r   r   r   r   r   )r8   r   r   rQ     s
    			z#ExternalReferenceForbidden.__init__c             C   s   d } | j  |  j |  j  S)Nz8ExternalReferenceForbidden(system_id='{}', public_id={}))r   r   r   )r   r   r   r   r   r     s    z"ExternalReferenceForbidden.__str__)r9   rI   rJ   rK   rQ   r   r   r   )r8   r   r     s   r   N)rK   xml.domr   Zxml.saxr   Zxml.sax.expatreaderr   r   Zdjango.appsr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.serializersr   Z	django.dbr	   r
   Zdjango.utils.xmlutilsr   r   r   rL   rb   rX   r7   r   r   r   r   r   r   r   r   <module>   s"   "