
 X<                 @   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 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 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.
    )unicode_literals)OrderedDict)pulldom)handler)ExpatParser)apps)settings)base)DEFAULT_DB_ALIASmodels)
smart_text)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'
    Serializes a QuerySet to XML.
    c             C   sG   |  j  j d  d  k	 rC |  j j d d |  j  j d  |  n  d  S)Nindent
 )optionsgetxmlignorableWhitespace)selflevel r   T/home/ubuntu/projects/ifolica/build/django/django/core/serializers/xml_serializer.pyr      s    zSerializer.indentc             C   sR   t  |  j |  j j d t j   |  _ |  j j   |  j j d i d d 6 d S)zT
        Start serialization -- open the XML document and the root element.
        encodingzdjango-objectsz1.0versionN)	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 |    n  |  j d  t d t | j  f g  } |  j sp t  | d  r | j	   } | d k	 r t |  | d <q n  |  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   r   r   r%   Zuse_natural_primary_keys_get_pk_valr   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 t d | j f d | j   f g   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)zp
        Called to 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    r   r5   Zget_internal_typegetattr
charactersZvalue_to_stringr   
ValueError	__class____name__r-   addQuickElementr"   )r   r.   r4   r   r   r   handle_fieldF   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)zy
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        Nr(   naturalr6   r4   )_start_relational_fieldr7   Zget_attnameuse_natural_foreign_keysr+   remote_fieldr'   r5   r(   r   r    r8   r   r"   r<   )r   r.   r4   Zrelated_attrelated	key_valuer   r   r   handle_fk_field]   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  n  d S)z
        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    r8   r   r"   )valuer>   rC   )r   r   r   
handle_m2m~   s    z/Serializer.handle_m2m_field.<locals>.handle_m2mc                s-     j  j d d i t |  j    d 6d  S)Nr*   r/   r)   )r   r<   r   r-   )rE   )r   r   r   rF      s    r4   N)rA   Zthroughr%   Zauto_createdr?   r@   r+   r'   r7   r5   iteratorr   r"   )r   r.   r4   rF   Zrelobjr   )r   r   handle_m2m_fieldt   s    
zSerializer.handle_m2m_fieldc             C   s`   |  j  d  |  j j d t d | j f d | j j j f d t | j j	 j
  f g   d S)zL
        Helper to output the <field> element for relational fields
        r3   r4   r5   relZtoN)r   r   r    r   r5   rA   r:   r;   r   r'   r%   )r   r4   r   r   r   r?      s
    z"Serializer._start_relational_fieldN)r;   
__module____qualname____doc__r   r!   r$   r1   r2   r=   rD   rH   r?   r   r   r   r   r      s   r   c                   sp   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	 d d   Z
   S)Deserializerz
    Deserialize XML.
    c                se   t  t |   j | |  t j |  j |  j    |  _ | j d t	  |  _
 | j d d  |  _ d  S)NZusingZignorenonexistentF)superrM   __init__r   parser   _make_parserevent_streampopr
   dbignore)r   Zstream_or_stringr   )r:   r   r   rO      s    zDeserializer.__init__c             C   s   t    S)z;Create a hardened XML parser (no custom/external entities).)DefusedExpatParser)r   r   r   r   rQ      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*   )rR   nodeNameZ
expandNode_handle_objectStopIteration)r   eventnoder   r   r   __next__   s
    zDeserializer.__next__c             C   s  |  j  | d  } i  } | j d  rU | j j j | j d   | | j j j <n  i  } d d   | j j   D } x| j d  D]} | j d  } | s t	 j
 d   n  |  j r | | k r q n  | j j |  } | j rt | j t j  r|  j | |  | | j <q | j rUt | j t j  rU|  j | |  | | j <q | j d  rmd	 }	 n | j t |  j    }	 |	 | | j <q Wt	 j | | |  j  }
 t	 j |
 |  S)
zC
        Convert an <object> node to a DeserializedObject.
        r'   r)   c             S   s   h  |  ] } | j   q Sr   )r5   ).0fr   r   r   	<setcomp>   s   	 z.Deserializer._handle_object.<locals>.<setcomp>r4   r5   z,<field> node is missing the 'name' attributer6   N)_get_model_from_nodeZhasAttributer%   r)   	to_pythongetAttributeZattnameZ
get_fieldsgetElementsByTagNamer	   DeserializationErrorrU   	get_fieldrA   
isinstancer   ZManyToManyRel_handle_m2m_field_noder5   ZManyToOneRel_handle_fk_field_nodegetInnerTextstripZbuild_instancerT   ZDeserializedObject)r   r[   ZModeldataZm2m_datafield_namesZ
field_node
field_namer4   rE   r.   r   r   r   rX      s0    "	zDeserializer._handle_objectc             C   s  | j  d  r d S| j j } t | j d  r | j  d  } | r d d   | D } | j j |  j  j |   } t | | j j	  } | j j j
 j j r | j } q 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
        r6   Nget_by_natural_keyr>   c             S   s"   g  |  ] } t  |  j    q Sr   )ri   rj   )r]   kr   r   r   
<listcomp>   s   	 z6Deserializer._handle_fk_field_node.<locals>.<listcomp>)rc   rA   r'   r+   _default_manager
db_managerrT   rn   r7   rm   r%   r)   ri   rj   re   ra   )r   r[   r4   r'   keysfield_valuer.   r0   r   r   r   rh      s     !z"Deserializer._handle_fk_field_nodec                sq   | j  j   j   t   d  r?     f d d    n  f d d     f d d   | j d  D S)z>
        Handle a <field> node for a ManyToManyField.
        rn   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   )ri   rj   )r]   ro   r   r   r   rp     s   	 zLDeserializer._handle_m2m_field_node.<locals>.m2m_convert.<locals>.<listcomp>r)   )rc   rr   rT   rn   r)   r%   ra   rb   )nrs   rt   r0   )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)   ra   rb   )ru   )r'   r   r   rw     s    c                s   g  |  ] }   |   q Sr   r   )r]   c)rw   r   r   rp     s   	 z7Deserializer._handle_m2m_field_node.<locals>.<listcomp>r*   )rA   r'   rq   r+   rc   )r   r[   r4   r   )rv   rw   r'   r   r   rg     s    	z#Deserializer._handle_m2m_field_nodec             C   s   | j  |  } | s4 t j d | j | f   n  y t j |  SWn4 t t f k
 r{ t j d | j | f   Yn Xd S)zo
        Helper to 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)rb   r	   rd   rW   r   Z	get_modelLookupError	TypeError)r   r[   attrZmodel_identifierr   r   r   r`     s    z!Deserializer._get_model_from_node)r;   rJ   rK   rL   rO   rQ   r\   rX   rh   rg   r`   r   r   )r:   r   rM      s   3rM   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)z=
    Get all the inner text of a DOM node (recursively).
     )

childNodesZnodeTypeZ	TEXT_NODEZCDATA_SECTION_NODEappendrk   ZELEMENT_NODEextendri   join)r[   Z
inner_textchildr   r   r   ri   +  s    $ri   c               @   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 S)rV   zj
    An expat parser hardened against XML bomb attacks.

    Forbids DTDs, external entity references
    c             O   s=   t  j |  | |  |  j t j d  |  j t j d  d  S)NF)_ExpatParserrO   
setFeaturer   feature_external_gesfeature_external_pes)r   argskwargsr   r   r   rO   D  s    zDefusedExpatParser.__init__c             C   s   t  | | |   d  S)N)DTDForbidden)r   r5   sysidpubidZhas_internal_subsetr   r   r   start_doctype_declI  s    z%DefusedExpatParser.start_doctype_declc             C   s   t  | | | | | |   d  S)N)EntitiesForbidden)r   r5   Zis_parameter_entityrE   r	   r   r   notation_namer   r   r   entity_declL  s    zDefusedExpatParser.entity_declc             C   s   t  | d  | | | |   d  S)N)r   )r   r5   r	   r   r   r   r   r   r   unparsed_entity_declP  s    z'DefusedExpatParser.unparsed_entity_declc             C   s   t  | | | |   d  S)N)ExternalReferenceForbidden)r   contextr	   r   r   r   r   r   external_entity_ref_handlerT  s    z.DefusedExpatParser.external_entity_ref_handlerc             C   sJ   t  j |   |  j } |  j | _ |  j | _ |  j | _ |  j	 | _
 d  S)N)r   reset_parserr   ZStartDoctypeDeclHandlerr   ZEntityDeclHandlerr   ZUnparsedEntityDeclHandlerr   ZExternalEntityRefHandler)r   parserr   r   r   r   W  s    	zDefusedExpatParser.resetN)
r;   rJ   rK   rL   rO   r   r   r   r   r   r   r   r   r   rV   >  s   rV   c               @   s"   e  Z d  Z d Z d d   Z d S)DefusedXmlExceptionzBase exception.c             C   s
   t  |   S)N)str)r   r   r   r   __repr__b  s    zDefusedXmlException.__repr__N)r;   rJ   rK   rL   r   r   r   r   r   r   `  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                s2   t  t |   j   | |  _ | |  _ | |  _ d  S)N)rN   r   rO   r5   r   r   )r   r5   r   r   )r:   r   r   rO   h  s    		zDTDForbidden.__init__c             C   s"   d } | j  |  j |  j |  j  S)Nz7DTDForbidden(name='{}', system_id={!r}, public_id={!r}))formatr5   r   r   )r   tplr   r   r   __str__n  s    zDTDForbidden.__str__)r;   rJ   rK   rL   rO   r   r   r   )r:   r   r   f  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                sM   t  t |   j   | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S)N)	rN   r   rO   r5   rE   r	   r   r   r   )r   r5   rE   r	   r   r   r   )r:   r   r   rO   u  s    					zEntitiesForbidden.__init__c             C   s"   d } | j  |  j |  j |  j  S)Nz<EntitiesForbidden(name='{}', system_id={!r}, public_id={!r}))r   r5   r   r   )r   r   r   r   r   r   ~  s    zEntitiesForbidden.__str__)r;   rJ   rK   rL   rO   r   r   r   )r:   r   r   s  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                s;   t  t |   j   | |  _ | |  _ | |  _ | |  _ d  S)N)rN   r   rO   r   r	   r   r   )r   r   r	   r   r   )r:   r   r   rO     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__)r;   rJ   rK   rL   rO   r   r   r   )r:   r   r     s   r   N)#rL   
__future__r   collectionsr   xml.domr   Zxml.saxr   Zxml.sax.expatreaderr   r   Zdjango.appsr   Zdjango.confr   Zdjango.core.serializersr	   Z	django.dbr
   r   Zdjango.utils.encodingr   Zdjango.utils.xmlutilsr   r   r   rM   ri   rV   r9   r   r   r   r   r   r   r   r   <module>   s&   "