a
    Ê[Ùf˜G  ã                   @   s   d Z ddl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 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.
é    N)Úpulldom)Úhandler)ÚExpatParser)Úapps)Úsettings)ÚObjectDoesNotExist)Ú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 ur0| j dd| j  d¡ |  ¡ d S )NÚindentÚ
ú )ÚoptionsÚgetÚxmlÚignorableWhitespace)ÚselfÚlevel© r   úxC:\Users\91910\OneDrive\Desktop\vts_admin_rebuild-master\vts\Lib\site-packages\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.
        Úencodingú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   r   N)r   r   Ú
endElementÚendDocumentr    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u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_object>   s    
zSerializer.end_objectc                 C   s¶   |   d¡ | j d|j| ¡ dœ¡ t||jƒdurš| |¡}| ¡ dkrZtj||j	d}z| j 
|¡ W q¦ ty–   td|jj|j|jf ƒ‚Y q¦0 n| j d¡ | j d¡ dS )	zg
        Handle each field on an object (except for ForeignKeys and
        ManyToManyFields).
        é   Úfield)Únamer,   NÚ	JSONField©Úclsz0%s.%s (pk:%s) contains unserializable charactersÚNone)r   r   r   r5   Úget_internal_typeÚgetattrZvalue_to_stringÚjsonÚdumpsÚencoderÚ
charactersr   Ú
ValueErrorÚ	__class__Ú__name__r)   ÚaddQuickElementr"   )r   r.   r4   Úvaluer   r   r   Úhandle_fieldE   s*    
þþ	
ÿÿzSerializer.handle_fieldc                 C   s¬   |   |¡ t|| ¡ ƒ}|dur| jr~t|jjdƒr~t||jƒ}| ¡ }|D ].}| j	 
di ¡ | j	 t|ƒ¡ | j	 d¡ qLqœ| j	 t|ƒ¡ n| j	 d¡ | j	 d¡ dS )zq
        Handle a ForeignKey (they need to be treated slightly
        differently from regular fields).
        Nr(   Únaturalr9   r4   )Ú_start_relational_fieldr;   Zget_attnameÚuse_natural_foreign_keysr+   Úremote_fieldr'   r5   r(   r   r   r?   r-   r"   rC   )r   r.   r4   Zrelated_attÚrelatedÚ	key_valuer   r   r   Úhandle_fk_fieldf   s    
ÿzSerializer.handle_fk_fieldc                    s’   |j jjjrŽˆ  |¡ ˆ jr@t|j jdƒr@‡ fdd„}dd„ }n‡ fdd„}dd„ }t|di ƒ 	|j
|||ƒ¡}|D ]}||ƒ qtˆ 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                    sZ   |   ¡ }ˆ j di ¡ |D ].}ˆ j di ¡ ˆ j t|ƒ¡ ˆ j d¡ qˆ j d¡ d S )Nr*   rF   )r(   r   r   r?   r-   r"   )rD   rF   rK   r    r   r   Ú
handle_m2m‹   s    z/Serializer.handle_m2m_field.<locals>.handle_m2mc                 S   s   t | |jƒ ¡ S ©N)r;   r5   Úiterator©r.   r4   r   r   r   Úqueryset_iterator•   s    z6Serializer.handle_m2m_field.<locals>.queryset_iteratorc                    s   ˆ j jddt| jƒid d S )Nr*   r)   )r/   )r   rC   r-   r)   )rD   r    r   r   rM   š   s    c                 S   s   t | |jƒ d ¡ d¡ ¡ S ©Nr)   )r;   r5   Zselect_relatedÚonlyrO   rP   r   r   r   rQ      s    ÿþÿZ_prefetched_objects_cacher4   N)rI   Zthroughr%   Zauto_createdrG   rH   r+   r'   r;   r   r5   r   r"   )r   r.   r4   rM   rQ   Zm2m_iterZrelobjr   r    r   Úhandle_m2m_field   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.r3   r4   )r5   ÚrelÚtoN)
r   r   r   r5   rI   rA   rB   r-   r'   r%   )r   r4   r   r   r   rG   ®   s    
ýþz"Serializer._start_relational_fieldN)rB   Ú
__module__Ú__qualname__Ú__doc__r   r!   r$   r1   r2   rE   rL   rT   rG   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                   sF   t ƒ j|fi |¤Ž | dd¡| _t | j|  ¡ ¡| _|| _	|| _
d S )NÚhandle_forward_referencesF)ÚsuperÚ__init__Úpopr]   r   Úparser   Ú_make_parserÚevent_streamÚdbÚignore)r   Zstream_or_stringr[   r\   r   ©rA   r   r   r_   ¾   s
    zDeserializer.__init__c                 C   s   t ƒ S )z;Create a hardened XML parser (no custom/external entities).)ÚDefusedExpatParserr    r   r   r   rb   Ì   s    zDeserializer._make_parserc                 C   sD   | j D ]4\}}|dkr|jdkr| j  |¡ |  |¡  S qt‚d S )NZSTART_ELEMENTr*   )rc   ÚnodeNameZ
expandNodeÚ_handle_objectÚStopIteration)r   ÚeventÚnoder   r   r   Ú__next__Ð   s
    zDeserializer.__next__c                 C   sª  |   |d¡}i }| d¡r8|jj | d¡¡||jjj< i }i }dd„ |j ¡ D ƒ}| d¡D ]*}| d¡}|s|t	 
d¡‚| jrŒ||vrŒq^|j |¡}	|	jrèt|	jtjƒrè|  ||	¡}
|
t	jkrÜdd	„ | d
¡D ƒ||	< n
|
||	j< q^|	jr>t|	jtjƒr>|  ||	¡}
|
t	jkr2dd	„ | d¡D ƒ||	< n
|
||	j< q^| d¡rPd}
n0|	 t|ƒ ¡ ¡}
|	 ¡ dkr€tj|
|	jd}
|
||	j< q^t	 ||| j¡}t	 |||¡S )z1Convert an <object> node to a DeserializedObject.r'   r)   c                 S   s   h | ]
}|j ’qS r   )r5   )Ú.0Úfr   r   r   Ú	<setcomp>é   ó    z.Deserializer._handle_object.<locals>.<setcomp>r4   r5   z,<field> node is missing the 'name' attributec                 S   s    g | ]}d d„ |  d¡D ƒ‘qS )c                 S   s   g | ]}t |ƒ ¡ ‘qS r   ©ÚgetInnerTextÚstrip)rn   Znat_noder   r   r   Ú
<listcomp>  s   ÿz:Deserializer._handle_object.<locals>.<listcomp>.<listcomp>rF   )ÚgetElementsByTagName)rn   Zobj_noder   r   r   ru     s   üþz/Deserializer._handle_object.<locals>.<listcomp>r*   c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rr   ©rn   Úkr   r   r   ru     s   ÿrF   r9   Nr6   r7   )Ú_get_model_from_nodeZhasAttributer%   r)   Ú	to_pythonÚgetAttributeZattnameZ
get_fieldsrv   r   ÚDeserializationErrorre   Ú	get_fieldrI   Ú
isinstancer
   ZManyToManyRelÚ_handle_m2m_field_nodeÚDEFER_FIELDr5   ZManyToOneRelÚ_handle_fk_field_noders   rt   r:   r<   ÚloadsÚdecoderZbuild_instancerd   ZDeserializedObject)r   rl   ZModelÚdataZm2m_dataZdeferred_fieldsÚfield_namesZ
field_nodeÚ
field_namer4   rD   r.   r   r   r   ri   ×   sX    
ÿ
ÿÿ
û
ÿþzDeserializer._handle_objectc                 C   sì   |  d¡rdS |jj}t|jdƒrÆ|  d¡}|r dd„ |D ƒ}z|j | j¡j|Ž }W n$ tyz   | j	rtt
j Y S ‚ Y n0 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
        r9   NÚget_by_natural_keyrF   c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rr   rw   r   r   r   ru   1  rq   z6Deserializer._handle_fk_field_node.<locals>.<listcomp>)rv   rI   r'   r+   Ú_default_managerÚ
db_managerrd   r‡   r   r]   r   r€   r;   r†   r%   r)   rs   rt   r}   rz   )r   rl   r4   r'   ÚkeysÚfield_valuer.   r0   r   r   r   r   $  s>    

ÿþ
ÿþÿz"Deserializer._handle_fk_field_nodec              
      s¸   |j j‰ˆj‰ tˆ dƒr*‡ ‡‡fdd„}n‡fdd„}g }z"| d¡D ]}| ||ƒ¡ qFW nR ty® } z:t|tƒrŽˆj	rŽt
jW  Y d}~S t
 ||¡‚W Y d}~nd}~0 0 |S dS )z>
        Handle a <field> node for a ManyToManyField.
        r‡   c                    sJ   |   d¡}|r2dd„ |D ƒ}ˆ  ˆj¡j|Ž j}nˆjj |  d¡¡}|S )NrF   c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rr   rw   r   r   r   ru   Y  rq   zLDeserializer._handle_m2m_field_node.<locals>.m2m_convert.<locals>.<listcomp>r)   )rv   r‰   rd   r‡   r)   r%   rz   r{   )ÚnrŠ   r‹   r0   ©Zdefault_managerr'   r   r   r   Úm2m_convertU  s    
ÿÿz8Deserializer._handle_m2m_field_node.<locals>.m2m_convertc                    s   ˆ j j |  d¡¡S rR   )r%   r)   rz   r{   )rŒ   )r'   r   r   rŽ   f  s    r*   N)rI   r'   rˆ   r+   rv   ÚappendÚ	Exceptionr~   r   r]   r   r€   ZM2MDeserializationError)r   rl   r4   rŽ   ÚvaluesÚcÚer   r   r   r   M  s    
"z#Deserializer._handle_m2m_field_nodec              	   C   s^   |  |¡}|s"t d|j|f ¡‚zt |¡W S  ttfyX   t d|j|f ¡‚Y n0 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)r{   r   r|   rh   r   Z	get_modelÚLookupErrorÚ	TypeError)r   rl   ÚattrZmodel_identifierr   r   r   ry   u  s    
ÿÿÿÿz!Deserializer._get_model_from_node)rB   rW   rX   rY   r	   r_   rb   rm   ri   r   r   ry   Ú__classcell__r   r   rf   r   rZ   »   s   ûM)(rZ   c                 C   s\   g }| j D ]F}|j|jks&|j|jkr4| |j¡ q
|j|jkr
| t|ƒ¡ q
q
d 	|¡S )z3Get all the inner text of a DOM node (recursively).Ú )
Ú
childNodesZnodeTypeZ	TEXT_NODEZCDATA_SECTION_NODEr   r„   ZELEMENT_NODEÚextendrs   Újoin)rl   Z
inner_textÚchildr   r   r   rs   ‰  s    

ÿ
þrs   c                       sH   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	‡  Z
S )rg   zi
    An expat parser hardened against XML bomb attacks.

    Forbid DTDs, external entity references
    c                    s2   t ƒ j|i |¤Ž |  tjd¡ |  tjd¡ d S )NF)r^   r_   Ú
setFeaturer   Úfeature_external_gesÚfeature_external_pes)r   ÚargsÚkwargsrf   r   r   r_   ¤  s    zDefusedExpatParser.__init__c                 C   s   t |||ƒ‚d S rN   )ÚDTDForbidden)r   r5   ÚsysidÚpubidZhas_internal_subsetr   r   r   Ústart_doctype_decl©  s    z%DefusedExpatParser.start_doctype_declc                 C   s   t ||||||ƒ‚d S rN   ©ÚEntitiesForbidden)r   r5   Úis_parameter_entityrD   r   r£   r¤   Únotation_namer   r   r   Úentity_decl¬  s    zDefusedExpatParser.entity_declc                 C   s   t |d ||||ƒ‚d S rN   r¦   )r   r5   r   r£   r¤   r©   r   r   r   Úunparsed_entity_decl±  s    z'DefusedExpatParser.unparsed_entity_declc                 C   s   t ||||ƒ‚d S rN   )ÚExternalReferenceForbidden©r   Úcontextr   r£   r¤   r   r   r   Úexternal_entity_ref_handlerµ  s    z.DefusedExpatParser.external_entity_ref_handlerc                 C   s4   t  | ¡ | j}| j|_| j|_| j|_| j	|_
d S rN   )Ú_ExpatParserÚresetÚ_parserr¥   ÚStartDoctypeDeclHandlerrª   ÚEntityDeclHandlerr«   ÚUnparsedEntityDeclHandlerr¯   ÚExternalEntityRefHandler)r   Úparserr   r   r   r±   ¸  s    
zDefusedExpatParser.reset)rB   rW   rX   rY   r_   r¥   rª   r«   r¯   r±   r—   r   r   rf   r   rg     s   rg   c                   @   s   e Zd ZdZdd„ ZdS )ÚDefusedXmlExceptionzBase exception.c                 C   s   t | ƒS rN   )r-   r    r   r   r   Ú__repr__Ä  s    zDefusedXmlException.__repr__N)rB   rW   rX   rY   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 rN   )r^   r_   r5   r£   r¤   )r   r5   r£   r¤   rf   r   r   r_   Ë  s    
zDTDForbidden.__init__c                 C   s   d}|  | j| j| j¡S )Nz7DTDForbidden(name='{}', system_id={!r}, public_id={!r})©Úformatr5   r£   r¤   ©r   Ztplr   r   r   Ú__str__Ñ  s    zDTDForbidden.__str__©rB   rW   rX   rY   r_   r½   r—   r   r   rf   r   r¢   È  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 rN   )r^   r_   r5   rD   r   r£   r¤   r©   )r   r5   rD   r   r£   r¤   r©   rf   r   r   r_   Ù  s    
zEntitiesForbidden.__init__c                 C   s   d}|  | j| j| j¡S )Nz<EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})rº   r¼   r   r   r   r½   â  s    zEntitiesForbidden.__str__r¾   r   r   rf   r   r§   Ö  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 rN   )r^   r_   r®   r   r£   r¤   r­   rf   r   r   r_   ê  s
    
z#ExternalReferenceForbidden.__init__c                 C   s   d}|  | j| j¡S )Nz8ExternalReferenceForbidden(system_id='{}', public_id={}))r»   r£   r¤   r¼   r   r   r   r½   ñ  s    z"ExternalReferenceForbidden.__str__r¾   r   r   rf   r   r¬   ç  s   r¬   ) rY   r<   Ú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   rZ   rs   rg   r@   r¸   r¢   r§   r¬   r   r   r   r   Ú<module>   s(    + O$