
    LȂiAL                     r   S r SSKrSSKJr  SSKJrJr  SSKJr  SSK	J
r  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  SSKJrJr  \S 5       r " S S\R6                  5      r " S S\R8                  5      rS rS r " S S\5      r " S S\ 5      r! " S S\!5      r" " S S\!5      r# " S S\!5      r$g)z
XML serializer.
    N)contextmanager)minidompulldom)handler)ExpatParser)apps)settings)ObjectDoesNotExist)base)DEFAULT_DB_ALIASmodels)SimplerXMLGeneratorUnserializableContentErrorc               #     #    Sn [        [        SS5      =n(       a"  UR                  S:H  n U (       d  S [        l         Sv   U(       a  U (       d  U[        l        ggg! U(       a  U (       d  U[        l        f f f = f7f)zWorkaround for performance issues in minidom document checks.

Speeds up repeated DOM operations by skipping unnecessary full traversal
of the DOM tree.
F_in_documentNz<lambda>c                 ,    [        U R                  5      $ N)boolownerDocument)nodes    WD:\sksbv-state-backend\venv\Lib\site-packages\django/core/serializers/xml_serializer.py<lambda>%fast_cache_clearing.<locals>.<lambda>   s    T5G5G0H    )getattrr   __name__r   )module_helper_was_lambdaoriginal_fns     r   fast_cache_clearingr      so       %g~t<<{<#.#7#7:#E '#HG /7#.G   8;;7#.G   8;s   =B  A  B  A==B c                   N    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg)
Serializer&   zSerialize a QuerySet to XML.c                     U R                   R                  S5      b>  U R                  R                  SSU R                   R                  S5      -  U-  -   5        g g )Nindent
 )optionsgetxmlignorableWhitespace)selflevels     r   r$   Serializer.indent)   sO    <<H%1HH((sT\\--h77%?? 2r   c                     [        U R                  U R                  R                  S[        R
                  5      5      U l        U R                  R                  5         U R                  R                  SSS05        g)zD
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_serializationSerializer.start_serialization/   s\     'KK))*h6N6NO
 	 .E0BCr   c                     U R                  S5        U R                  R                  S5        U R                  R                  5         g)z(
End serialization -- end the document.
r   r0   N)r$   r)   
endElementendDocumentr6   s    r   end_serializationSerializer.end_serialization9   s2     	A,-r   c                    [        US5      (       d"  [        R                  " S[        U5      -  5      eU R	                  S5        S[        UR                  5      0nU R                  (       a  [        US5      (       d7  UR                  nUb(  UR                  R                  R                  U5      US'   U R                  R                  SU5        g)	z#
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_keysrC   value_to_stringr)   r5   )r+   objattrsobj_pks       r   start_objectSerializer.start_objectA   s     sG$$))H4PS9T  	A#cii.),,GC4O4OVVF!!iill::3?dh.r   c                 \    U R                  S5        U R                  R                  S5        g)z1
Called after handling all fields for an object.
r@   rD   N)r$   r)   r:   )r+   rK   s     r   
end_objectSerializer.end_objectS   s!     	AH%r   c           	         U R                  S5        U R                  R                  SUR                  UR	                  5       S.5        [        XR                  5      b`  UR                  U5      nUR	                  5       S:X  a  [        R                  " X2R                  S9n U R                  R                  U5        OU R                  R!                  S
5        U R                  R#                  S5        g! [         a@    [        UR                  R                  < SUR                  < SUR                  < S	35      ef = f)zO
Handle each field on an object (except for ForeignKeys and
ManyToManyFields).
   field)namerG   N	JSONFieldcls.z (pk:z$) contains unserializable charactersNone)r$   r)   r5   rV   get_internal_typer   rJ   jsondumpsencoder
charactersr   
ValueError	__class__r   rC   addQuickElementr:   )r+   rK   rU   values       r   handle_fieldSerializer.handle_fieldZ   s    
 	A

//1	
 3

#/))#.E&&(K7 

5mm<##E* HH$$V,G$ .  }}--uzz366C s   #C6 6A
E c                    U R                  U5        [        XR                  5      nUb  U R                  (       a  [	        UR
                  R                  S5      (       a  [        XR                  5      nUR                  5       nU H^  nU R                  R                  S0 5        U R                  R                  [        U5      5        U R                  R                  S5        M`     O@U R                  R                  [        U5      5        OU R                  R                  S5        U R                  R                  S5        g)zY
Handle a ForeignKey (they need to be treated slightly
differently from regular fields).
NrB   naturalr[   rU   )_start_relational_fieldr   attnameuse_natural_foreign_keysrE   remote_fieldrA   rV   rB   r)   r5   r`   rH   r:   rc   )r+   rK   rU   related_attrelated	key_values         r   handle_fk_fieldSerializer.handle_fk_field{   s    
 	$$U+c==1",,""((-2 2 "#zz2!--/!(IHH)))R8HH''I7HH''	2 ")
 ##C$45HH$$V,G$r   c                   ^  UR                   R                  R                  R                  (       a  T R	                  U5        T R
                  (       a/  [        UR                   R                  S5      (       a
  U 4S jnS nO	U 4S jnS n[        US0 5      R                  UR                  U" X5      5      nU H  nU" U5        M     T R                  R                  S5        gg)	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).
rB   c                 \  > U R                  5       nTR                  R                  S0 5        U H^  nTR                  R                  S0 5        TR                  R                  [	        U5      5        TR                  R                  S5        M`     TR                  R                  S5        g )NrD   rh   )rB   r)   r5   r`   rH   r:   )rd   rh   ro   r+   s      r   
handle_m2m/Serializer.handle_m2m_field.<locals>.handle_m2m   s    #//1GHH))(B7%,	--i<++C	N;++I6 &- HH''1r   c                 z    [        XR                  5      n[        USS 5      (       a  SOS nUR                  U5      $ )Nprefetch_cache_name  )r   rV   iterator)rK   rU   attr
chunk_sizes       r   queryset_iterator6Serializer.handle_m2m_field.<locals>.queryset_iterator   s;    "3

3D '.CT J JPT   ==44r   c                 d   > TR                   R                  SS[        U R                  5      0S9  g )NrD   rC   )rL   )r)   rc   rH   rC   )rd   r+   s    r   rt   ru      s'    HH,,XdCM=R,Sr   c                     [        XR                  5      R                  S 5      R                  S5      nUR                  (       a  SOS nUR                  US9$ )NrC   rx   )r{   )r   rV   select_relatedonly_prefetch_related_lookupsry   )rK   rU   	query_setr{   s       r   r|   r}      sK     'ZZ 8 G G M R RSW XI)2)L)LRVJ$---DDr   _prefetched_objects_cacherU   N)rl   throughr?   auto_createdri   rk   rE   rA   r   r(   rV   r)   r:   )r+   rK   rU   rt   r|   m2m_iterrelobjs   `      r   handle_m2m_fieldSerializer.handle_m2m_field   s     %%++88((/,,""((-2 225TE
 s$?DHH

!#-H #6" # HH(Q 9r   c                    U R                  S5        U R                  R                  SUR                  UR                  R
                  R                  [        UR                  R                  R                  5      S.5        g)z1Output the <field> element for relational fields.rT   rU   )rV   reltoN)
r$   r)   r5   rV   rl   rb   r   rH   rA   r?   )r+   rU   s     r   ri   "Serializer._start_relational_field   s]    A

))33<<%,,22889	
r   )r)   N)r   
__module____qualname____firstlineno____doc__r$   r7   r<   rN   rQ   re   rp   r   ri   __static_attributes__ r   r   r!   r!   &   s5    &D/$&%B%2.)`

r   r!   c                   Z   ^  \ rS rSrSr\SS.U 4S jjrS rS rS r	S	 r
S
 rS rSrU =r$ )Deserializer   zDeserialize XML.F)usingignorenonexistentc                   > [         TU ]  " U40 UD6  UR                  SS5      U l        [        R
                  " U R                  U R                  5       5      U l        X l	        X0l
        g )Nhandle_forward_referencesF)super__init__popr   r   parser2   _make_parserevent_streamdbignore)r+   stream_or_stringr   r   r'   rb   s        r   r   Deserializer.__init__   sW     	)5W5)05PRW)X&#MM$++t7H7H7JK'r   c                     [        5       $ )z;Create a hardened XML parser (no custom/external entities).)DefusedExpatParserr6   s    r   r   Deserializer._make_parser   s    !##r   c                    U R                    H^  u  pUS:X  d  M  UR                  S:X  d  M  [        5          U R                   R                  U5        S S S 5        U R	                  U5      s  $    [
        e! , (       d  f       N)= f)NSTART_ELEMENTrD   )r   nodeNamer   
expandNode_handle_objectStopIteration)r+   eventr   s      r   __next__Deserializer.__next__   sh    ,,KE'DMMX,E(*%%006 +**400	 -
  +*s   A55
B	c                    U R                  US5      n0 nUR                  S5      (       aT  UR                  R                  R	                  UR                  S5      5      X2R                  R                  R                  '   0 n0 nUR                  R                  5        Vs1 sH  ofR                  iM     nnUR                  S5       GHa  nUR                  S5      n	U	(       d  [        R                  " S5      eU R                  (       a  X;  a  MJ  UR                  R                  U	5      n
U
R                  (       a  [        U
R                  [         R"                  5      (       a  U R%                  X5      nU[        R&                  :X  a^  UR                  S5       VVs/ sH;  nUR                  S5       Vs/ sH  n[)        U5      R+                  5       PM     snPM=     snnXZ'   GM"  XU
R                  '   GM3  U
R                  (       a  [        U
R                  [         R,                  5      (       as  U R/                  X5      nU[        R&                  :X  a=  UR                  S5       Vs/ sH  n[)        U5      R+                  5       PM     snXZ'   GM  XU
R                  '   GM  UR                  S5      (       a  S	nOZU
R	                  [)        U5      R+                  5       5      nU
R1                  5       S
:X  a  [2        R4                  " XR6                  S9nXU
R                  '   GMd     [        R8                  " X#U R:                  5      n[        R<                  " XU5      $ s  snf s  snf s  snnf s  snf )z1Convert an <object> node to a DeserializedObject.rA   rC   rU   rV   z,<field> node is missing the 'name' attributerD   rh   r[   NrW   rX   )_get_model_from_nodehasAttributer?   rC   	to_pythongetAttributerj   
get_fieldsrV   getElementsByTagNamer   DeserializationErrorr   	get_fieldrl   
isinstancer   ManyToManyRel_handle_m2m_field_nodeDEFER_FIELDgetInnerTextstripManyToOneRel_handle_fk_field_noder\   r]   loadsdecoderbuild_instancer   DeserializedObject)r+   r   Modeldatam2m_datadeferred_fieldsffield_names
field_node
field_namerU   rd   obj_nodenat_nodekrK   s                   r   r   Deserializer._handle_object   s    ))$8 T""+0;;>>+C+C!!$',D''( ',{{'='='?@'?!vv'?@33G<J $008J//B  {{z<KK))*5E !!j""F$8$8' ' 33JFD,,, )3(G(G(Q.
 )RH -5,I,I),T,T )288:,T )R.O* ,1UZZ(##
""F$7$7) ) 22:ED,,, ",!@!@!K.!KA %Q--/!K.O*
 +0'226:: E!OOL,D,J,J,LME..0K? $

5mm D#(UZZ g =j !!%tww7 &&soFFu A4..s$   M$M.6"M)M.+"M4)M.c                    UR                  S5      (       a  gUR                  R                  n[        UR                  S5      (       Ga2  UR                  S5      nU(       a  U Vs/ sH  n[        U5      R                  5       PM     nn UR                  R                  U R                  5      R                  " U6 n[        XrR                  R                  5      nUR                  R                  R                   R"                  R                  (       a  UR"                  nU$ [        U5      R                  5       nUR                   R%                  UR                  R                  5      R'                  U5      nU$ [        U5      R                  5       nUR                   R%                  UR                  R                  5      R'                  U5      $ s  snf ! [         a%    U R                  (       a  [        R                  s $ e f = f)z(
Handle a <field> node for a ForeignKey
r[   Nget_by_natural_keyrh   )r   rl   rA   rE   _default_managerr   r   
db_managerr   r   r
   r   r   r   r   r   r?   rC   r   r   )	r+   r   rU   rA   keysr   field_valuerK   rM   s	            r   r   "Deserializer._handle_fk_field_node<  s   
 $$V,,&&,,Eu--/CDD00; EI"IDq<?#8#8#:DK"I"#44?? GG,,-.9; %S*<*<*G*GHF ))//5588EE!' 	 #/t"4":":"<K"[[22**55i,  *40668{{,,U-?-?-J-JKUU 1 #J
 . "99#'#3#33!	"s   &"G2G +HHc                   ^ ^^ UR                   R                  mTR                  m[        TS5      (       a	  UUU 4S jnOU4S jn/ n UR	                  S5       H  nUR                  U" U5      5        M     U$ ! [         aW  n[        U[        5      (       a&  T R                  (       a  [        R                  s SnA$ [        R                  " UW5      eSnAff = f)z.
Handle a <field> node for a ManyToManyField.
r   c                 b  > U R                  S5      nU(       a\  U Vs/ sH  n[        U5      R                  5       PM     nnTR                  TR                  5      R
                  " U6 R                  nU$ TR                  R                  R                  U R                  S5      5      nU$ s  snf )Nrh   rC   )
r   r   r   r   r   r   rC   r?   r   r   )nr   r   r   rM   default_managerrA   r+   s        r   m2m_convert8Deserializer._handle_m2m_field_node.<locals>.m2m_convertn  s    --i8 EI"IDq<?#8#8#:DK"I'22477;++,-8:   #[[^^55annT6JKF #Js   "B,c                 l   > TR                   R                  R                  U R                  S5      5      $ )NrC   )r?   rC   r   r   )r   rA   s    r   r   r     s%    {{~~//t0DEEr   rD   N)rl   rA   r   rE   r   append	Exceptionr   r
   r   r   r   M2MDeserializationError)	r+   r   rU   r   valuescer   rA   s	   `      @@r   r   #Deserializer._handle_m2m_field_nodef  s     ""((00?$899 $F 		..x8k!n- 9 M  	9!/00T5S5S'''221a88		9s$   	/A: :
C5C9C?CCc                 ,   UR                  U5      nU(       d)  [        R                  " SUR                  < SU< S35      e [        R
                  " U5      $ ! [        [        4 a*    [        R                  " SUR                  < SU< S35      ef = f)zM
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   rz   model_identifiers       r   r   !Deserializer._get_model_from_node  s    
  ,,T2++==$( 	>>"233Y' 	++=="24 	s   A :B)r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__rb   s   @r   r   r      s@     ( ($LG\(T'R r   r   c                 :    [        U 5      nSR                  U5      $ )z3Get all the inner text of a DOM node (recursively). )getInnerTextListjoin)r   inner_text_lists     r   r   r     s    &t,O77?##r   c                 >   / nU R                    H  nUR                  UR                  :X  d  UR                  UR                  :X  a  UR	                  UR
                  5        MT  UR                  UR                  :X  a  UR                  [        U5      5        M  M     U$ )z=Return a list of the inner texts of a DOM node (recursively).)	
childNodesnodeType	TEXT_NODECDATA_SECTION_NODEr   r   ELEMENT_NODEextendr   )r   resultchilds      r   r   r     sw     FNNeoo-~~!9!99MM%**%^^u111MM*512 ! Mr   c                   J   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	rU =r$ )
r   i  z]
An expat parser hardened against XML bomb attacks.

Forbid DTDs, external entity references
c                    > [         TU ]  " U0 UD6  U R                  [        R                  S5        U R                  [        R
                  S5        g )NF)r   r   
setFeaturer   feature_external_gesfeature_external_pes)r+   argskwargsrb   s      r   r   DefusedExpatParser.__init__  s=    $)&)44e<44e<r   c                     [        XU5      er   )DTDForbidden)r+   rV   sysidpubidhas_internal_subsets        r   start_doctype_decl%DefusedExpatParser.start_doctype_decl  s    4..r   c                     [        XXEXg5      er   EntitiesForbidden)r+   rV   is_parameter_entityrd   r   r
  r  notation_names           r   entity_declDefusedExpatParser.entity_decl  s      T%OOr   c                     [        US X#XE5      er   r  )r+   rV   r   r
  r  r  s         r   unparsed_entity_decl'DefusedExpatParser.unparsed_entity_decl  s    dDNNr   c                     [        XX45      er   )ExternalReferenceForbidden)r+   contextr   r
  r  s        r   external_entity_ref_handler.DefusedExpatParser.external_entity_ref_handler  s    (EEr   c                     [         R                  " U 5        U R                  nU R                  Ul        U R
                  Ul        U R                  Ul        U R                  Ul
        g r   )_ExpatParserreset_parserr  StartDoctypeDeclHandlerr  EntityDeclHandlerr  UnparsedEntityDeclHandlerr  ExternalEntityRefHandler)r+   parsers     r   r   DefusedExpatParser.reset  sQ    4 )-)@)@&#'#3#3 +/+D+D(*.*J*J'r   r   )r   r   r   r   r   r   r  r  r  r  r   r   r   r   s   @r   r   r     s0    =
/P
OFK Kr   r   c                       \ rS rSrSrS rSrg)DefusedXmlExceptioni  zBase exception.c                     [        U 5      $ r   )rH   r6   s    r   __repr__DefusedXmlException.__repr__  s    4yr   r   N)r   r   r   r   r   r+  r   r   r   r   r)  r)    s
    r   r)  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )r	  i  z&Document type definition is forbidden.c                 F   > [         TU ]  5         Xl        X l        X0l        g r   )r   r   rV   r
  r  )r+   rV   r
  r  rb   s       r   r   DTDForbidden.__init__  s    	

r   c                 h    SnUR                  U R                  U R                  U R                  5      $ )Nz7DTDForbidden(name='{}', system_id={!r}, public_id={!r})formatrV   r
  r  r+   tpls     r   __str__DTDForbidden.__str__  s&    Gzz$))TZZ<<r   )rV   r  r
  	r   r   r   r   r   r   r5  r   r   r   s   @r   r	  r	    s    0= =r   r	  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )r  i  zEntity definition is forbidden.c                 j   > [         TU ]  5         Xl        X l        X0l        X@l        XPl        X`l        g r   )r   r   rV   rd   r   r
  r  r  )r+   rV   rd   r   r
  r  r  rb   s          r   r   EntitiesForbidden.__init__  s-    	
	

*r   c                 h    SnUR                  U R                  U R                  U R                  5      $ )Nz<EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})r1  r3  s     r   r5  EntitiesForbidden.__str__  s&    Lzz$))TZZ<<r   )r   rV   r  r  r
  rd   r7  r   s   @r   r  r    s    )+= =r   r  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )r  i  z-Resolving an external reference is forbidden.c                 R   > [         TU ]  5         Xl        X l        X0l        X@l        g r   )r   r   r  r   r
  r  )r+   r  r   r
  r  rb   s        r   r   #ExternalReferenceForbidden.__init__  s"    	

r   c                 R    SnUR                  U R                  U R                  5      $ )Nz8ExternalReferenceForbidden(system_id='{}', public_id={}))r2  r
  r  r3  s     r   r5  "ExternalReferenceForbidden.__str__  s     Hzz$**djj11r   )r   r  r  r
  r7  r   s   @r   r  r    s    72 2r   r  )%r   r]   
contextlibr   xml.domr   r   xml.saxr   xml.sax.expatreaderr   r  django.appsr   django.confr	   django.core.exceptionsr
   django.core.serializersr   	django.dbr   r   django.utils.xmlutilsr   r   r   r!   r   r   r   r   ra   r)  r	  r  r  r   r   r   <module>rL     s     % $  ;    5 ( . Q / /$h
 h
VO4$$ Od$*!K !KH* =& ==+ ="2!4 2r   