B
    ©0H[";  ã               @   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 ddlmZmZ dd	lmZmZ G d
d„ dejƒZG dd„ dejƒZdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )z
XML serializer.
é    )Úpulldom)Úhandler)ÚExpatParser)Úapps)Úsettings)Úbase)ÚDEFAULT_DB_ALIASÚmodels)ÚSimplerXMLGeneratorÚUnserializableContentErrorc               @   sX   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   s4   | j  d¡d k	r0| j dd| j  d¡ |  ¡ d S )NÚindentÚ
ú )ÚoptionsÚgetÚxmlÚignorableWhitespace)ÚselfÚlevel© r   újC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\core\serializers\xml_serializer.pyr      s    zSerializer.indentc             C   s:   t | j| j dt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$   |   d¡ | j d¡ | 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   sp   t |dƒst dt|ƒ ¡‚|  d¡ dt|jƒi}| jrDt |dƒs^|j}|dk	r^t|ƒ|d< | 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   |   d¡ | 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_object9   s    
zSerializer.end_objectc             C   s˜   |   d¡ | j d|j| ¡ dœ¡ t||jƒdk	r|y| j | |¡¡ W qˆ tk
rx   t	d|j
j|j|jf ƒ‚Y qˆX n| j d¡ | 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   r2   Zget_internal_typeÚgetattrÚ
charactersZvalue_to_stringr   Ú
ValueErrorÚ	__class__Ú__name__r&   ÚaddQuickElementr   )r   r+   r1   r   r   r   Úhandle_field@   s    
zSerializer.handle_fieldc             C   s°   |   |¡ t|| ¡ ƒ}|dk	r”| jr‚t|jjdƒr‚t||jƒ}| ¡ }xH|D ].}| j	 
di ¡ | j	 t|ƒ¡ | j	 d¡ qNW q | j	 t|ƒ¡ n| j	 d¡ | j	 d¡ dS )zq
        Handle a ForeignKey (they need to be treated slightly
        differently from regular fields).
        Nr%   Únaturalr3   r1   )Ú_start_relational_fieldr4   Zget_attnameÚuse_natural_foreign_keysr(   Úremote_fieldr$   r2   r%   r   r   r5   r*   r   r9   )r   r+   r1   Zrelated_attÚrelatedÚ	key_valuer   r   r   Úhandle_fk_fieldW   s    

zSerializer.handle_fk_fieldc                sv   |j jjjrrˆ  |¡ ˆ jr8t|j jdƒr8‡ fdd„}n‡ fdd„}x t||j	ƒ 
¡ D ]}||ƒ qVW ˆ 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 di ¡ x6|D ].}ˆ j di ¡ ˆ j t|ƒ¡ ˆ j d¡ qW ˆ j d¡ d S )Nr'   r;   )r%   r   r   r5   r*   r   )Úvaluer;   r@   )r   r   r   Ú
handle_m2mx   s    
z/Serializer.handle_m2m_field.<locals>.handle_m2mc                s   ˆ j jddt| jƒid� d S )Nr'   r&   )r,   )r   r9   r*   r&   )rB   )r   r   r   rC   ‚   s    r1   N)r>   Zthroughr"   Zauto_createdr<   r=   r(   r$   r4   r2   Úiteratorr   r   )r   r+   r1   rC   Zrelobjr   )r   r   Úhandle_m2m_fieldn   s    

zSerializer.handle_m2m_fieldc             C   s6   |   d¡ | j d|j|jjjt|jjj	ƒdœ¡ dS )z1Output the <field> element for relational fields.r0   r1   )r2   ÚrelÚtoN)
r   r   r   r2   r>   r7   r8   r*   r$   r"   )r   r1   r   r   r   r<   ‹   s
    
z"Serializer._start_relational_fieldN)r8   Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r.   r/   r:   rA   rE   r<   r   r   r   r   r      s   r   c                   sX   e Zd ZdZ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‡  ZS )ÚDeserializerzDeserialize XML.F)ÚusingÚignorenonexistentc               s4   t ƒ j|f|Ž t | j|  ¡ ¡| _|| _|| _d S )N)	ÚsuperÚ__init__r   Úparser   Ú_make_parserÚevent_streamÚdbÚignore)r   Zstream_or_stringrL   rM   r   )r7   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   sD   x:| j D ]0\}}|dkr|jdkr| j  |¡ |  |¡S qW t‚d S )NZSTART_ELEMENTr'   )rR   ÚnodeNameZ
expandNodeÚ_handle_objectÚStopIteration)r   ÚeventÚnoder   r   r   Ú__next__¢   s
    zDeserializer.__next__c             C   s0  |   |d¡}i }| d¡r8|jj | d¡¡||jjj< i }dd„ |j ¡ D ƒ}xÂ| d¡D ]´}| d¡}|sxt	 
d¡‚| jrˆ||krˆq\|j |¡}|jr¼t|jtjƒr¼|  ||¡||j< q\|jrät|jtjƒrä|  ||¡||j< q\| d¡rôd	}	n| t|ƒ ¡ ¡}	|	||j< q\W t	 ||| j¡}
t	 |
|¡S )
z1Convert an <object> node to a DeserializedObject.r$   r&   c             S   s   h | ]
}|j ’qS r   )r2   )Ú.0Úfr   r   r   ú	<setcomp>¹   s    z.Deserializer._handle_object.<locals>.<setcomp>r1   r2   z,<field> node is missing the 'name' attributer3   N)Ú_get_model_from_nodeZhasAttributer"   r&   Ú	to_pythonÚgetAttributeZattnameZ
get_fieldsÚgetElementsByTagNamer   ÚDeserializationErrorrT   Ú	get_fieldr>   Ú
isinstancer	   ZManyToManyRelÚ_handle_m2m_field_noder2   ZManyToOneRelÚ_handle_fk_field_nodeÚgetInnerTextÚstripZbuild_instancerS   ZDeserializedObject)r   rZ   ZModelÚdataZm2m_dataÚfield_namesZ
field_nodeÚ
field_namer1   rB   r+   r   r   r   rW   ©   s0    



zDeserializer._handle_objectc             C   sÂ   |  d¡rdS |jj}t|jdƒrœ|  d¡}|rvdd„ |D ƒ}|j | j¡j|Ž }t||jj	ƒ}|jjj
jjr˜|j}n"t|ƒ ¡ }|j
 |jj	¡ |¡}|S t|ƒ ¡ }|j
 |jj	¡ |¡S dS )z8
        Handle a <field> node for a ForeignKey
        r3   NÚget_by_natural_keyr;   c             S   s   g | ]}t |ƒ ¡ ‘qS r   )rh   ri   )r\   Úkr   r   r   ú
<listcomp>ç   s    z6Deserializer._handle_fk_field_node.<locals>.<listcomp>)rb   r>   r$   r(   Ú_default_managerÚ
db_managerrS   rm   r4   rl   r"   r&   rh   ri   rd   r`   )r   rZ   r1   r$   ÚkeysÚfield_valuer+   r-   r   r   r   rg   Ú   s     

z"Deserializer._handle_fk_field_nodec                sN   |j j‰ˆj‰ tˆ dƒr*‡ ‡‡fdd„‰n‡fdd„‰‡fdd„| d¡D ƒS )z>
        Handle a <field> node for a ManyToManyField.
        rm   c                sJ   |   d¡}|r2dd„ |D ƒ}ˆ  ˆj¡j|Ž j}nˆjj |  d¡¡}|S )Nr;   c             S   s   g | ]}t |ƒ ¡ ‘qS r   )rh   ri   )r\   rn   r   r   r   ro     s    zLDeserializer._handle_m2m_field_node.<locals>.m2m_convert.<locals>.<listcomp>r&   )rb   rq   rS   rm   r&   r"   r`   ra   )Únrr   rs   r-   )Údefault_managerr$   r   r   r   Úm2m_convertþ   s    
z8Deserializer._handle_m2m_field_node.<locals>.m2m_convertc                s   ˆ j j |  d¡¡S )Nr&   )r"   r&   r`   ra   )rt   )r$   r   r   rv   	  s    c                s   g | ]}ˆ |ƒ‘qS r   r   )r\   Úc)rv   r   r   ro     s    z7Deserializer._handle_m2m_field_node.<locals>.<listcomp>r'   )r>   r$   rp   r(   rb   )r   rZ   r1   r   )ru   rv   r$   r   r   rf   ÷   s    
z#Deserializer._handle_m2m_field_nodec          	   C   s^   |  |¡}|s"t d|j|f ¡‚y
t |¡S  ttfk
rX   t d|j|f ¡‚Y nX d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)ra   r   rc   rV   r   Z	get_modelÚLookupErrorÚ	TypeError)r   rZ   ÚattrZmodel_identifierr   r   r   r_     s    

z!Deserializer._get_model_from_node)r8   rH   rI   rJ   r   rO   rQ   r[   rW   rg   rf   r_   Ú__classcell__r   r   )r7   r   rK   •   s   1rK   c             C   s`   g }xP| j D ]F}|j|jks(|j|jkr6| |j¡ q|j|jkr| t|ƒ¡ qqW d 	|¡S )z3Get all the inner text of a DOM node (recursively).Ú )
Ú
childNodesZnodeTypeZ	TEXT_NODEZCDATA_SECTION_NODEÚappendrj   ZELEMENT_NODEÚextendrh   Újoin)rZ   Z
inner_textÚchildr   r   r   rh     s    rh   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 )rU   zi
    An expat parser hardened against XML bomb attacks.

    Forbid DTDs, external entity references
    c             O   s2   t j| f|ž|Ž |  tjd¡ |  tjd¡ d S )NF)Ú_ExpatParserrO   Ú
setFeaturer   Úfeature_external_gesÚfeature_external_pes)r   ÚargsÚkwargsr   r   r   rO   6  s    zDefusedExpatParser.__init__c             C   s   t |||ƒ‚d S )N)ÚDTDForbidden)r   r2   ÚsysidÚpubidZhas_internal_subsetr   r   r   Ústart_doctype_decl;  s    z%DefusedExpatParser.start_doctype_declc             C   s   t ||||||ƒ‚d S )N)ÚEntitiesForbidden)r   r2   Zis_parameter_entityrB   r   r‰   rŠ   Únotation_namer   r   r   Úentity_decl>  s    zDefusedExpatParser.entity_declc             C   s   t |d ||||ƒ‚d S )N)rŒ   )r   r2   r   r‰   rŠ   r�   r   r   r   Úunparsed_entity_declB  s    z'DefusedExpatParser.unparsed_entity_declc             C   s   t ||||ƒ‚d S )N)ÚExternalReferenceForbidden)r   Úcontextr   r‰   rŠ   r   r   r   Úexternal_entity_ref_handlerF  s    z.DefusedExpatParser.external_entity_ref_handlerc             C   s4   t  | ¡ | j}| j|_| j|_| j|_| j	|_
d S )N)r‚   ÚresetÚ_parserr‹   ZStartDoctypeDeclHandlerrŽ   ZEntityDeclHandlerr�   ZUnparsedEntityDeclHandlerr’   ZExternalEntityRefHandler)r   Úparserr   r   r   r“   I  s    
zDefusedExpatParser.resetN)
r8   rH   rI   rJ   rO   r‹   rŽ   r�   r’   r“   r   r   r   r   rU   0  s   rU   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__T  s    zDefusedXmlException.__repr__N)r8   rH   rI   rJ   r—   r   r   r   r   r–   R  s   r–   c                   s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )rˆ   z&Document type definition is forbidden.c                s    t ƒ  ¡  || _|| _|| _d S )N)rN   rO   r2   r‰   rŠ   )r   r2   r‰   rŠ   )r7   r   r   rO   Z  s    
zDTDForbidden.__init__c             C   s   d}|  | j| j| j¡S )Nz7DTDForbidden(name='{}', system_id={!r}, public_id={!r}))Úformatr2   r‰   rŠ   )r   Útplr   r   r   Ú__str__`  s    zDTDForbidden.__str__)r8   rH   rI   rJ   rO   rš   r{   r   r   )r7   r   rˆ   X  s   rˆ   c                   s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )rŒ   zEntity definition is forbidden.c                s2   t ƒ  ¡  || _|| _|| _|| _|| _|| _d S )N)rN   rO   r2   rB   r   r‰   rŠ   r�   )r   r2   rB   r   r‰   rŠ   r�   )r7   r   r   rO   g  s    
zEntitiesForbidden.__init__c             C   s   d}|  | j| j| j¡S )Nz<EntitiesForbidden(name='{}', system_id={!r}, public_id={!r}))r˜   r2   r‰   rŠ   )r   r™   r   r   r   rš   p  s    zEntitiesForbidden.__str__)r8   rH   rI   rJ   rO   rš   r{   r   r   )r7   r   rŒ   e  s   	rŒ   c                   s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )r�   z-Resolving an external reference is forbidden.c                s&   t ƒ  ¡  || _|| _|| _|| _d S )N)rN   rO   r‘   r   r‰   rŠ   )r   r‘   r   r‰   rŠ   )r7   r   r   rO   w  s
    
z#ExternalReferenceForbidden.__init__c             C   s   d}|  | j| j¡S )Nz8ExternalReferenceForbidden(system_id='{}', public_id={}))r˜   r‰   rŠ   )r   r™   r   r   r   rš   ~  s    z"ExternalReferenceForbidden.__str__)r8   rH   rI   rJ   rO   rš   r{   r   r   )r7   r   r�   u  s   r�   N)rJ   Ú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.xmlutilsr
   r   r   rK   rh   rU   r6   r–   rˆ   rŒ   r�   r   r   r   r   Ú<module>   s$     "