
    dfG                     d   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ej                  Z G d dej                  Zd Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )z
XML serializer.
    N)pulldom)handler)ExpatParser)apps)settings)ObjectDoesNotExist)base)DEFAULT_DB_ALIASmodels)SimplerXMLGeneratorUnserializableContentErrorc                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )
SerializerzSerialize a QuerySet to XML.c                     | j                             d          =| j                            dd| j                             d          z  |z  z              d S d S )Nindent
 )optionsgetxmlignorableWhitespace)selflevels     bD:\Python Project\djangoTemplates\venv\Lib\site-packages\django/core/serializers/xml_serializer.pyr   zSerializer.indent   sf    <H%%1H((sT\--h777%??     21    c                     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   s    r   start_serializationzSerializer.start_serialization   sk     'K))*h6NOO
 
 	   .E0BCCCCCr   c                     |                      d           | j                            d           | j                                         dS )z8
        End serialization -- end the document.
        r   r   N)r   r   
endElementendDocumentr$   s    r   end_serializationzSerializer.end_serialization%   sD     	A,---r   c                 ^   t          |d          s$t          j        dt          |          z            |                     d           dt          |j                  i}| j        rt          |d          s|j        }|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	   SerializationErrortyper   strr+   use_natural_primary_keysr/   r   r#   )r   objattrsobj_pks       r   start_objectzSerializer.start_object-   s     sG$$ 	)H4PS99T   	A#ci..), 	*GC4O4O 	*VF!!&kkdh.....r   c                 d    |                      d           | j                            d           dS )zA
        Called after handling all fields for an object.
        r,   r0   N)r   r   r'   )r   r6   s     r   
end_objectzSerializer.end_object?   s/     	AH%%%%%r   c           	      h   |                      d           | j                            d|j        |                                d           t          ||j                  |                    |          }|                                dk    rt          j        ||j	                  }	 | j        
                    |           nT# t          $ r- t          |j        j        d|j        d|j        d	          w xY w| j                            d
           | j                            d           dS )zg
        Handle each field on an object (except for ForeignKeys and
        ManyToManyFields).
           field)namer3   N	JSONFieldcls.z (pk:z$) contains unserializable charactersNone)r   r   r#   r?   get_internal_typegetattrvalue_to_stringjsondumpsencoder
charactersr   
ValueError	__class____name__r/   addQuickElementr'   )r   r6   r>   values       r   handle_fieldzSerializer.handle_fieldF   sG   
 	A
//11 	
 	
 	
 3
##/))#..E&&((K77 
5em<<<##E****-    }---uzzz3666C   H$$V,,,G$$$$$s   )C 7C;c                    |                      |           t          ||                                          }|| j        rt	          |j        j        d          rt          ||j                  }|                                }|D ]^}| j	        
                    di            | j	                            t          |                     | j	                            d           _nB| j	                            t          |                     n| j	                            d           | j	                            d           dS )zq
        Handle a ForeignKey (they need to be treated slightly
        differently from regular fields).
        Nr.   naturalrD   r>   )_start_relational_fieldrF   get_attnameuse_natural_foreign_keysr1   remote_fieldr-   r?   r.   r   r#   rK   r4   r'   rO   )r   r6   r>   related_attrelated	key_values         r   handle_fk_fieldzSerializer.handle_fk_fieldg   s:   
 	$$U+++c5#4#4#6#677", 6"(-2 2 6 "#uz22!--//!( 3 3IH)))R888H''I777H''	22223
 ##C$4$45555H$$V,,,G$$$$$r   c                     |j         j        j        j        r                     |            j        r#t          |j         j        d          r	 fd}d }n fd}d }t          |di           	                    |j
         |||                    }|D ]} ||            j                            d           dS 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                 \   |                                  }j                            di            |D ]^}j                            di            j                            t	          |                     j                            d           _j                            d           d S )Nr0   rS   )r.   r   r#   rK   r4   r'   )rP   rS   rZ   r   s      r   
handle_m2mz/Serializer.handle_m2m_field.<locals>.handle_m2m   s    #//11GH))(B777%, 7 7	--i<<<++C	NN;;;++I6666H''11111r   c                 P    t          | |j                                                  S N)rF   r?   iteratorr6   r>   s     r   queryset_iteratorz6Serializer.handle_m2m_field.<locals>.queryset_iterator   s     "3
33<<>>>r   c                 h    j                             ddt          | j                  i           d S )Nr0   r/   )r7   )r   rO   r4   r/   )rP   r   s    r   r^   z/Serializer.handle_m2m_field.<locals>.handle_m2m   s1    H,,XdCMM=R,SSSSSr   c                     t          | |j                                      d                               d                                          S Nr/   )rF   r?   select_relatedonlyra   rb   s     r   rc   z6Serializer.handle_m2m_field.<locals>.queryset_iterator   s7    UZ00'--d!	r   _prefetched_objects_cacher>   N)rW   throughr+   auto_createdrT   rV   r1   r-   rF   r   r?   r   r'   )r   r6   r>   r^   rc   m2m_iterrelobjs   `      r   handle_m2m_fieldzSerializer.handle_m2m_field   s2    %+8 '	)((///, "(-2 2 2 2 2 2 2? ? ? ?
T T T T T   s$?DDHH
!!#u-- H # # #
6""""H(((((O'	) '	)r   c                     |                      d           | j                            d|j        |j        j        j        t          |j        j        j	                  d           dS )z1Output the <field> element for relational fields.r=   r>   )r?   reltoN)
r   r   r#   r?   rW   rM   rN   r4   r-   r+   )r   r>   s     r   rT   z"Serializer._start_relational_field   sg    A
)3<%,2899 	
 	
 	
 	
 	
r   N)rN   
__module____qualname____doc__r   r%   r)   r9   r;   rQ   r[   rn   rT    r   r   r   r      s        &&  D D D  / / /$& & &% % %B% % %2-) -) -)^

 

 

 

 

r   r   c                   N     e Zd ZdZedd fd
Zd Zd Zd Zd Z	d	 Z
d
 Z xZS )DeserializerzDeserialize XML.F)usingignorenonexistentc                     t                      j        |fi | |                    dd          | _        t	          j        | j        |                                           | _        || _	        || _
        d S )Nhandle_forward_referencesF)super__init__popr{   r   parser    _make_parserevent_streamdbignore)r   stream_or_stringrx   ry   r   rM   s        r   r}   zDeserializer.__init__   sq     	)55W555)05PRW)X)X&#M$+t7H7H7J7JKK'r   c                     t                      S )z;Create a hardened XML parser (no custom/external entities).)DefusedExpatParserr$   s    r   r   zDeserializer._make_parser   s    !###r   c                     | j         D ]G\  }}|dk    r<|j        dk    r1| j                             |           |                     |          c S Ht          )NSTART_ELEMENTr0   )r   nodeName
expandNode_handle_objectStopIteration)r   eventnodes      r   __next__zDeserializer.__next__   sg    , 	1 	1KE4''DMX,E,E!,,T222**400000r   c                 h   |                      |d          }i }|                    d          rD|j        j                            |                    d                    ||j        j        j        <   i }i }d |j                                        D             }|                    d          D ]}|                    d          }|st          j
        d          | j        r||vr:|j                            |          }	|	j        rst          |	j        t          j                  rT|                     ||	          }
|
t          j        k    r#d |                    d          D             ||	<   |
||	j        <   |	j        rut          |	j        t          j                  rV|                     ||	          }
|
t          j        k    r$d	 |                    d
          D             ||	<   >|
||	j        <   J|                    d          rd}
ng|	                    t-          |                                                    }
|	                                dk    rt3          j        |
|	j                  }
|
||	j        <   t          j        ||| j                  }t          j        |||          S )z1Convert an <object> node to a DeserializedObject.r-   r/   c                     h | ]	}|j         
S ru   )r?   ).0fs     r   	<setcomp>z.Deserializer._handle_object.<locals>.<setcomp>   s    @@@!qv@@@r   r>   r?   z,<field> node is missing the 'name' attributec                 L    g | ]!}d  |                     d          D             "S )c                 P    g | ]#}t          |                                          $S ru   getInnerTextstrip)r   nat_nodes     r   
<listcomp>z:Deserializer._handle_object.<locals>.<listcomp>.<listcomp>  s<        ( )2288::  r   rS   )getElementsByTagName)r   obj_nodes     r   r   z/Deserializer._handle_object.<locals>.<listcomp>  sO     . . .
 %	 ,4,I,I),T,T  . . .r   r0   c                 P    g | ]#}t          |                                          $S ru   r   r   ks     r   r   z/Deserializer._handle_object.<locals>.<listcomp>  s:     . . . %Q--//. . .r   rS   rD   Nr@   rA   )_get_model_from_nodehasAttributer+   r/   	to_pythongetAttributeattname
get_fieldsr   r	   DeserializationErrorr   	get_fieldrW   
isinstancer   ManyToManyRel_handle_m2m_field_nodeDEFER_FIELDr?   ManyToOneRel_handle_fk_field_noder   r   rE   rH   loadsdecoderbuild_instancer   DeserializedObject)r   r   Modeldatam2m_datadeferred_fieldsfield_names
field_node
field_namer>   rP   r6   s               r   r   zDeserializer._handle_object   s    ))$88 T"" 	+0;>+C+C!!$'', ,D'( @@u{'='='?'?@@@33G<< 2	) 2	)J $0088J /B   { z<<K))*55E ! !)j"F$8' ' !) 33JFFD,,,. .
 )3(G(G(Q(Q. . .OE** ,1HUZ((# )
"F$7) ) ) 22:uEED,,,. .!+!@!@!K!K. . .OE**
 +0D''226:: E EE!OOL,D,D,J,J,L,LMME..00K?? $
5em D D D#(UZ  !%tw77 &sHoFFFr   c                 2   |                     d          rdS |j        j        }t          |j        d          r|                     d          }|rd |D             }	  |j                            | j                  j        | }n$# t          $ r | j	        rt          j        cY S  w xY wt          ||j        j                  }|j        j        j        j        j        r|j        }nXt!          |                                          }|j                            |j        j                                      |          }|S t!          |                                          }|j                            |j        j                                      |          S )z8
        Handle a <field> node for a ForeignKey
        rD   Nget_by_natural_keyrS   c                 P    g | ]#}t          |                                          $S ru   r   r   s     r   r   z6Deserializer._handle_fk_field_node.<locals>.<listcomp>2  *    "I"I"Iq<??#8#8#:#:"I"I"Ir   )r   rW   r-   r1   _default_manager
db_managerr   r   r   r{   r	   r   rF   r   r+   r/   r   r   r   r   )r   r   r>   r-   keysfield_valuer6   r8   s           r   r   z"Deserializer._handle_fk_field_node%  s   
 $$V,, "	4&,Eu-/CDD 00;; -"I"ID"I"I"IK"-e4?? G ,k; . " " "9 "#'#3333!	"
 %S%*<*GHHF )/58E +!' #/t"4"4":":"<"<K"[22*5 i,,  *4006688{,,U-?-JKKUU  s   'B B'%B'c                     |j         j        j        t          d          r fd}nfd}g }	 |                    d          D ] }|                     ||                     !	 |S # t          $ rG}t          |t                    r j	        rt          j        cY d}~S t          j        ||          d}~ww xY w)z>
        Handle a <field> node for a ManyToManyField.
        r   c                    |                      d          }|r4d |D             }                     j                  j        | j        }n2j        j                            |                     d                    }|S )NrS   c                 P    g | ]#}t          |                                          $S ru   r   r   s     r   r   zLDeserializer._handle_m2m_field_node.<locals>.m2m_convert.<locals>.<listcomp>Z  r   r   r/   )r   r   r   r   r/   r+   r   r   )nr   r   r8   default_managerr-   r   s       r   m2m_convertz8Deserializer._handle_m2m_field_node.<locals>.m2m_convertV  s    --i88 
L"I"ID"I"I"IK,2247;;+[: F #[^55annT6J6JKKFr   c                 h    j         j                            |                     d                    S rf   )r+   r/   r   r   )r   r-   s    r   r   z8Deserializer._handle_m2m_field_node.<locals>.m2m_convertg  s'    {~//t0D0DEEEr   r0   N)rW   r-   r   r1   r   append	Exceptionr   r   r{   r	   r   M2MDeserializationError)	r   r   r>   r   valuescer   r-   s	   `      @@r   r   z#Deserializer._handle_m2m_field_nodeN  s/    "(0?$899 	F       "F F F F F 		..x88 . .kk!nn----. M  	9 	9 	9!/00 9T5S 9'''''''21a888		9s#   6A0 0
C:'B<!C'B<<Cc                    |                     |          }|s t          j        d|j        d|d          	 t	          j        |          S # t          t          f$ r! t          j        d|j        d|d          w xY w)ze
        Look up a model from a <object model=...> or a <field rel=... to=...>
        node.
        <z > node is missing the required 'z' attributez&> node has invalid model identifier: '')r   r	   r   r   r   	get_modelLookupError	TypeError)r   r   attrmodel_identifiers       r   r   z!Deserializer._get_model_from_nodev  s    
  ,,T22 	++===$$$(  	>"2333Y' 	 	 	++==="2"2"24  	s   A 2A?)rN   rr   rs   rt   r
   r}   r   r   r   r   r   r   __classcell__rM   s   @r   rw   rw      s         ( ( ( ( ( ( ($ $ $  KG KG KGZ' ' 'R& & &P      r   rw   c                     g }| j         D ]p}|j        |j        k    s|j        |j        k    r|                    |j                   =|j        |j        k    r#|                    t          |                     pqd	                    |          S )z3Get all the inner text of a DOM node (recursively). )

childNodesnodeType	TEXT_NODECDATA_SECTION_NODEr   r   ELEMENT_NODEextendr   join)r   
inner_textchilds      r   r   r     s     J 	 	Neo--~!999ej))))^u111l511222277:r   c                   @     e Zd ZdZ fdZd Zd Zd Zd Zd Z	 xZ
S )r   zi
    An expat parser hardened against XML bomb attacks.

    Forbid DTDs, external entity references
    c                      t                      j        |i | |                     t          j        d           |                     t          j        d           d S )NF)r|   r}   
setFeaturer   feature_external_gesfeature_external_pes)r   argskwargsrM   s      r   r}   zDefusedExpatParser.__init__  sS    $)&)))4e<<<4e<<<<<r   c                 $    t          |||          r`   )DTDForbidden)r   r?   sysidpubidhas_internal_subsets        r   start_doctype_declz%DefusedExpatParser.start_doctype_decl  s    4...r   c                 *    t          ||||||          r`   EntitiesForbidden)r   r?   is_parameter_entityrP   r	   r   r   notation_names           r   entity_declzDefusedExpatParser.entity_decl  s      eT5%OOOr   c                 *    t          |d ||||          r`   r   )r   r?   r	   r   r   r   s         r   unparsed_entity_declz'DefusedExpatParser.unparsed_entity_decl  s    dD%NNNr   c                 &    t          ||||          r`   )ExternalReferenceForbidden)r   contextr	   r   r   s        r   external_entity_ref_handlerz.DefusedExpatParser.external_entity_ref_handler  s    ($uEEEr   c                     t          j        |            | j        }| j        |_        | j        |_        | j        |_        | j	        |_
        d S r`   )_ExpatParserreset_parserr   StartDoctypeDeclHandlerr   EntityDeclHandlerr   UnparsedEntityDeclHandlerr   ExternalEntityRefHandler)r   parsers     r   r   zDefusedExpatParser.reset  sL    4   )-)@&#'#3 +/+D(*.*J'''r   )rN   rr   rs   rt   r}   r   r   r   r   r   r   r   s   @r   r   r     s         = = = = =
/ / /P P P
O O OF F FK K K K K K Kr   r   c                       e Zd ZdZd ZdS )DefusedXmlExceptionzBase exception.c                      t          |           S r`   )r4   r$   s    r   __repr__zDefusedXmlException.__repr__  s    4yyr   N)rN   rr   rs   rt   r	  ru   r   r   r  r    s)            r   r  c                   (     e Zd ZdZ fdZd Z xZS )r   z&Document type definition is forbidden.c                 r    t                                                       || _        || _        || _        d S r`   )r|   r}   r?   r   r   )r   r?   r   r   rM   s       r   r}   zDTDForbidden.__init__  s2    	



r   c                 R    d}|                     | j        | j        | j                  S )Nz7DTDForbidden(name='{}', system_id={!r}, public_id={!r})formatr?   r   r   r   tpls     r   __str__zDTDForbidden.__str__  s#    Gzz$)TZ<<<r   rN   rr   rs   rt   r}   r  r   r   s   @r   r   r     sM        00    = = = = = = =r   r   c                   (     e Zd ZdZ fdZd Z xZS )r   zEntity definition is forbidden.c                     t                                                       || _        || _        || _        || _        || _        || _        d S r`   )r|   r}   r?   rP   r	   r   r   r   )r   r?   rP   r	   r   r   r   rM   s          r   r}   zEntitiesForbidden.__init__  sJ    	
	

*r   c                 R    d}|                     | j        | j        | j                  S )Nz<EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})r  r  s     r   r  zEntitiesForbidden.__str__  s#    Lzz$)TZ<<<r   r  r   s   @r   r   r     sM        ))+ + + + += = = = = = =r   r   c                   (     e Zd ZdZ fdZd Z xZS )r   z-Resolving an external reference is forbidden.c                     t                                                       || _        || _        || _        || _        d S r`   )r|   r}   r   r	   r   r   )r   r   r	   r   r   rM   s        r   r}   z#ExternalReferenceForbidden.__init__  s9    	



r   c                 F    d}|                     | j        | j                  S )Nz8ExternalReferenceForbidden(system_id='{}', public_id={}))r  r   r   r  s     r   r  z"ExternalReferenceForbidden.__str__  s    Hzz$*dj111r   r  r   s   @r   r   r     sM        77    2 2 2 2 2 2 2r   r   ) rt   rH   xml.domr   xml.saxr   xml.sax.expatreaderr   r   django.appsr   django.confr   django.core.exceptionsr   django.core.serializersr	   	django.dbr
   r   django.utils.xmlutilsr   r   r   rw   r   r   rL   r  r   r   r   ru   r   r   <module>r"     s*                 ; ; ; ; ; ;                   5 5 5 5 5 5 ( ( ( ( ( ( . . . . . . . . Q Q Q Q Q Q Q Qg
 g
 g
 g
 g
 g
 g
 g
TK K K K K4$ K K K\  (!K !K !K !K !K !K !K !KH    *   = = = = =& = = == = = = =+ = = ="2 2 2 2 2!4 2 2 2 2 2r   