
    Vh|H                     L   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j0                        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y)z
XML serializer.
    N)pulldom)handler)ExpatParser)apps)settings)ObjectDoesNotExist)base)DEFAULT_DB_ALIASmodels)SimplerXMLGeneratorUnserializableContentErrorc                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)
SerializerzSerialize a QuerySet to XML.c                     | j                   j                  d      >| j                  j                  dd| j                   j                  d      z  |z  z          y y )Nindent
 )optionsgetxmlignorableWhitespace)selflevels     V/home/dcms/DCMS/lib/python3.12/site-packages/django/core/serializers/xml_serializer.pyr   zSerializer.indent   sO    <<H%1HH((sT\\--h77%?? 2    c                     t        | j                  | j                  j                  dt        j
                              | _        | j                  j                          | j                  j                  dddi       y)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   s\     'KK))*h6N6NO
 	 .E0BCr   c                     | j                  d       | j                  j                  d       | j                  j                          y)z8
        End serialization -- end the document.
        r   r   N)r   r   
endElementendDocumentr$   s    r   end_serializationzSerializer.end_serialization%   s2     	A,-r   c                    t        |d      s!t        j                  dt        |      z        | j	                  d       dt        |j                        i}| j                  rt        |d      s6|j                  }|(|j                  j                  j                  |      |d<   | j                  j                  d|       y)	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/   value_to_stringr   r#   )r   objattrsobj_pks       r   start_objectzSerializer.start_object-   s     sG$))H4PS9T  	A#cii.),,GC4OVVF!!iill::3?dh.r   c                 \    | j                  d       | j                  j                  d       y)zA
        Called after handling all fields for an object.
        r,   r0   N)r   r   r'   )r   r7   s     r   
end_objectzSerializer.end_object?   s!     	AH%r   c           	         | j                  d       | j                  j                  d|j                  |j	                         d       t        ||j                        b|j                  |      }|j	                         dk(  r!t        j                  ||j                        }	 | j                  j                  |       n| j                  j!                  d
       | j                  j#                  d       y# t        $ r= t        |j                  j                  d|j                  d|j                  d	      w xY w)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getattrr6   jsondumpsencoder
charactersr   
ValueError	__class____name__r/   addQuickElementr'   )r   r7   r?   values       r   handle_fieldzSerializer.handle_fieldF   s    
 	A

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

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

5emm<##E* HH$$V,G$ .  }}--uzz366C s   %C8 8AD>c                 v   | j                  |       t        ||j                        }|| j                  rt	        |j
                  j                  d      rt        ||j                        }|j                         }|D ]]  }| j                  j                  di        | j                  j                  t        |             | j                  j                  d       _ n@| j                  j                  t        |             n| j                  j                  d       | j                  j                  d       y)zq
        Handle a ForeignKey (they need to be treated slightly
        differently from regular fields).
        Nr.   naturalrE   r?   )_start_relational_fieldrG   attnameuse_natural_foreign_keysr1   remote_fieldr-   r@   r.   r   r#   rK   r4   r'   rO   )r   r7   r?   related_attrelated	key_values         r   handle_fk_fieldzSerializer.handle_fk_fieldg   s    
 	$$U+c5==1",,""((-2 "#uzz2!--/!( 3IHH)))R8HH''I7HH''	23
 ##C$45HH$$V,G$r   c                     |j                   j                  j                  j                  r j	                  |        j
                  r)t        |j                   j                  d      r	 fd}d }n fd}d }t        |di       j                  |j                   |||            }|D ]
  } ||         j                  j                  d       yy)	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                 X   | j                         }j                  j                  di        |D ]]  }j                  j                  di        j                  j                  t	        |             j                  j                  d       _ j                  j                  d       y )Nr0   rS   )r.   r   r#   rK   r4   r'   )rP   rS   rZ   r   s      r   
handle_m2mz/Serializer.handle_m2m_field.<locals>.handle_m2m   s    #//1GHH))(B7%, 7	--i<++C	N;++I67 HH''1r   c                 r    t        | |j                        }t        |dd       rdnd }|j                  |      S )Nprefetch_cache_name  )rG   r@   iterator)r7   r?   attr
chunk_sizes       r   queryset_iteratorz6Serializer.handle_m2m_field.<locals>.queryset_iterator   s:    "3

3D '.CT JPT   ==44r   c                 j    j                   j                  ddt        | j                        i       y )Nr0   r/   )r8   )r   rO   r4   r/   )rP   r   s    r   r^   z/Serializer.handle_m2m_field.<locals>.handle_m2m   s'    HH,,XdCM=R,Sr   c                     t        | |j                        j                  d       j                  d      }|j                  rdnd }|j                  |      S )Nr/   ra   )rd   )rG   r@   select_relatedonly_prefetch_related_lookupsrb   )r7   r?   	query_setrd   s       r   re   z6Serializer.handle_m2m_field.<locals>.queryset_iterator   sM     'UZZ 8 G G M R RSW XI)2)L)LRVJ$---DDr   _prefetched_objects_cacher?   N)rW   throughr+   auto_createdrT   rV   r1   r-   rG   r   r@   r   r'   )r   r7   r?   r^   re   m2m_iterrelobjs   `      r   handle_m2m_fieldzSerializer.handle_m2m_field   s     %%++88((/,,""((-225TE
 s$?DHH

!#u-H # #6"# HH(Q 9r   c                    | j                  d       | j                  j                  d|j                  |j                  j
                  j                  t        |j                  j                  j                        d       y)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   s]    A

))33<<%,,22889	
r   N)rN   
__module____qualname____doc__r   r%   r)   r:   r<   rQ   r[   rq   rT    r   r   r   r      s5    &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        |   |fi | |j                  dd      | _        t	        j
                  | j                  | j                               | _        || _	        || _
        y )Nhandle_forward_referencesF)super__init__popr~   r   parser    _make_parserevent_streamdbignore)r   stream_or_stringr{   r|   r   rM   s        r   r   zDeserializer.__init__   s[     	)5W5)05PRW)X&#MM$++t7H7H7J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 ]H  \  }}|dk(  s|j                  dk(  s| j                   j                  |       | j                  |      c S  t        )NSTART_ELEMENTr0   )r   nodeName
expandNode_handle_objectStopIteration)r   eventnodes      r   __next__zDeserializer.__next__   s[    ,, 	1KE4'DMMX,E!!,,T2**400	1 r   c                    | j                  |d      }i }|j                  d      rU|j                  j                  j	                  |j                  d            ||j                  j                  j                  <   i }i }|j                  j                         D ch c]  }|j                   }}|j                  d      D ]7  }|j                  d      }	|	st        j                  d      | j                  r|	|vr=|j                  j                  |	      }
|
j                  rt        |
j                  t         j"                        r| j%                  ||
      }|t        j&                  k(  rZ|j                  d      D cg c]8  }|j                  d      D cg c]  }t)        |      j+                          c}: c}}||
<   |||
j                  <   |
j                  rt        |
j                  t         j,                        rq| j/                  ||
      }|t        j&                  k(  r;|j                  d      D cg c]  }t)        |      j+                          c}||
<   |||
j                  <   |j                  d      rd	}n\|
j	                  t)        |      j+                               }|
j1                         d
k(  r!t3        j4                  ||
j6                        }|||
j                  <   : t        j8                  ||| j:                        }t        j<                  |||      S c c}w c c}w c c}}w c c}w )z1Convert an <object> node to a DeserializedObject.r-   r/   r?   r@   z,<field> node is missing the 'name' attributer0   rS   rE   NrA   rB   )_get_model_from_nodehasAttributer+   r/   	to_pythongetAttributerU   
get_fieldsr@   getElementsByTagNamer	   DeserializationErrorr   	get_fieldrW   
isinstancer   ManyToManyRel_handle_m2m_field_nodeDEFER_FIELDgetInnerTextstripManyToOneRel_handle_fk_field_noderF   rH   loadsdecoderbuild_instancer   DeserializedObject)r   r   Modeldatam2m_datadeferred_fieldsffield_names
field_node
field_namer?   rP   obj_nodenat_nodekr7   s                   r   r   zDeserializer._handle_object   s    ))$8 T"+0;;>>+C+C!!$',D''( ',{{'='='?@!qvv@@33G< 2	)J $008J//B  {{z<KK))*5E !!j""F$8$8' 33JFD,,, )3(G(G(Q.
 % -5,I,I),T ( )288:.OE* ,1HUZZ(##
""F$7$7) 22:uED,,, ",!@!@!K. %Q--/.OE*
 +0D'226: E!OOL,D,J,J,LME..0K? $

5emm D#(UZZ e2	)h !!%tww7 &&sHoFFs A2..s$   L4L> L9:L> M9L>c                    |j                  d      ry|j                  j                  }t        |j                  d      r'|j                  d      }|r|D cg c]  }t        |      j                          }}	  |j                  j                  | j                        j                  | }t        ||j                  j                        }|j                  j                  j                   j"                  j                  r|j"                  }|S t        |      j                         }|j                   j%                  |j                  j                        j'                  |      }|S t        |      j                         }|j                   j%                  |j                  j                        j'                  |      S c c}w # t        $ r  | j                  rt        j                  cY S  w xY w)z8
        Handle a <field> node for a ForeignKey
        rE   Nget_by_natural_keyrS   )r   rW   r-   r1   _default_managerr   r   
db_managerr   r   r   r~   r	   r   rG   r   r+   r/   r   r   )	r   r   r?   r-   keysr   field_valuer7   r9   s	            r   r   z"Deserializer._handle_fk_field_node&  s   
 $$V,&&,,Eu--/CD00;DH"Iq<?#8#8#:"IK"I"-e44?? GG,,k; %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    F>:2G %G,*G,c                     |j                   j                  j                  t        d      r fd}nfd}g }	 |j	                  d      D ]  }|j                   ||              	 |S # t        $ rL}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                 T   | j                  d      }|rZ|D cg c]  }t        |      j                          }} j                  j                        j
                  | j                  }|S j                  j                  j                  | j                  d            }|S c c}w )NrS   r/   )
r   r   r   r   r   r   r/   r+   r   r   )nr   r   r   r9   default_managerr-   r   s        r   m2m_convertz8Deserializer._handle_m2m_field_node.<locals>.m2m_convertW  s    --i8DH"Iq<?#8#8#:"IK"I,22477;++[:   #[[^^55annT6JKF #Js    B%c                 l    j                   j                  j                  | j                  d            S )Nr/   )r+   r/   r   r   )r   r-   s    r   r   z8Deserializer._handle_m2m_field_node.<locals>.m2m_converth  s%    {{~~//t0D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_nodeO  s     ""((00?$89"F 		..x8 .k!n-. M  	9!/0T5S5S'''221a88		9s$   -A2 2	C;+C&C,CCc                    |j                  |      }|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   rc   model_identifiers       r   r   z!Deserializer._get_model_from_nodew  s    
  ,,T2++==$( 	>>"233Y' 	++=="24 	s   A 6B)rN   ru   rv   rw   r
   r   r   r   r   r   r   r   __classcell__rM   s   @r   rz   rz      s6     ($KGZ'R&Pr   rz   c                 N   g }| j                   D ]  }|j                  |j                  k(  s|j                  |j                  k(  r|j	                  |j
                         Q|j                  |j                  k(  r|j                  t        |              dj                  |      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 	NNeoo-~~!9!99ejj)^^u111l51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        |   |i | | j                  t        j                  d       | j                  t        j
                  d       y )NF)r   r   
setFeaturer   feature_external_gesfeature_external_pes)r   argskwargsrM   s      r   r   zDefusedExpatParser.__init__  s=    $)&)44e<44e<r   c                     t        |||      N)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Or   c                 "    t        |d ||||      r   r   )r   r@   r	   r   r   r   s         r   unparsed_entity_declz'DefusedExpatParser.unparsed_entity_decl  s    dD%NNr   c                     t        ||||      r   )ExternalReferenceForbidden)r   contextr	   r   r   s        r   external_entity_ref_handlerz.DefusedExpatParser.external_entity_ref_handler  s    ($uEEr   c                     t        j                  |        | j                  }| j                  |_        | j
                  |_        | j                  |_        | j                  |_
        y r   )_ExpatParserreset_parserr   StartDoctypeDeclHandlerr   EntityDeclHandlerr   UnparsedEntityDeclHandlerr   ExternalEntityRefHandler)r   parsers     r   r   zDefusedExpatParser.reset  sQ    4 )-)@)@&#'#3#3 +/+D+D(*.*J*J'r   )rN   ru   rv   rw   r   r   r   r   r   r   r   r   s   @r   r   r     s*    =
/P
OFKr   r   c                       e Zd ZdZd Zy)DefusedXmlExceptionzBase exception.c                     t        |       S r   )r4   r$   s    r   __repr__zDefusedXmlException.__repr__  s    4yr   N)rN   ru   rv   rw   r   rx   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                 L    t         |           || _        || _        || _        y r   )r   r   r@   r   r   )r   r@   r   r   rM   s       r   r   zDTDForbidden.__init__  s#    	

r   c                 h    d}|j                  | 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$))TZZ<<r   rN   ru   rv   rw   r   r  r   r   s   @r   r   r     s    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                 v    t         |           || _        || _        || _        || _        || _        || _        y r   )r   r   r@   rP   r	   r   r   r   )r   r@   rP   r	   r   r   r   rM   s          r   r   zEntitiesForbidden.__init__  s9    	
	

*r   c                 h    d}|j                  | j                  | j                  | j                        S )Nz<EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})r  r  s     r   r  zEntitiesForbidden.__str__  s&    Lzz$))TZZ<<r   r  r   s   @r   r   r     s    )+=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                 Z    t         |           || _        || _        || _        || _        y r   )r   r   r   r	   r   r   )r   r   r	   r   r   rM   s        r   r   z#ExternalReferenceForbidden.__init__  s*    	

r   c                 R    d}|j                  | j                  | j                        S )Nz8ExternalReferenceForbidden(system_id='{}', public_id={}))r  r   r   r  s     r   r  z"ExternalReferenceForbidden.__str__  s     Hzz$**djj11r   r  r   s   @r   r   r     s    72r   r   ) rw   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   rz   r   r   rL   r   r   r   r   rx   r   r   <module>r     s       ;    5 ( . Qh
 h
VK4$$ K\(!K !KH* =& ==+ ="2!4 2r   