[Erp5-report] r28217 - in /erp5/trunk/products/ERP5SyncML: Conduit/ interfaces/
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Jul 30 14:12:33 CEST 2009
Author: daniele
Date: Thu Jul 30 14:12:31 2009
New Revision: 28217
URL: http://svn.erp5.org?rev=28217&view=rev
Log:
Manage call xml with xpath
Create method replaceIdFromXML with method of PointFixe
Move the method getXMLFromObjectWithId
for that the user is independant of code
Modified:
erp5/trunk/products/ERP5SyncML/Conduit/ERP5Conduit.py
erp5/trunk/products/ERP5SyncML/interfaces/conduit.py
Modified: erp5/trunk/products/ERP5SyncML/Conduit/ERP5Conduit.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5SyncML/Conduit/ERP5Conduit.py?rev=28217&r1=28216&r2=28217&view=diff
==============================================================================
--- erp5/trunk/products/ERP5SyncML/Conduit/ERP5Conduit.py [utf8] (original)
+++ erp5/trunk/products/ERP5SyncML/Conduit/ERP5Conduit.py [utf8] Thu Jul 30 14:12:31 2009
@@ -27,7 +27,7 @@
##############################################################################
from Products.ERP5SyncML.XMLSyncUtils import XMLSyncUtilsMixin
-from Products.ERP5SyncML.Subscription import Conflict
+from Products.ERP5SyncML.Conflict import Conflict
from Products.CMFCore.utils import getToolByName
from DateTime.DateTime import DateTime
from email.MIMEBase import MIMEBase
@@ -122,6 +122,7 @@
reset_workflow = 0
conflict_list = []
xml = self.convertToXml(xml)
+ #LOG('ERP5Conduit addNode:',DEBUG,etree.tostring(xml,pretty_print=True))
if xml is None:
return {'conflict_list': conflict_list, 'object': sub_object}
# In the case where this new node is a object to add
@@ -137,7 +138,7 @@
force=force,
simulate=simulate,
**kw)['conflict_list']
- elif xml.tag == 'object':
+ elif xml.xpath('local-name()') == self.xml_object_tag:
if object_id is None:
object_id = self.getAttribute(xml, 'id')
if object_id is not None:
@@ -148,7 +149,7 @@
sub_object = None
if sub_object is None: # If so, it doesn't exist
portal_type = ''
- if xml.tag == 'object':
+ if xml.xpath('local-name()') == self.xml_object_tag:
portal_type = self.getObjectType(xml)
elif xml.xpath('name()') in self.XUPDATE_INSERT_OR_ADD: # Deprecated ???
portal_type = self.getXupdateObjectType(xml) # Deprecated ???
@@ -185,12 +186,12 @@
conflict_list += self.addNode(xml=sub_xml,object=sub_object,
previous_xml=sub_previous_xml, force=force,
simulate=simulate, **kw)['conflict_list']
- elif xml.tag == self.history_tag or self.isHistoryAdd(xml)>0:
+ elif xml.xpath('local-name()') == self.history_tag or self.isHistoryAdd(xml)>0:
conflict_list += self.addWorkflowNode(object, xml, simulate)
#elif xml.tag in self.local_role_list or self.isLocalRole(xml)>0 and not simulate:
- elif xml.tag in self.local_role_list:
+ elif xml.xpath('local-name()') in self.local_role_list:
self.addLocalRoleNode(object, xml)
- elif xml.tag in self.local_permission_list:
+ elif xml.xpath('local-name()') in self.local_permission_list:
conflict_list += self.addLocalPermissionNode(object, xml)
else:
conflict_list += self.updateNode(xml=xml,object=object, force=force,
@@ -206,12 +207,15 @@
"""
# In the case where we have to delete an object
#LOG('ERP5Conduit.deleteNode', DEBUG, 'deleteNode, object path: %s' % repr(object.getPhysicalPath()))
+ #LOG('ERP5Conduit deleteNode', DEBUG,"%s" % object_id)
+ #LOG('ERP5Conduit deleteNode', DEBUG,"%s" % xml)
conflict_list = []
if xml is not None:
xml = self.convertToXml(xml)
+ #LOG('ERP5Conduit deleteNode', DEBUG,"%s" % etree.tostring(xml,pretty_print=True))
if object_id is None:
#LOG('ERP5Conduit.deleteNode', DEBUG, 'deleteNode, SubObjectDepth: %i' % self.getSubObjectDepth(xml))
- if xml.tag == self.xml_object_tag:
+ if xml.xpath('local-name()') == self.xml_object_tag:
object_id = self.getAttribute(xml,'id')
elif self.getSubObjectDepth(xml) == 1:
object_id = self.getSubObjectId(xml)
@@ -232,15 +236,15 @@
# If we are still there, this means the delete is for this node
elif xml.xpath('name()') in self.XUPDATE_DEL:
xml = self.getElementFromXupdate(xml)
- if xml.tag in self.local_role_list and not simulate:
+ if xml.xpath('local-name()') in self.local_role_list and not simulate:
# We want to del a local role
user = self.getAttribute(xml,'id')
#LOG('ERP5Conduit.deleteNode local_role: ', DEBUG, 'user: %s' % repr(user))
- if xml.tag.find(self.local_role_tag)>=0:
+ if xml.xpath('local-name()') == self.local_role_tag :
object.manage_delLocalRoles([user])
- elif xml.tag.find(self.local_group_tag)>=0:
+ elif xml.xpath('local-name()') ==self.local_group_tag :
object.manage_delLocalGroupRoles([user])
- if xml.tag in self.local_permission_list and not simulate:
+ if xml.xpath('local-name()') in self.local_permission_list and not simulate:
permission = self.getAttribute(xml,'id')
object.manage_setLocalPermissions(permission)
return conflict_list
@@ -270,6 +274,7 @@
#LOG('ERP5Conduit.updateNode', DEBUG, 'xml.tag: %s' % xml.tag)
#LOG('ERP5Conduit.updateNode, force: ', DEBUG, force)
# we have an xupdate xml
+ #LOG('ERP5Conduit updateNode', DEBUG, "%s" % etree.tostring(xml,pretty_print=True))
if xml.xpath('name()') == 'xupdate:modifications':
conflict_list += self.applyXupdate(object=object,
xupdate=xml,
@@ -316,7 +321,7 @@
**kw)
return conflict_list
if keyword is None: # This is not a selection, directly the property
- keyword = xml.tag
+ keyword = xml.xpath('name()')
if not (keyword in self.NOT_EDITABLE_PROPERTY):
# We will look for the data to enter
data_type = object.getPropertyType(keyword)
@@ -423,19 +428,6 @@
force=force,
simulate=simulate,
**kw)
- elif previous_xml is None and xml is not None and sub_object_id is not None:
- sub_object = None
- try:
- sub_object = object[sub_object_id]
- except KeyError:
- pass
- if sub_object is not None:
- sub_xml = self.getSubObjectXupdate(xml)
- conflict_list += self.updateNode(xml=sub_xml,
- object=sub_object,
- force=force,
- simulate=simulate,
- **kw)
return conflict_list
security.declareProtected(Permissions.AccessContentsInformation,
@@ -489,6 +481,7 @@
This will change the xml in order to change the update
from the object to the subobject
"""
+ # XXX sometimes problems not resolve
from copy import deepcopy
xml_copy = deepcopy(xml)
self.changeSubObjectSelect(xml_copy)
@@ -611,7 +604,7 @@
"""
xml = self.convertToXml(xml)
for subnode in xml:
- if subnode.tag == self.xml_object_tag:
+ if subnode.xpath('local-name()') == self.xml_object_tag:
if object_id == self.getAttribute(subnode, 'id'):
return subnode
return None
@@ -631,9 +624,52 @@
xml = self.convertToXml(xml)
# document, with childNodes[0] a DocumentType and childNodes[1] the Element Node
for subnode in xml:
- if subnode.tag == property:
+ if subnode.xpath('local-name()') == property:
return self.convertXmlValue(subnode)
return None
+
+ def replaceIdFromXML(self, xml, new_id):
+ """
+ return a xml with id replace by a new id
+ """
+ if xml is not None and new_id is not None :
+ xml = etree.XML(xml)
+ #copy of xml object for modification
+ from copy import deepcopy
+ xml_copy = deepcopy(xml)
+ object_element = xml_copy.find('object')
+ object_element.attrib['id'] = new_id
+ id_element = object_element.find('id')
+ id_element.text = new_id
+ return xml_copy
+
+ def getXMLFromObjectWithId(self, object, xml_mapping):
+ """
+ return the xml with Id of Object
+ """
+ xml = ''
+ if xml_mapping is None:
+ return xml
+ func = getattr(object, xml_mapping, None)
+ if func is not None:
+ xml = func()
+ return xml
+
+ def getXMLFromObjectWithGid(self, object, gid, xml_mapping=None):
+ """
+ return the xml with Gid of Object
+ """
+ xml_id = self.getXMLFromObjectWithId(object, xml_mapping)
+ xml_gid = self.replaceIdFromXML(xml_id, gid)
+ return etree.tostring(xml_gid)
+
+ def getXMLFromObjectWithRid(self, object, rid, xml_mapping=None):
+ """
+ return the xml with Rid of Object
+ """
+ xml_id = self.getXMLFromObjectWithId(object, xml_mapping)
+ xml_rid = self.replaceIdFromXML(xml_id, rid)
+ return etree.tostring(xml_rid)
security.declareProtected(Permissions.AccessContentsInformation,'convertToXml')
def convertToXml(self, xml):
@@ -646,7 +682,7 @@
xml = xml.encode('utf-8')
xml = etree.XML(xml, parser=parser)
# If we have the xml from the node erp5, we just take the subnode
- if xml.tag == 'erp5':
+ if xml.xpath('local-name()') == 'erp5':
xml = xml[0]
return xml
@@ -688,16 +724,16 @@
object.manage_delLocalRoles(user_role_list)
if getattr(object, 'workflow_history', None) is not None and reset_workflow:
object.workflow_history = PersistentMapping()
- if xml.tag.find('xupdate') >= 0:
+ if xml.xpath('name()').find('xupdate') >= 0:
xml = xml[0]
for subnode in xml.xpath('*'):
#get only Element nodes (not Comments or Processing instructions)
- if subnode.tag not in self.NOT_EDITABLE_PROPERTY:
+ if subnode.xpath('name()') not in self.NOT_EDITABLE_PROPERTY:
keyword_type = self.getPropertyType(subnode)
# This is the case where the property is a list
- keyword = subnode.tag
+ keyword = subnode.xpath('name()')
args[keyword] = self.convertXmlValue(subnode, keyword_type)
- elif subnode.tag in self.ADDABLE_PROPERTY + (self.xml_object_tag,):
+ elif subnode.xpath('local-name()') in self.ADDABLE_PROPERTY + (self.xml_object_tag,):
self.addNode(object=object, xml=subnode, force=1)
# We should first edit the object
args = self.getFormatedArgs(args=args)
@@ -724,7 +760,7 @@
"""
status = {}
for subnode in xml:
- keyword = subnode.tag
+ keyword = subnode.xpath('name()')
value = self.getObjectProperty(keyword, xml)
status[keyword] = value
return status
@@ -791,7 +827,7 @@
action_list.append(xml)
return action_list
for subnode in xml:
- if subnode.tag == self.action_tag:
+ if subnode.xpath('local-name()') == self.action_tag:
action_list.append(subnode)
return action_list
@@ -851,6 +887,7 @@
conflict_list = []
if isinstance(xupdate, (str, unicode)):
xupdate = etree.XML(xupdate, parser=parser)
+ #LOG("applyXupdate xupdate",debug, "%s" % etree.tostring(xupdate,pretty_print=True))
for subnode in xupdate:
sub_xupdate = self.getSubObjectXupdate(subnode)
selection_name = ''
@@ -901,7 +938,6 @@
own Conduit.
"""
#LOG('ERP5Conduit.addNode',0,'portal_type: |%s|' % str(portal_type))
-
object.newContent(portal_type=portal_type, id=object_id)
subobject = object._getOb(object_id)
return subobject, 1, 1
@@ -955,9 +991,9 @@
#LOG('local_role: ',0,'user: %s roles: %s' % (repr(user),repr(roles)))
#user = roles[0]
#roles = roles[1:]
- if xml.tag.find(self.local_role_tag) >= 0:
+ if xml.xpath('local-name()') == self.local_role_tag :
object.manage_setLocalRoles(user, roles)
- elif xml.tag.find(self.local_group_tag) >= 0:
+ elif xml.xpath('local-name()') == self.local_group_tag :
object.manage_setLocalGroupRoles(user, roles)
security.declareProtected(Permissions.ModifyPortalContent, 'addLocalPermissionNode')
@@ -978,7 +1014,7 @@
#LOG('local_role: ',0,'permission: %s roles: %s' % (repr(permission),repr(roles)))
#user = roles[0]
#roles = roles[1:]
- if xml.tag.find(self.local_permission_tag) >= 0:
+ if xml.xpath('local-name()') == self.local_permission_tag :
object.manage_setLocalPermissions(permission, roles)
return conflict_list
@@ -1010,9 +1046,12 @@
"""
return object.getId()
- #def getGidFromXML(self, xml, gid_from_xml_list):
- #"""
- #return the Gid composed with xml informations
- #"""
- #return None
-
+# def getGidFromXML(self, xml, namespace, gid_from_xml_list):
+# """
+# return the Gid composed with xml informations
+# """
+# gid = xml.xpath('string(.//syncml:id)')
+# if gid in gid_from_xml_list or gid == ' ':
+# return False
+# return gid
+
Modified: erp5/trunk/products/ERP5SyncML/interfaces/conduit.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5SyncML/interfaces/conduit.py?rev=28217&r1=28216&r2=28217&view=diff
==============================================================================
--- erp5/trunk/products/ERP5SyncML/interfaces/conduit.py [utf8] (original)
+++ erp5/trunk/products/ERP5SyncML/interfaces/conduit.py [utf8] Thu Jul 30 14:12:31 2009
@@ -121,7 +121,7 @@
return the Gid composed with the object informations
"""
- def getGidFromXML(self, xml, gid_from_xml_list):
+ def getGidFromXML(self, xml, namespace, gid_from_xml_list):
"""
return the Gid composed with xml informations
- """
+ """
More information about the Erp5-report
mailing list