o aiC@sdZddlZddlmZddlmZddlmZddl m Z ddl m Z ddl mZdd lmZdd lmZmZdd lmZmZGd d d ejZGdddejZddZGdddeZGdddeZGdddeZGdddeZGdddeZdS)z XML serializer. N)pulldom)handler) ExpatParser)apps)settings)ObjectDoesNotExist)base)DEFAULT_DB_ALIASmodels)SimplerXMLGeneratorUnserializableContentErrorc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS) SerializerzSerialize a QuerySet to XML.cCs8|jddur|jdd|jd|dSdS)Nindent  )optionsgetxmlignorableWhitespace)selflevelrH/usr/lib/python3/dist-packages/django/core/serializers/xml_serializer.pyrs$zSerializer.indentcCs:t|j|jdtj|_|j|jdddidS)zT Start serialization -- open the XML document and the root element. encodingdjango-objectsversionz1.0N) r streamrrrDEFAULT_CHARSETr startDocument startElementrrrrstart_serializations zSerializer.start_serializationcCs$|d|jd|jdS)z8 End serialization -- end the document. rrN)rr endElement endDocumentr rrrend_serialization"s  zSerializer.end_serializationcCspt|dstdt||ddt|ji}|jr"t|ds/|j}|dur/t||d<|j d|dS) z3 Called as each object is handled. _metaz6Non-model object (%s) encountered during serializationmodel natural_keyNpkobject) hasattrrSerializationErrortyperstrr%use_natural_primary_keysr)rr)robjattrsobj_pkrrr start_object*s   zSerializer.start_objectcCs|d|jddS)zA Called after handling all fields for an object. r&r*N)rrr")rr0rrr end_object:s zSerializer.end_objectcCs|d|jd|j|dt||jdurJ||}|dkr-tj||j d}z|j |Wnt yIt d|j j|j|jfw|jd|jddS) zg Handle each field on an object (except for ForeignKeys and ManyToManyFields). field)namer-N JSONFieldclsz0%s.%s (pk:%s) contains unserializable charactersNone)rrrr7get_internal_typegetattrvalue_to_stringjsondumpsencoder charactersr ValueError __class____name__r)addQuickElementr")rr0r6valuerrr handle_fieldAs$     zSerializer.handle_fieldcCs||t||}|durH|jr?t|jjdr?t||j}|}|D]}|j di|j t ||j dq&n|j t |n|j d|j ddS)zq Handle a ForeignKey (they need to be treated slightly differently from regular fields). Nr(naturalr;r6)_start_relational_fieldr= get_attnameuse_natural_foreign_keysr+ remote_fieldr'r7r(rrrBr.r"rF)rr0r6 related_attrelated key_valuerrrhandle_fk_field]s   zSerializer.handle_fk_fieldcs|jjjjrD|jrt|jjdrfdd}nfdd}t|di |j t||j  }|D]}||q5j ddSdS)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(csZ|}jdi|D]}jdijt|jdq jddS)Nr*rI)r(rrrBr.r")rGrIrPr rr handle_m2m~sz/Serializer.handle_m2m_field..handle_m2mcsjjddt|jiddS)Nr*r))r1)rrFr.r))rGr rrrRs  _prefetched_objects_cacher6N)rMthroughr% auto_createdrJrLr+r'r=rr7iteratorrr")rr0r6rRm2m_iterrelobjrr rhandle_m2m_fieldts    zSerializer.handle_m2m_fieldcCs6|d|jd|j|jjjt|jjj ddS)z1Output the element for relational fields.r5r6)r7reltoN) rrrr7rMrDrEr.r'r%)rr6rrrrJs   z"Serializer._start_relational_fieldN) rE __module__ __qualname____doc__rr!r$r3r4rHrQrYrJrrrrr s !r csXeZdZdZeddfdd ZddZdd Zd d Zd d Z ddZ ddZ Z S) DeserializerzDeserialize XML.F)usingignorenonexistentc sFtj|fi||dd|_t|j||_||_ ||_ dS)Nhandle_forward_referencesF) super__init__poprbrparser _make_parser event_streamdbignore)rstream_or_stringr`rarrDrrrds  zDeserializer.__init__cCstS)z;Create a hardened XML parser (no custom/external entities).)DefusedExpatParserr rrrrgszDeserializer._make_parsercCs@|jD]\}}|dkr|jdkr|j|||Sqt)N START_ELEMENTr*)rhnodeName expandNode_handle_object StopIteration)reventnoderrr__next__s  zDeserializer.__next__c Cs||d}i}|dr|jj|d||jjj<i}i}dd|jD}|dD]}|d}|s=t d|j rE||vrEq/|j |} | j rst| j tjrs||| } | t jkrmdd |d D|| <q/| || j<q/| j rt| j tjr||| } | t jkrd d |d D|| <q/| || j<q/|d rd} n| t|} | dkrtj| | jd} | || j<q/t |||j} t | ||S)z1Convert an node to a DeserializedObject.r'r)cSsh|]}|jqSr)r7).0frrr sz.Deserializer._handle_object..r6r7z, node is missing the 'name' attributecSs g|] }dd|dDqS)cSg|]}t|qSr getInnerTextstrip)rvnat_noderrr  z:Deserializer._handle_object...rI)getElementsByTagName)rvobj_noderrrr~s z/Deserializer._handle_object..r*cSryrrzrvkrrrr~rrIr;Nr8r9)_get_model_from_node hasAttributer%r) to_python getAttributeattname get_fieldsrrDeserializationErrorrj get_fieldrM isinstancer ManyToManyRel_handle_m2m_field_node DEFER_FIELDr7 ManyToOneRel_handle_fk_field_noder{r|r<r?loadsdecoderbuild_instanceriDeserializedObject) rrtModeldatam2m_datadeferred_fields field_names field_node field_namer6rGr0rrrrqsL              zDeserializer._handle_objectcCs|drdS|jj}t|jdrb|d}|rOdd|D}z |j|jj|}Wnty;|j r:t j YSwt ||jj }|jjjjjrM|j}|St|}|j|jj |}|St|}|j|jj |S)z8 Handle a node for a ForeignKey r;Nget_by_natural_keyrIcSryrrzrrrrr~z6Deserializer._handle_fk_field_node..)rrMr'r+_default_manager db_managerrirrrbrrr=rr%r)r{r|rr)rrtr6r'keys field_valuer0r2rrrrs.       z"Deserializer._handle_fk_field_nodec s|jjjtdrfdd}nfdd}g}z|dD] }|||q#W|StyR}zt|trHj rHt j WYd}~St ||d}~ww)z> Handle a node for a ManyToManyField. rcsL|d}|rdd|D}jj|j}|Sjj|d}|S)NrIcSryrrzrrrrr~(rzLDeserializer._handle_m2m_field_node..m2m_convert..r))rrrirr)r%rr)nrrr2default_managerr'rrr m2m_convert$s z8Deserializer._handle_m2m_field_node..m2m_convertcsjj|dS)Nr))r%r)rr)r)r'rrr/sr*N) rMr'rr+rappend ExceptionrrrbrrM2MDeserializationError)rrtr6rvaluescerrrrs"   z#Deserializer._handle_m2m_field_nodec CsV||}|std|j|fzt|WSttfy*td|j|fw)ze Look up a model from a or a node. z0<%s> node is missing the required '%s' attributez,<%s> node has invalid model identifier: '%s')rrrror get_model LookupError TypeError)rrtattrmodel_identifierrrrr=s  z!Deserializer._get_model_from_node) rEr\r]r^r rdrgrurqrrr __classcell__rrrlrr_sF# r_cCs^g}|jD]$}|j|jks|j|jkr||jq|j|jkr(|t|q qd |S)z3Get all the inner text of a DOM node (recursively).) childNodesnodeType TEXT_NODECDATA_SECTION_NODErr ELEMENT_NODEextendr{join)rt inner_textchildrrrr{Os   r{csHeZdZdZfddZddZddZdd Zd d Zd d Z Z S)rmzi An expat parser hardened against XML bomb attacks. Forbid DTDs, external entity references cs2tj|i||tjd|tjddS)NF)rcrd setFeaturerfeature_external_gesfeature_external_pes)rargskwargsrlrrrdfszDefusedExpatParser.__init__cCs t|||N) DTDForbidden)rr7sysidpubidhas_internal_subsetrrrstart_doctype_declks z%DefusedExpatParser.start_doctype_declcCst||||||rEntitiesForbidden)rr7is_parameter_entityrGrrr notation_namerrr entity_declnzDefusedExpatParser.entity_declcCst|d||||rr)rr7rrrrrrrunparsed_entity_declrrz'DefusedExpatParser.unparsed_entity_declcCst||||r)ExternalReferenceForbiddenrcontextrrrrrrexternal_entity_ref_handlervsz.DefusedExpatParser.external_entity_ref_handlercCs4t||j}|j|_|j|_|j|_|j |_ dSr) _ExpatParserreset_parserrStartDoctypeDeclHandlerrEntityDeclHandlerrUnparsedEntityDeclHandlerrExternalEntityRefHandler)rparserrrrrys  zDefusedExpatParser.reset) rEr\r]r^rdrrrrrrrrrlrrm`s rmc@seZdZdZddZdS)DefusedXmlExceptionzBase exception.cCst|Sr)r.r rrr__repr__szDefusedXmlException.__repr__N)rEr\r]r^rrrrrrs rc(eZdZdZfddZddZZS)rz&Document type definition is forbidden.cs t||_||_||_dSr)rcrdr7rr)rr7rrrlrrrds  zDTDForbidden.__init__cCd}||j|j|jS)Nz7DTDForbidden(name='{}', system_id={!r}, public_id={!r})formatr7rrrtplrrr__str__zDTDForbidden.__str__rEr\r]r^rdrrrrrlrrs rcr)rzEntity definition is forbidden.cs2t||_||_||_||_||_||_dSr)rcrdr7rGrrrr)rr7rGrrrrrlrrrds  zEntitiesForbidden.__init__cCr)Nzs*        1"