From 2279bf7699160bb005df344595c4171d3fcf6ddc Mon Sep 17 00:00:00 2001 From: Nicolas Delaby <nicolas@nexedi.com> Date: Thu, 23 Aug 2007 09:51:27 +0000 Subject: [PATCH] Code typo improvements, bug fix on reset, hide logs for better performance git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@15796 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5SyncML/Conduit/ERP5Conduit.py | 50 +++---- product/ERP5SyncML/Publication.py | 2 +- .../ERP5SyncML/PublicationSynchronization.py | 70 +-------- product/ERP5SyncML/Subscription.py | 71 +++------- .../ERP5SyncML/SubscriptionSynchronization.py | 48 ------- product/ERP5SyncML/SynchronizationTool.py | 134 +++++++++--------- 6 files changed, 116 insertions(+), 259 deletions(-) diff --git a/product/ERP5SyncML/Conduit/ERP5Conduit.py b/product/ERP5SyncML/Conduit/ERP5Conduit.py index 952651c289..ebfea53978 100644 --- a/product/ERP5SyncML/Conduit/ERP5Conduit.py +++ b/product/ERP5SyncML/Conduit/ERP5Conduit.py @@ -177,7 +177,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): if previous_xml is not None and sub_object_id is not None: # Find the previous xml corresponding to this subobject sub_previous_xml = self.getSubObjectXml(sub_object_id, previous_xml) - LOG('addNode', DEBUG,'isSubObjectModification sub_previous_xml: %s' % str(sub_previous_xml)) + #LOG('addNode', DEBUG,'isSubObjectModification sub_previous_xml: %s' % str(sub_previous_xml)) if sub_previous_xml is not None: sub_object = None try: @@ -185,11 +185,11 @@ class ERP5Conduit(XMLSyncUtilsMixin): except (AttributeError, KeyError, TypeError): pass if sub_object is not None: - LOG('addNode', DEBUG, 'subobject.id: %s' % sub_object.id) + #LOG('addNode', DEBUG, 'subobject.id: %s' % sub_object.id) # Change the xml in order to directly apply # modifications to the subobject sub_xml = self.getSubObjectXupdate(xml) - LOG('addNode', DEBUG, 'sub_xml: %s' % str(sub_xml)) + #LOG('addNode', DEBUG, 'sub_xml: %s' % str(sub_xml)) # Then do the udpate conflict_list += self.addNode(xml=sub_xml,object=sub_object, previous_xml=sub_previous_xml, force=force, @@ -214,12 +214,12 @@ class ERP5Conduit(XMLSyncUtilsMixin): A node is deleted """ # 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, 'deleteNode, object path: %s' % repr(object.getPhysicalPath())) conflict_list = [] if xml is not None: xml = self.convertToXml(xml) if object_id is None: - LOG('ERP5Conduit.deleteNode', DEBUG, 'deleteNode, SubObjectDepth: %i' % self.getSubObjectDepth(xml)) + #LOG('ERP5Conduit.deleteNode', DEBUG, 'deleteNode, SubObjectDepth: %i' % self.getSubObjectDepth(xml)) if xml.nodeName == self.xml_object_tag: object_id = self.getAttribute(xml,'id') elif self.getSubObjectDepth(xml)==1: @@ -233,7 +233,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): conflict_list += self.deleteNode(xml=sub_xml,object=sub_object, force=force, simulate=simulate, **kw) except (KeyError, AttributeError, TypeError): - LOG('ERP5Conduit.deleteNode', DEBUG, 'deleteNode, Unable to delete SubObject: %s' % str(sub_object_id)) + #LOG('ERP5Conduit.deleteNode', DEBUG, 'deleteNode, Unable to delete SubObject: %s' % str(sub_object_id)) pass if object_id is not None: # We do have an object_id self.deleteObject(object, object_id) @@ -244,7 +244,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): if xml.nodeName 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)) + #LOG('ERP5Conduit.deleteNode local_role: ', DEBUG, 'user: %s' % repr(user)) if xml.nodeName.find(self.local_role_tag)>=0: object.manage_delLocalRoles([user]) elif xml.nodeName.find(self.local_group_tag)>=0: @@ -259,7 +259,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): try: object._delObject(object_id) except (AttributeError, KeyError): - LOG('ERP5Conduit.deleteObject', DEBUG, 'Unable to delete: %s' % str(object_id)) + #LOG('ERP5Conduit.deleteObject', DEBUG, 'Unable to delete: %s' % str(object_id)) pass security.declareProtected(Permissions.ModifyPortalContent, 'updateNode') @@ -274,8 +274,8 @@ class ERP5Conduit(XMLSyncUtilsMixin): """ conflict_list = [] xml = self.convertToXml(xml) - LOG('ERP5Conduit.updateNode', DEBUG, 'xml.nodeName: %s' % xml.nodeName) - LOG('ERP5Conduit.updateNode, force: ', DEBUG, force) + #LOG('ERP5Conduit.updateNode', DEBUG, 'xml.nodeName: %s' % xml.nodeName) + #LOG('ERP5Conduit.updateNode, force: ', DEBUG, force) # we have an xupdate xml if xml.nodeName == 'xupdate:modifications': conflict_list += self.applyXupdate(object=object, xupdate=xml, @@ -332,7 +332,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): if not (keyword in self.NOT_EDITABLE_PROPERTY): # We will look for the data to enter data_type = object.getPropertyType(keyword) - LOG('ERP5Conduit.updateNode', DEBUG, 'data_type: %s for keyword: %s' % (str(data_type), keyword)) + #LOG('ERP5Conduit.updateNode', DEBUG, 'data_type: %s for keyword: %s' % (str(data_type), keyword)) data = self.convertXmlValue(data,data_type=data_type) args[keyword] = data args = self.getFormatedArgs(args=args) @@ -349,12 +349,12 @@ class ERP5Conduit(XMLSyncUtilsMixin): data_type=data_type) #current_data = object.getProperty(keyword) current_data = self.getProperty(object, keyword) - LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict data: %s' % str(data)) - LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict old_data: %s' % str(old_data)) - LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict current_data: %s' % str(current_data)) + #LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict data: %s' % str(data)) + #LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict old_data: %s' % str(old_data)) + #LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict current_data: %s' % str(current_data)) if (old_data != current_data) and (data != current_data) \ and keyword not in self.force_conflict_list: - LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict on : %s' % keyword) + #LOG('ERP5Conduit.updateNode', DEBUG, 'Conflict on : %s' % keyword) # Hack in order to get the synchronization working for demo # XXX this have to be removed after #if not (data_type in self.binary_type_list): @@ -398,10 +398,10 @@ class ERP5Conduit(XMLSyncUtilsMixin): # We should find the object corresponding to # this update, so we have to look in the previous_xml sub_object_id = self.getSubObjectId(xml) - LOG('ERP5Conduit.updateNode', DEBUG,'isSubObjectModification sub_object_id: %s' % sub_object_id) + #LOG('ERP5Conduit.updateNode', DEBUG,'isSubObjectModification sub_object_id: %s' % sub_object_id) if previous_xml is not None and sub_object_id is not None: sub_previous_xml = self.getSubObjectXml(sub_object_id,previous_xml) - LOG('ERP5Conduit.updateNode', DEBUG, 'isSubObjectModification sub_previous_xml: %s' % str(sub_previous_xml)) + #LOG('ERP5Conduit.updateNode', DEBUG, 'isSubObjectModification sub_previous_xml: %s' % str(sub_previous_xml)) if sub_previous_xml is not None: sub_object = None try: @@ -409,11 +409,11 @@ class ERP5Conduit(XMLSyncUtilsMixin): except KeyError: pass if sub_object is not None: - LOG('ERP5Conduit.updateNode', DEBUG, 'subobject.id: %s' % sub_object.id) + #LOG('ERP5Conduit.updateNode', DEBUG, 'subobject.id: %s' % sub_object.id) # Change the xml in order to directly apply # modifications to the subobject sub_xml = self.getSubObjectXupdate(xml) - LOG('ERP5Conduit.updateNode', DEBUG, 'sub_xml: %s' % str(sub_xml)) + #LOG('ERP5Conduit.updateNode', DEBUG, 'sub_xml: %s' % str(sub_xml)) # Then do the udpate conflict_list += self.updateNode(xml=sub_xml, object=sub_object, force=force, previous_xml=sub_previous_xml, @@ -470,7 +470,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): data = data.encode(self.getEncoding()) data = data.replace('@@@','\n') if keyword == 'binary_data': - LOG('ERP5Conduit.getFormatedArgs', DEBUG, 'binary_data keyword: %s' % str(keyword)) + #LOG('ERP5Conduit.getFormatedArgs', DEBUG, 'binary_data keyword: %s' % str(keyword)) msg = MIMEBase('application','octet-stream') Encoders.encode_base64(msg) msg.set_payload(data) @@ -1173,9 +1173,9 @@ class ERP5Conduit(XMLSyncUtilsMixin): """ return object.getId() - def getGidFromXML(self, xml, gid_from_xml_list): - """ - return the Gid composed with xml informations - """ - return None + #def getGidFromXML(self, xml, gid_from_xml_list): + #""" + #return the Gid composed with xml informations + #""" + #return None diff --git a/product/ERP5SyncML/Publication.py b/product/ERP5SyncML/Publication.py index 30573d8687..518a0e5b7a 100644 --- a/product/ERP5SyncML/Publication.py +++ b/product/ERP5SyncML/Publication.py @@ -230,7 +230,7 @@ class Publication(Subscription): Reset all subscribers """ for o in self.getSubscriberList(): - self.activate().manage_delObjects(o.id) + self.activate(activity='SQLQueue').manage_delObjects(o.id) def getConflictList(self): """ diff --git a/product/ERP5SyncML/PublicationSynchronization.py b/product/ERP5SyncML/PublicationSynchronization.py index 75c8af2f35..3a26da73a5 100644 --- a/product/ERP5SyncML/PublicationSynchronization.py +++ b/product/ERP5SyncML/PublicationSynchronization.py @@ -90,7 +90,7 @@ class PublicationSynchronization(XMLSyncUtils): next_anchor) if subscriber.getNextAnchor() != last_anchor: if last_anchor in (None, ''): - LOG('PubSyncInit', DEBUG, 'anchor null') + LOG('PubSyncInit', INFO, 'anchor null') else: message = "bad anchors in PubSyncInit! " + \ subscriber.getNextAnchor() + " and " + last_anchor @@ -200,74 +200,6 @@ class PublicationSynchronization(XMLSyncUtils): return {'has_response':1, 'xml':xml_a} - - def PubSync(self, publication_path, msg=None, RESPONSE=None, subscriber=None): - """ - This is the synchronization method for the server - """ - LOG('PubSync', DEBUG, 'Starting... publication: %s' % (publication_path)) - # Read the request from the client - publication = self.unrestrictedTraverse(publication_path) - xml_client = msg - if xml_client is None: - xml_client = self.readResponse(from_url=publication.getPublicationUrl()) - LOG('PubSync', DEBUG, 'Starting... msg: %s' % str(xml_client)) - result = None - - if xml_client is not None: - if isinstance(xml_client, str) or isinstance(xml_client, unicode): - xml_client = Parse(xml_client) - first_node = xml_client.childNodes[0] - - if first_node.nodeName != "SyncML": - LOG('PubSync', INFO, 'This is not a SyncML Message') - raise ValueError, "Sorry, This is not a SyncML Message" - alert_code = self.getAlertCodeFromXML(xml_client) - # Get informations from the header - client_header = first_node.childNodes[1] - if client_header.nodeName != "SyncHdr": - LOG('PubSync', INFO, 'This is not a SyncML Header') - raise ValueError, "Sorry, This is not a SyncML Header" - subscription_url = self.getSubscriptionUrl(client_header) - # Get the subscriber or create it if not already in the list - subscriber = publication.getSubscriber(subscription_url) - if subscriber == None: - subscriber = Subscriber(publication.generateNewId(),subscription_url) - subscriber.setXMLMapping(publication.getXMLMapping()) - subscriber.setConduit(publication.getConduit()) - publication.addSubscriber(subscriber) - # first synchronization - result = self.PubSyncInit(publication,xml_client,subscriber=subscriber, - sync_type=self.SLOW_SYNC) - elif self.checkAlert(xml_client) and \ - alert_code in (self.TWO_WAY, self.SLOW_SYNC, \ - self.ONE_WAY_FROM_SERVER): - subscriber.setXMLMapping(publication.getXMLMapping()) - subscriber.setConduit(publication.getConduit()) - result = self.PubSyncInit(publication=publication, - xml_client=xml_client, subscriber=subscriber, sync_type=alert_code) - else: - #we log the user authenticated to do the synchronization with him - if self.checkMap(xml_client) : - self.setRidWithMap(xml_client, subscriber) - if subscriber.isAuthenticated(): - uf = self.getPortalObject().acl_users - user = uf.getUserById(subscriber.getUser()).__of__(uf) - newSecurityManager(None, user) - result = self.PubSyncModif(publication, xml_client) - else: - result = self.PubSyncModif(publication, xml_client) - elif subscriber is not None: - # This looks like we are starting a synchronization after - # a conflict resolution by the user - result = self.PubSyncInit(publication=publication, xml_client=None, - subscriber=subscriber, sync_type=self.TWO_WAY) - - if RESPONSE is not None: - RESPONSE.redirect('managePublications') - elif result is not None: - return result - def PubSyncModif(self, publication, xml_client): """ The modidification message for the publication diff --git a/product/ERP5SyncML/Subscription.py b/product/ERP5SyncML/Subscription.py index f14ff7a17f..43bf763478 100644 --- a/product/ERP5SyncML/Subscription.py +++ b/product/ERP5SyncML/Subscription.py @@ -262,7 +262,6 @@ class Signature(Folder, SyncCode): else: self.setPath(None) self.setId(id) - self.setGid(id) self.setRid(rid) self.status = status self.setXML(xml_string) @@ -468,19 +467,11 @@ class Signature(Folder, SyncCode): """ return self.id - def setGid(self, gid): - """ - set the gid - """ - if gid is type(u'a'): - gid = gid.encode('utf-8') - self.gid = gid - def getGid(self): """ get the gid """ - return self.gid + return self.getId() def setObjectId(self, id): """ @@ -503,6 +494,8 @@ class Signature(Folder, SyncCode): """ if type(xml) is type(u'a'): xml = xml.encode('utf-8') + if xml is not None: + xml = self.xml.replace('@-@@-@','--') # need to put back '--' self.partial_xml = xml def getPartialXML(self): @@ -510,9 +503,6 @@ class Signature(Folder, SyncCode): Set the partial string we will have to deliver in the future """ - #LOG('Subscriber.getPartialXML', DEBUG, 'partial_xml: %s' % str(self.partial_xml)) - if self.partial_xml is not None: - self.partial_xml = self.partial_xml.replace('@-@@-@','--') # need to put back '--' return self.partial_xml def getAction(self): @@ -531,11 +521,10 @@ class Signature(Folder, SyncCode): """ Return the actual action for a partial synchronization """ - conflict_list = [] + returned_conflict_list = [] if len(self.conflict_list)>0: - for conflict in self.conflict_list: - conflict_list += [conflict] - return conflict_list + returned_conflict_list.extend(self.conflict_list) + return returned_conflict_list def resetConflictList(self): """ @@ -547,7 +536,7 @@ class Signature(Folder, SyncCode): """ Return the actual action for a partial synchronization """ - if conflict_list is None or conflict_list==[]: + if conflict_list is None or conflict_list == []: self.resetConflictList() else: self.conflict_list = conflict_list @@ -556,7 +545,6 @@ class Signature(Folder, SyncCode): """ Return the actual action for a partial synchronization """ - LOG('delConflict, conflict', DEBUG, conflict) conflict_list = [] for c in self.getConflictList(): #LOG('delConflict, c==conflict',0,c==aq_base(conflict)) @@ -774,7 +762,7 @@ class Subscription(Folder, XMLSyncUtils): # LOG('getSignature', DEBUG, 'signatures_status: %s' % str(dict_sign)) # XXXXXXXXXXXXXXXXXXXXXXXXXXXXX code = self.SLOW_SYNC - if len(self.getSignatureList()) > 0: + if len(self.getSignatureList()[:1]) > 0: code = self.getAlertCode() if default is not None: code = default @@ -825,8 +813,8 @@ class Subscription(Folder, XMLSyncUtils): return True if the message id was not seen, False if already seen """ last_message_id = getattr(self,'last_message_id',None) - LOG('checkCorrectRemoteMessageId last_message_id = ', DEBUG, last_message_id) - LOG('checkCorrectRemoteMessageId message_id = ', DEBUG, message_id) + #LOG('checkCorrectRemoteMessageId last_message_id = ', DEBUG, last_message_id) + #LOG('checkCorrectRemoteMessageId message_id = ', DEBUG, message_id) if last_message_id == message_id: return False self.last_message_id = message_id @@ -1015,7 +1003,7 @@ class Subscription(Folder, XMLSyncUtils): if authentication_format in (None, ''): self.authentication_format = 'b64' else: - self.authentication_format=authentication_format + self.authentication_format = authentication_format def setAuthenticationType(self, authentication_type): """ @@ -1034,22 +1022,13 @@ class Subscription(Folder, XMLSyncUtils): conduit_name = self.getConduit() conduit = self.getConduitByName(conduit_name) gid_gen = getattr(conduit, 'getGidFromObject', None) - LOG('getGidFromObject, Conduit :', DEBUG, conduit_name) - LOG('getGidFromObject, gid_gen:', DEBUG, gid_gen) if callable(gid_gen): o_gid = gid_gen(object) else: raise ValueError, "The conduit "+conduit_name+"seems to not have a \ getGidFromObject method and it must" -# elif getattr(o_base, gid_gen, None) is not None: -# generator = getattr(object, gid_gen) -# o_gid = generator() # XXX - used to be o_gid = generator(object=object) which is redundant -# elif gid_gen is not None: -# # It might be a script python -# generator = getattr(object,gid_gen) -# o_gid = generator() # XXX - used to be o_gid = generator(object=object) which is redundant o_gid = b16encode(o_gid) - LOG('getGidFromObject returning', DEBUG, o_gid) + #LOG('getGidFromObject returning', DEBUG, o_gid) return o_gid def getObjectFromGid(self, gid): @@ -1074,17 +1053,17 @@ class Subscription(Folder, XMLSyncUtils): o_id = signature.getObjectId() #try with id param too, because gid is not catalogged object_list = self.getObjectList(gid = b16decode(gid), id = o_id) - LOG('getObjectFromGid :', DEBUG, 'object_list=%s, gid=%s, o_id=%s' % (object_list, gid, o_id)) + #LOG('getObjectFromGid :', DEBUG, 'object_list=%s, gid=%s, o_id=%s' % (object_list, gid, o_id)) if o is not None and o in object_list: return o #LOG('entering in the slow loop of getObjectFromGid !!!',0,'') object_list = self.getObjectList(gid = b16decode(gid)) - LOG('getObjectFromGid :', DEBUG, 'object_list slow loop=%s, gid=%s' % (object_list, gid)) + #LOG('getObjectFromGid :', DEBUG, 'object_list slow loop=%s, gid=%s' % (object_list, gid)) for o in object_list: o_gid = self.getGidFromObject(o) if o_gid == gid: return o - LOG('getObjectFromGid', DEBUG, 'returning None') + #LOG('getObjectFromGid', DEBUG, 'returning None') return None def getObjectFromId(self, id): @@ -1149,7 +1128,7 @@ class Subscription(Folder, XMLSyncUtils): # This is probably a python script generator = getattr(object, id_generator) new_id = generator(object=object, gid=gid) - LOG('generateNewId, new_id: ', DEBUG, new_id) + #LOG('generateNewId, new_id: ', DEBUG, new_id) return new_id return None @@ -1335,23 +1314,11 @@ class Subscription(Folder, XMLSyncUtils): break return o - def getObjectIdList(self): - """ - Returns the list of gids from signature - """ - return [s for s in self.getSignatureList() if s.getObjectId() is not None] - def getGidList(self): """ Returns the list of gids from signature """ - return [s.getGid() for s in self.getSignatureList() if s.getGid() is not None] - - def getRidList(self): - """ - Returns the list of rids from signature - """ - return [s.getRid() for s in self.getSignatureList() if s.getRid() is not None] + return [id for id in self.getObjectIds()] def getSignatureList(self): """ @@ -1372,8 +1339,8 @@ class Subscription(Folder, XMLSyncUtils): object_id_list = [id for id in self.getObjectIds()] object_list_len = len(object_id_list) for i in xrange(0, object_list_len, 100): - current_id_list = object_id_list[i:i+100] - self.activate().manage_delObjects(current_id_list) + current_id_list = object_id_list[i:i+100] + self.activate(activity='SQLQueue').manage_delObjects(current_id_list) def getConflictList(self): """ diff --git a/product/ERP5SyncML/SubscriptionSynchronization.py b/product/ERP5SyncML/SubscriptionSynchronization.py index 458e6fedb5..eb975b5d9d 100644 --- a/product/ERP5SyncML/SubscriptionSynchronization.py +++ b/product/ERP5SyncML/SubscriptionSynchronization.py @@ -87,54 +87,6 @@ class SubscriptionSynchronization(XMLSyncUtils): return {'has_response':1,'xml':xml_a} - def SubSync(self, subscription_path, msg=None, RESPONSE=None): - """ - This is the synchronization method for the client - """ - response = None #check if subsync replies to this messages - subscription = self.unrestrictedTraverse(subscription_path) - if msg==None and (subscription.getSubscriptionUrl()).find('file')>=0: - msg = self.readResponse(sync_id=subscription.getSubscriptionUrl(), - from_url=subscription.getSubscriptionUrl()) - if msg==None: - response = self.SubSyncInit(subscription) - else: - xml_client = msg - if isinstance(xml_client, str) or isinstance(xml_client, unicode): - xml_client = Parse(xml_client) - status_list = self.getSyncBodyStatusList(xml_client) - if status_list not in (None, []): - status_code_syncHdr = status_list[0]['code'] - if status_code_syncHdr.isdigit(): - status_code_syncHdr = int(status_code_syncHdr) - LOG('SubSync status code : ', DEBUG, status_code_syncHdr) - if status_code_syncHdr == self.AUTH_REQUIRED: - if self.checkChal(xml_client): - authentication_format, authentication_type = self.getChal(xml_client) - LOG('SubSync auth_required :', DEBUG, 'format:%s, type:%s' % (authentication_format, authentication_type)) - if authentication_format is not None and \ - authentication_type is not None: - subscription.setAuthenticationFormat(authentication_format) - subscription.setAuthenticationType(authentication_type) - else: - raise ValueError, "Sorry, the server chalenge for an \ - authentication, but the authentication format is not find" - - LOG('SubSync', INFO, 'Authentication required') - response = self.SubSyncCred(subscription, xml_client) - elif status_code_syncHdr == self.UNAUTHORIZED: - LOG('SubSync', INFO, 'Bad authentication') - return {'has_response':0, 'xml':xml_client} - else: - response = self.SubSyncModif(subscription, xml_client) - else: - response = self.SubSyncModif(subscription, xml_client) - - if RESPONSE is not None: - RESPONSE.redirect('manageSubscriptions') - else: - return response - def SubSyncCred (self, subscription, msg=None, RESPONSE=None): """ This method send crendentials diff --git a/product/ERP5SyncML/SynchronizationTool.py b/product/ERP5SyncML/SynchronizationTool.py index 00cb8e8a6f..915b65565c 100644 --- a/product/ERP5SyncML/SynchronizationTool.py +++ b/product/ERP5SyncML/SynchronizationTool.py @@ -37,9 +37,9 @@ from AccessControl import ClassSecurityInfo, getSecurityManager from Products.CMFCore import CMFCorePermissions from Products.ERP5SyncML import _dtmldir from Products.ERP5SyncML import Conduit -from Publication import Publication,Subscriber +from Publication import Publication, Subscriber from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2 -from Subscription import Subscription,Signature +from Subscription import Subscription, Signature from XMLSyncUtils import Parse #from Ft.Xml import Parse from Products.ERP5Type import Permissions @@ -449,8 +449,8 @@ class SynchronizationTool( SubscriptionSynchronization, conflict_list += [conflict.__of__(subscriber)] for subscription in self.getSubscriptionList(): sub_conflict_list = subscription.getConflictList() - LOG('SynchronizationTool.getConflictList, sub_conflict_list', DEBUG, - sub_conflict_list) + #LOG('SynchronizationTool.getConflictList, sub_conflict_list', DEBUG, + #sub_conflict_list) for conflict in sub_conflict_list: conflict.setSubscriber(subscription) if path is None or conflict.getObjectPath() == path: @@ -487,32 +487,32 @@ class SynchronizationTool( SubscriptionSynchronization, path = self.resolveContext(context) conflict_list = self.getConflictList() state_list= [] - LOG('getSynchronizationState', DEBUG, 'path: %s' % str(path)) + #LOG('getSynchronizationState', DEBUG, 'path: %s' % str(path)) for conflict in conflict_list: if conflict.getObjectPath() == path: - LOG('getSynchronizationState', DEBUG, 'found a conflict: %s' % str(conflict)) + #LOG('getSynchronizationState', DEBUG, 'found a conflict: %s' % str(conflict)) state_list += [[conflict.getSubscriber(),self.CONFLICT]] for domain in self.getSynchronizationList(): destination = domain.getDestinationPath() - LOG('getSynchronizationState', TRACE, 'destination: %s' % str(destination)) + #LOG('getSynchronizationState', TRACE, 'destination: %s' % str(destination)) j_path = '/'.join(path) - LOG('getSynchronizationState', TRACE, 'j_path: %s' % str(j_path)) + #LOG('getSynchronizationState', TRACE, 'j_path: %s' % str(j_path)) if j_path.find(destination)==0: o_id = j_path[len(destination)+1:].split('/')[0] - LOG('getSynchronizationState', TRACE, 'o_id: %s' % o_id) + #LOG('getSynchronizationState', TRACE, 'o_id: %s' % o_id) subscriber_list = [] if domain.domain_type==self.PUB: subscriber_list = domain.getSubscriberList() else: subscriber_list = [domain] - LOG('getSynchronizationState, subscriber_list:', TRACE, subscriber_list) + #LOG('getSynchronizationState, subscriber_list:', TRACE, subscriber_list) for subscriber in subscriber_list: signature = subscriber.getSignatureFromObjectId(o_id) #XXX check if signature could be not None ... if signature is not None: state = signature.getStatus() - LOG('getSynchronizationState:', TRACE, 'sub.dest :%s, state: %s' % \ - (subscriber.getSubscriptionUrl(),str(state))) + #LOG('getSynchronizationState:', TRACE, 'sub.dest :%s, state: %s' % \ + #(subscriber.getSubscriptionUrl(),str(state))) found = None # Make sure there is not already a conflict giving the state for state_item in state_list: @@ -537,21 +537,20 @@ class SynchronizationTool( SubscriptionSynchronization, object = self.unrestrictedTraverse(conflict.getObjectPath()) subscriber = conflict.getSubscriber() # get the signature: - LOG('p_sync.applyPublisherValue, subscriber: ', DEBUG, subscriber) + #LOG('p_sync.applyPublisherValue, subscriber: ', DEBUG, subscriber) signature = subscriber.getSignatureFromObjectId(object.getId()) # XXX may be change for rid copy_path = conflict.getCopyPath() - LOG('p_sync.applyPublisherValue, copy_path: ', TRACE, copy_path) signature.delConflict(conflict) - if signature.getConflictList() == []: + if len(signature.getConflictList()) == 0: if copy_path is not None: - LOG('p_sync.applyPublisherValue, conflict_list empty on : ', TRACE, signature) + #LOG('p_sync.applyPublisherValue, conflict_list empty on : ', TRACE, signature) # Delete the copy of the object if the there is one directory = object.aq_parent copy_id = copy_path[-1] - LOG('p_sync.applyPublisherValue, copy_id: ', TRACE, copy_id) + #LOG('p_sync.applyPublisherValue, copy_id: ', TRACE, copy_id) if hasattr(directory.aq_base, 'hasObject'): # optimize the case of a BTree folder - LOG('p_sync.applyPublisherValue, deleting...: ', TRACE, copy_id) + #LOG('p_sync.applyPublisherValue, deleting...: ', TRACE, copy_id) if directory.hasObject(copy_id): directory._delObject(copy_id) elif copy_id in directory.objectIds(): @@ -567,7 +566,7 @@ class SynchronizationTool( SubscriptionSynchronization, subscriber = conflict.getSubscriber() for c in self.getConflictList(conflict.getObjectPath()): if c.getSubscriber() == subscriber: - LOG('applyPublisherDocument, applying on conflict: ', DEBUG, conflict) + #LOG('applyPublisherDocument, applying on conflict: ', DEBUG, conflict) c.applyPublisherValue() security.declareProtected(Permissions.AccessContentsInformation, @@ -586,7 +585,7 @@ class SynchronizationTool( SubscriptionSynchronization, apply the publisher value for all conflict of the given document """ publisher_object_path = self.getPublisherDocumentPath(conflict) - LOG('getPublisherDocument publisher_object_path', TRACE, publisher_object_path) + #LOG('getPublisherDocument publisher_object_path', TRACE, publisher_object_path) publisher_object = self.unrestrictedTraverse(publisher_object_path) return publisher_object @@ -704,13 +703,12 @@ class SynchronizationTool( SubscriptionSynchronization, solve_conflict=0 subscriber = conflict.getSubscriber() # get the signature: - #LOG('p_sync.setRemoteObject, subscriber: ',0,subscriber) signature = subscriber.getSignatureFromObjectId(object.getId()) # XXX may be change for rid # Import the conduit and get it conduit_name = subscriber.getConduit() conduit = self.getConduitByName(conduit_name) for xupdate in conflict.getXupdateList(): - conduit.updateNode(xml=xupdate,object=object,force=1) + conduit.updateNode(xml=xupdate, object=object, force=1) if solve_conflict: copy_path = conflict.getCopyPath() signature.delConflict(conflict) @@ -742,9 +740,9 @@ class SynchronizationTool( SubscriptionSynchronization, Version=Version CPS """ # Retrieve the conflict object - LOG('manageLocalValue', DEBUG, '%s %s %s' % (str(subscription_url), - str(property_id), - str(object_path))) + #LOG('manageLocalValue', DEBUG, '%s %s %s' % (str(subscription_url), + #str(property_id), + #str(object_path))) for conflict in self.getConflictList(): if conflict.getPropertyId() == property_id: if '/'.join(conflict.getObjectPath()) == object_path: @@ -761,9 +759,9 @@ class SynchronizationTool( SubscriptionSynchronization, Do whatever needed in order to store the remote value locally and confirmed that the remote box should keep it's value """ - LOG('manageLocalValue', DEBUG, '%s %s %s' % (str(subscription_url), - str(property_id), - str(object_path))) + #LOG('manageLocalValue', DEBUG, '%s %s %s' % (str(subscription_url), + #str(property_id), + #str(object_path))) for conflict in self.getConflictList(): if conflict.getPropertyId() == property_id: if '/'.join(conflict.getObjectPath()) == object_path: @@ -816,17 +814,17 @@ class SynchronizationTool( SubscriptionSynchronization, return context.getPhysicalPath() security.declarePublic('sendResponse') - def sendResponse(self, to_url=None, from_url=None, sync_id=None,xml=None, + def sendResponse(self, to_url=None, from_url=None, sync_id=None, xml=None, domain=None, send=1, content_type='application/vnd.syncml+xml'): """ We will look at the url and we will see if we need to send mail, http response, or just copy to a file. """ - LOG('sendResponse, self.getPhysicalPath: ', DEBUG, self.getPhysicalPath()) - LOG('sendResponse, to_url: ', DEBUG, to_url) - LOG('sendResponse, from_url: ', DEBUG, from_url) - LOG('sendResponse, sync_id: ', DEBUG, sync_id) - LOG('sendResponse, xml: \n', DEBUG, xml) + #LOG('sendResponse, self.getPhysicalPath: ', DEBUG, self.getPhysicalPath()) + #LOG('sendResponse, to_url: ', DEBUG, to_url) + #LOG('sendResponse, from_url: ', DEBUG, from_url) + #LOG('sendResponse, sync_id: ', DEBUG, sync_id) + #LOG('sendResponse, xml: \n', DEBUG, xml) if content_type == self.CONTENT_TYPE['SYNCML_WBXML']: xml = self.xml2wbxml(xml) @@ -852,26 +850,27 @@ class SynchronizationTool( SubscriptionSynchronization, commands.getstatusoutput('rm -f /tmp/%s.gz.gpg' % filename) if send: if isinstance(to_url, str): - if to_url.find('http://')==0: + if to_url.find('http://') == 0: domain = aq_base(domain) if domain.domain_type == self.PUB and not domain.getActivityEnabled(): # not use activity # XXX Make sure this is not a problem return None #use activities to send send an http response - LOG('sendResponse, will start sendHttpResponse, xml', DEBUG, '') - self.activate(activity='RAMQueue').sendHttpResponse(sync_id=sync_id, + #LOG('sendResponse, will start sendHttpResponse, xml', DEBUG, '') + activity = self.getActivityType(domain=domain) + self.activate(activity=activity).sendHttpResponse(sync_id=sync_id, to_url=to_url, xml=xml, domain_path=domain.getPath(), content_type=content_type) - elif to_url.find('file://')==0: + elif to_url.find('file://') == 0: filename = to_url[len('file:/'):] stream = file(filename,'w') stream.write(xml) stream.close() # we have to use local files (unit testing for example - elif to_url.find('mailto:')==0: + elif to_url.find('mailto:') == 0: # we will send an email to_address = to_url[len('mailto:'):] from_address = from_url[len('mailto:'):] @@ -882,15 +881,15 @@ class SynchronizationTool( SubscriptionSynchronization, def sendHttpResponse(self, to_url=None, sync_id=None, xml=None, domain_path=None, content_type='application/vnd.syncml+xml'): domain = self.unrestrictedTraverse(domain_path) - LOG('sendHttpResponse, starting with domain:', DEBUG, domain) + #LOG('sendHttpResponse, starting with domain:', DEBUG, domain) if domain is not None: if domain.domain_type == self.PUB and not domain.getActivityEnabled(): - return xml + return xml # Retrieve the proxy from os variables proxy_url = '' if os.environ.has_key('http_proxy'): proxy_url = os.environ['http_proxy'] - LOG('sendHttpResponse, proxy_url:', DEBUG, proxy_url) + #LOG('sendHttpResponse, proxy_url:', DEBUG, proxy_url) if proxy_url !='': proxy_handler = urllib2.ProxyHandler({"http" :proxy_url}) else: @@ -923,11 +922,11 @@ class SynchronizationTool( SubscriptionSynchronization, # - http://svn.zope.org/soap/trunk/ if domain.getSynchronizeWithERP5Sites(): - LOG('Synchronization with another ERP5 instance ...', DEBUG, '') + #LOG('Synchronization with another ERP5 instance ...', DEBUG, '') if to_url.find('readResponse')<0: to_url = to_url + '/portal_synchronizations/readResponse' encoded = urllib.urlencode(to_encode) - data=encoded + data = encoded request = urllib2.Request(url=to_url, data=data) else: #XXX only to synchronize with other server than erp5 (must be improved): @@ -938,9 +937,13 @@ class SynchronizationTool( SubscriptionSynchronization, url_file = urllib2.urlopen(request) result = url_file.read() except socket.error, msg: - self.activate(activity='RAMQueue').sendHttpResponse(to_url=to_url, - sync_id=sync_id, xml=xml, domain_path=domain.getPath(), - content_type=content_type) + activity = self.getActivityType(domain=domain) + self.activate(activity=activity).sendHttpResponse( + to_url=to_url, + sync_id=sync_id, + xml=xml, + domain_path=domain.getPath(), + content_type=content_type) LOG('sendHttpResponse, socket ERROR:', INFO, msg) LOG('sendHttpResponse, url, data', INFO, (url, data)) return @@ -951,10 +954,10 @@ class SynchronizationTool( SubscriptionSynchronization, if domain is not None: if domain.domain_type == self.SUB and not domain.getActivityEnabled(): - #if we don't use activity : - gpg_key = domain.getGPGKey() - if result not in (None, ''): - self.readResponse(sync_id=sync_id, text=result) + #if we don't use activity : + gpg_key = domain.getGPGKey() + if result not in (None, ''): + self.readResponse(sync_id=sync_id, text=result) return result security.declarePublic('sync') @@ -963,14 +966,15 @@ class SynchronizationTool( SubscriptionSynchronization, This will try to synchronize every subscription """ message_list = self.portal_activities.getMessageList() - LOG('sync, len(message_list):', DEBUG, len(message_list)) + #LOG('sync, len(message_list):', DEBUG, len(message_list)) if len(message_list) == 0: for subscription in self.getSubscriptionList(): user_id = subscription.getZopeUser() uf = self.getPortalObject().acl_users user = uf.getUserById(user_id).__of__(uf) newSecurityManager(None, user) - self.activate(activity='RAMQueue').SubSync(subscription.getPath()) + activity = self.getActivityType(domain=subscription) + subscription.activate(activity=activity).SubSync(subscription.getPath()) security.declarePublic('readResponse') def readResponse(self, text='', sync_id=None, to_url=None, from_url=None): @@ -978,7 +982,7 @@ class SynchronizationTool( SubscriptionSynchronization, We will look at the url and we will see if we need to send mail, http response, or just copy to a file. """ - LOG('readResponse, text :', DEBUG, text) + #LOG('readResponse, text :', DEBUG, text) #LOG('readResponse, hexdump(text) :', DEBUG, self.hexdump(text)) status_code = None if text not in ('', None): @@ -986,7 +990,7 @@ class SynchronizationTool( SubscriptionSynchronization, # the id sync_id, this is not so good, but there is no way yet # to know if we will call a publication or subscription XXX gpg_key = '' - LOG('readResponse, sync_id :', DEBUG, sync_id) + #LOG('readResponse, sync_id :', DEBUG, sync_id) for publication in self.getPublicationList(): if publication.getTitle() == sync_id: gpg_key = publication.getGPGKey() @@ -997,7 +1001,7 @@ class SynchronizationTool( SubscriptionSynchronization, gpg_key = subscription.getGPGKey() domain = subscription user = domain.getZopeUser() - LOG('readResponse, user :', DEBUG, user) + #LOG('readResponse, user :', DEBUG, user) newSecurityManager(None, user) # decrypt the message if needed if gpg_key not in (None,''): @@ -1021,7 +1025,7 @@ class SynchronizationTool( SubscriptionSynchronization, LOG('type(text) : ', TRACE, type(text)) if domain.getSyncContentType() == self.CONTENT_TYPE['SYNCML_WBXML']: text = self.wbxml2xml(text) - LOG('readResponse, text after wbxml :\n', TRACE, text) + #LOG('readResponse, text after wbxml :\n', TRACE, text) xml = Parse(text) url = self.getTarget(xml) for publication in self.getPublicationList(): @@ -1029,8 +1033,9 @@ class SynchronizationTool( SubscriptionSynchronization, publication.getTitle()==sync_id: if publication.getActivityEnabled(): #use activities to send SyncML data. - self.activate(activity='RAMQueue').PubSync(publication.getPath(), - text) + publication.activate(activity='SQLDict').PubSync( + publication.getPath(), + text) return ' ' else: result = self.PubSync(publication.getPath(), xml) @@ -1043,21 +1048,22 @@ class SynchronizationTool( SubscriptionSynchronization, for subscription in self.getSubscriptionList(): if subscription.getSubscriptionUrl() == url and \ subscription.getTitle() == sync_id: - subscription_path = self.getSubscription(sync_id).getPath() - self.activate(activity='RAMQueue').SubSync(subscription_path, + subscription_path = subscription.getPath() + activity = self.getActivityType(domain=subscription) + self.activate(activity=activity).SubSync(subscription_path, text) return ' ' - # we use from only if we have a file + # we use from only if we have a file elif isinstance(from_url, str): if from_url.find('file://') == 0: try: filename = from_url[len('file:/'):] stream = file(filename, 'r') xml = stream.read() - LOG('readResponse', DEBUG, 'file... msg: %s' % str(stream.read())) + #LOG('readResponse', DEBUG, 'file... msg: %s' % str(stream.read())) except IOError: - LOG('readResponse, cannot read file: ', DEBUG, filename) + LOG('readResponse, cannot read file: ', INFO, filename) xml = None if xml is not None and len(xml) == 0: xml = None -- 2.30.9