[Erp5-report] r28221 - /erp5/trunk/products/ERP5SyncML/

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Jul 30 14:21:47 CEST 2009


Author: daniele
Date: Thu Jul 30 14:21:46 2009
New Revision: 28221

URL: http://svn.erp5.org?rev=28221&view=rev
Log:
Slipt Subscription.py to separate the Conflict and Signature

Added:
    erp5/trunk/products/ERP5SyncML/Conflict.py
    erp5/trunk/products/ERP5SyncML/Signature.py
Modified:
    erp5/trunk/products/ERP5SyncML/Subscription.py

Added: erp5/trunk/products/ERP5SyncML/Conflict.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5SyncML/Conflict.py?rev=28221&view=auto
==============================================================================
--- erp5/trunk/products/ERP5SyncML/Conflict.py (added)
+++ erp5/trunk/products/ERP5SyncML/Conflict.py [utf8] Thu Jul 30 14:21:46 2009
@@ -1,0 +1,233 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
+#          Danièle Vanbaelinghem <daniele at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+from Globals import PersistentMapping
+from time import gmtime,strftime # for anchors
+from SyncCode import SyncCode
+from AccessControl import ClassSecurityInfo
+from Products.CMFCore.utils import getToolByName
+from Acquisition import Implicit, aq_base
+from Products.ERP5Type.Core.Folder import Folder
+from Products.ERP5Type.Base import Base
+from Products.ERP5Type import Permissions
+from Products.ERP5Type import PropertySheet
+from DateTime import DateTime
+from zLOG import LOG, DEBUG, INFO
+
+import md5
+from base64 import b64encode, b64decode, b16encode, b16decode
+
+#class Conflict(SyncCode, Implicit):
+class Conflict(SyncCode, Base):
+  """
+    object_path : the path of the obect
+    keyword : an identifier of the conflict
+    publisher_value : the value that we have locally
+    subscriber_value : the value sent by the remote box
+
+  """
+  isIndexable = 0
+  isPortalContent = 0 # Make sure RAD generated accessors at the class level
+
+  def __init__(self, object_path=None, keyword=None, xupdate=None, 
+      publisher_value=None, subscriber_value=None, subscriber=None):
+    self.object_path=object_path
+    self.keyword = keyword
+    self.setLocalValue(publisher_value)
+    self.setRemoteValue(subscriber_value)
+    self.subscriber = subscriber
+    self.resetXupdate()
+    self.copy_path = None
+
+  def getObjectPath(self):
+    """
+    get the object path
+    """
+    return self.object_path
+
+  def getPublisherValue(self):
+    """
+    get the domain
+    """
+    return self.publisher_value
+
+  def getXupdateList(self):
+    """
+    get the xupdate wich gave an error
+    """
+    xupdate_list = []
+    if len(self.xupdate)>0:
+      for xupdate in self.xupdate:
+        xupdate_list+= [xupdate]
+    return xupdate_list
+
+  def resetXupdate(self):
+    """
+    Reset the xupdate list
+    """
+    self.xupdate = PersistentMapping()
+
+  def setXupdate(self, xupdate):
+    """
+    set the xupdate
+    """
+    if xupdate == None:
+      self.resetXupdate()
+    else:
+      self.xupdate = self.getXupdateList() + [xupdate]
+
+  def setXupdateList(self, xupdate):
+    """
+    set the xupdate
+    """
+    self.xupdate = xupdate
+
+  def setLocalValue(self, value):
+    """
+    get the domain
+    """
+    try:
+      self.publisher_value = value
+    except TypeError: # It happens when we try to store StringIO
+      self.publisher_value = None
+
+  def getSubscriberValue(self):
+    """
+    get the domain
+    """
+    return self.subscriber_value
+
+  def setRemoteValue(self, value):
+    """
+    get the domain
+    """
+    try:
+      self.subscriber_value = value
+    except TypeError: # It happens when we try to store StringIO
+      self.subscriber_value = None
+
+  def applyPublisherValue(self):
+    """
+      after a conflict resolution, we have decided
+      to keep the local version of this object
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    p_sync.applyPublisherValue(self)
+
+  def applyPublisherDocument(self):
+    """
+      after a conflict resolution, we have decided
+      to keep the local version of this object
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    p_sync.applyPublisherDocument(self)
+
+  def getPublisherDocument(self):
+    """
+      after a conflict resolution, we have decided
+      to keep the local version of this object
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    return p_sync.getPublisherDocument(self)
+
+  def getPublisherDocumentPath(self):
+    """
+      after a conflict resolution, we have decided
+      to keep the local version of this object
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    return p_sync.getPublisherDocumentPath(self)
+
+  def getSubscriberDocument(self):
+    """
+      after a conflict resolution, we have decided
+      to keep the local version of this object
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    return p_sync.getSubscriberDocument(self)
+
+  def getSubscriberDocumentPath(self):
+    """
+      after a conflict resolution, we have decided
+      to keep the local version of this object
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    return p_sync.getSubscriberDocumentPath(self)
+
+  def applySubscriberDocument(self):
+    """
+      after a conflict resolution, we have decided
+      to keep the local version of this object
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    p_sync.applySubscriberDocument(self)
+
+  def applySubscriberValue(self, object=None):
+    """
+    get the domain
+    """
+    p_sync = getToolByName(self, 'portal_synchronizations')
+    p_sync.applySubscriberValue(self, object=object)
+
+  def setSubscriber(self, subscriber):
+    """
+    set the domain
+    """
+    self.subscriber = subscriber
+
+  def getSubscriber(self):
+    """
+    get the domain
+    """
+    return self.subscriber
+
+  def getKeyword(self):
+    """
+    get the domain
+    """
+    return self.keyword
+
+  def getPropertyId(self):
+    """
+    get the property id
+    """
+    return self.keyword
+
+  def getCopyPath(self):
+    """
+    Get the path of the copy, or None if none has been made
+    """
+    copy_path = self.copy_path
+    return copy_path
+
+  def setCopyPath(self, path):
+    """
+    """
+    self.copy_path = path
+

Added: erp5/trunk/products/ERP5SyncML/Signature.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5SyncML/Signature.py?rev=28221&view=auto
==============================================================================
--- erp5/trunk/products/ERP5SyncML/Signature.py (added)
+++ erp5/trunk/products/ERP5SyncML/Signature.py [utf8] Thu Jul 30 14:21:46 2009
@@ -1,0 +1,365 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
+#          Danièle Vanbaelinghem <daniele at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+from Globals import PersistentMapping
+from time import gmtime,strftime # for anchors
+from SyncCode import SyncCode
+from AccessControl import ClassSecurityInfo
+from Products.CMFCore.utils import getToolByName
+from Acquisition import Implicit, aq_base
+from Products.ERP5Type.Core.Folder import Folder
+from Products.ERP5Type.Base import Base
+from Products.ERP5Type import Permissions
+from Products.ERP5Type import PropertySheet
+from DateTime import DateTime
+from zLOG import LOG, DEBUG, INFO
+
+import md5
+from base64 import b64encode, b64decode, b16encode, b16decode
+
+class Signature(Folder, SyncCode):
+  """
+    status -- SENT, CONFLICT...
+    md5_object -- An MD5 value of a given document
+    #uid -- The UID of the document
+    id -- the ID of the document
+    gid -- the global id of the document
+    rid -- the uid of the document on the remote database,
+        only needed on the server.
+    xml -- the xml of the object at the time where it was synchronized
+  """
+  isIndexable = 0
+  isPortalContent = 0 # Make sure RAD generated accessors at the class level
+
+  # Constructor
+  def __init__(self,
+               id=None,
+               rid=None,
+               status=None,
+               xml_string=None,
+               object=None):
+    if object is not None:
+      self.setPath(object.getPhysicalPath())
+      self.setObjectId(object.getId())
+    else:
+      self.setPath(None)
+    self.setId(id)
+    self.setRid(rid)
+    self.status = status
+    self.setXML(xml_string)
+    self.partial_xml = None
+    self.action = None
+    self.setTempXML(None)
+    self.resetConflictList()
+    self.md5_string = None
+    self.force = 0
+    self.setSubscriberXupdate(None)
+    self.setPublisherXupdate(None)
+    Folder.__init__(self,id)
+
+  def setStatus(self, status):
+    """
+      set the Status (see SyncCode for numbers)
+    """
+    self.status = status
+    if status == self.SYNCHRONIZED:
+      temp_xml = self.getTempXML()
+      self.setForce(0)
+      if temp_xml is not None:
+        # This happens when we have sent the xml
+        # and we just get the confirmation
+        self.setXML(temp_xml)
+      self.setTempXML(None)
+      self.setPartialXML(None)
+      self.setSubscriberXupdate(None)
+      self.setPublisherXupdate(None)
+      if len(self.getConflictList())>0:
+        self.resetConflictList()
+      # XXX This may be a problem, if the document is changed
+      # during a synchronization
+      self.setLastSynchronizationDate(DateTime())
+      self.getParentValue().removeRemainingObjectPath(self.getPath())
+    if status == self.NOT_SYNCHRONIZED:
+      self.setTempXML(None)
+      self.setPartialXML(None)
+    elif status in (self.PUB_CONFLICT_MERGE, self.SENT):
+      # We have a solution for the conflict, don't need to keep the list
+      self.resetConflictList()
+
+  def getStatus(self):
+    """
+      get the Status (see SyncCode for numbers)
+    """
+    return self.status
+
+  def getPath(self):
+    """
+      get the force value (if we need to force update or not)
+    """
+    return getattr(self, 'path', None)
+
+  def setPath(self, path):
+    """
+      set the force value (if we need to force update or not)
+    """
+    self.path = path
+
+  def getForce(self):
+    """
+      get the force value (if we need to force update or not)
+    """
+    return self.force
+
+  def setForce(self, force):
+    """
+      set the force value (if we need to force update or not)
+    """
+    self.force = force
+
+  def getLastModificationDate(self):
+    """
+      get the last modfication date, so that we don't always
+      check the xml
+    """
+    return getattr(self, 'modification_date', None)
+
+  def setLastModificationDate(self,value):
+    """
+      set the last modfication date, so that we don't always
+      check the xml
+    """
+    setattr(self, 'modification_date', value)
+
+  def getLastSynchronizationDate(self):
+    """
+      get the last modfication date, so that we don't always
+      check the xml
+    """
+    return getattr(self, 'synchronization_date', None)
+
+  def setLastSynchronizationDate(self,value):
+    """
+      set the last modfication date, so that we don't always
+      check the xml
+    """
+    setattr(self, 'synchronization_date', value)
+
+  def setXML(self, xml):
+    """
+      set the XML corresponding to the object
+    """
+    self.xml = xml
+    if self.xml is not None:
+      self.setTempXML(None) # We make sure that the xml will not be erased
+      self.setMD5(xml)
+
+  def getXML(self):
+    """
+      get the XML corresponding to the object
+    """
+    #Never return empty string
+    return getattr(self, 'xml', None) or None
+
+  def setTempXML(self, xml):
+    """
+      This is the xml temporarily saved, it will
+      be stored with setXML when we will receive
+      the confirmation of synchronization
+    """
+    self.temp_xml = xml
+
+  def getTempXML(self):
+    """
+      get the temp xml
+    """
+    return self.temp_xml
+
+  def setSubscriberXupdate(self, xupdate):
+    """
+    set the full temp xupdate
+    """
+    self.subscriber_xupdate = xupdate
+
+  def getSubscriberXupdate(self):
+    """
+    get the full temp xupdate
+    """
+    return self.subscriber_xupdate
+
+  def setPublisherXupdate(self, xupdate):
+    """
+    set the full temp xupdate
+    """
+    self.publisher_xupdate = xupdate
+
+  def getPublisherXupdate(self):
+    """
+    get the full temp xupdate
+    """
+    return self.publisher_xupdate
+
+  def setMD5(self, xml):
+    """
+      set the MD5 object of this signature
+    """
+    self.md5_string = md5.new(xml).digest()
+
+  def getMD5(self):
+    """
+      get the MD5 object of this signature
+    """
+    return self.md5_string
+
+  def checkMD5(self, xml_string):
+    """
+    check if the given md5_object returns the same things as
+    the one stored in this signature, this is very usefull
+    if we want to know if an objects has changed or not
+    Returns 1 if MD5 are equals, else it returns 0
+    """
+    return ((md5.new(xml_string).digest()) == self.getMD5())
+
+  def setRid(self, rid):
+    """
+      set the rid
+    """
+    if isinstance(rid, unicode):
+      rid = rid.encode('utf-8')
+    self.rid = rid
+
+  def getRid(self):
+    """
+      get the rid
+    """
+    return getattr(self, 'rid', None)
+
+  def setId(self, id):
+    """
+      set the id
+    """
+    if isinstance(id, unicode):
+      id = id.encode('utf-8')
+    self.id = id
+
+  def getId(self):
+    """
+      get the id
+    """
+    return self.id
+
+  def getGid(self):
+    """
+      get the gid
+    """
+    return self.getId()
+
+  def setObjectId(self, id):
+    """
+      set the id of the object associated to this signature
+    """
+    if isinstance(id, unicode):
+      id = id.encode('utf-8')
+    self.object_id = id
+
+  def getObjectId(self):
+    """
+      get the id of the object associated to this signature
+    """
+    return getattr(self, 'object_id', None)
+
+  def setPartialXML(self, xml):
+    """
+    Set the partial string we will have to
+    deliver in the future
+    """
+    self.partial_xml = xml
+
+  def getPartialXML(self):
+    """
+    Set the partial string we will have to
+    deliver in the future
+    """
+    return self.partial_xml
+
+  def getAction(self):
+    """
+    Return the actual action for a partial synchronization
+    """
+    return self.action
+
+  def setAction(self, action):
+    """
+    Return the actual action for a partial synchronization
+    """
+    self.action = action
+
+  def getConflictList(self):
+    """
+    Return the actual action for a partial synchronization
+    """
+    returned_conflict_list = []
+    if len(self.conflict_list)>0:
+      returned_conflict_list.extend(self.conflict_list)
+    return returned_conflict_list
+
+  def resetConflictList(self):
+    """
+    Return the actual action for a partial synchronization
+    """
+    self.conflict_list = PersistentMapping()
+
+  def setConflictList(self, conflict_list):
+    """
+    Return the actual action for a partial synchronization
+    """
+    if conflict_list is None or conflict_list == []:
+      self.resetConflictList()
+    else:
+      self.conflict_list = conflict_list
+
+  def delConflict(self, conflict):
+    """
+    Return the actual action for a partial synchronization
+    """
+    conflict_list = []
+    for c in self.getConflictList():
+      #LOG('delConflict, c==conflict',0,c==aq_base(conflict))
+      if c != aq_base(conflict):
+        conflict_list += [c]
+    if conflict_list != []:
+      self.setConflictList(conflict_list)
+    else:
+      self.resetConflictList()
+
+  def getObject(self):
+    """
+    Returns the object corresponding to this signature
+    """
+    return self.getParentValue().getObjectFromGid(self.getObjectId())
+

Modified: erp5/trunk/products/ERP5SyncML/Subscription.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5SyncML/Subscription.py?rev=28221&r1=28220&r2=28221&view=diff
==============================================================================
--- erp5/trunk/products/ERP5SyncML/Subscription.py [utf8] (original)
+++ erp5/trunk/products/ERP5SyncML/Subscription.py [utf8] Thu Jul 30 14:21:46 2009
@@ -38,524 +38,15 @@
 from Products.ERP5Type import PropertySheet
 from DateTime import DateTime
 from zLOG import LOG, DEBUG, INFO
-
 import md5
 from base64 import b64encode, b64decode, b16encode, b16decode
 
-#class Conflict(SyncCode, Implicit):
-class Conflict(SyncCode, Base):
-  """
-    object_path : the path of the obect
-    keyword : an identifier of the conflict
-    publisher_value : the value that we have locally
-    subscriber_value : the value sent by the remote box
-
-  """
-  isIndexable = 0
-  isPortalContent = 0 # Make sure RAD generated accessors at the class level
-
-  def __init__(self, object_path=None, keyword=None, xupdate=None, 
-      publisher_value=None, subscriber_value=None, subscriber=None):
-    self.object_path=object_path
-    self.keyword = keyword
-    self.setLocalValue(publisher_value)
-    self.setRemoteValue(subscriber_value)
-    self.subscriber = subscriber
-    self.resetXupdate()
-    self.copy_path = None
-
-  def getObjectPath(self):
-    """
-    get the object path
-    """
-    return self.object_path
-
-  def getPublisherValue(self):
-    """
-    get the domain
-    """
-    return self.publisher_value
-
-  def getXupdateList(self):
-    """
-    get the xupdate wich gave an error
-    """
-    xupdate_list = []
-    if len(self.xupdate)>0:
-      for xupdate in self.xupdate:
-        xupdate_list+= [xupdate]
-    return xupdate_list
-
-  def resetXupdate(self):
-    """
-    Reset the xupdate list
-    """
-    self.xupdate = PersistentMapping()
-
-  def setXupdate(self, xupdate):
-    """
-    set the xupdate
-    """
-    if xupdate == None:
-      self.resetXupdate()
-    else:
-      self.xupdate = self.getXupdateList() + [xupdate]
-
-  def setXupdateList(self, xupdate):
-    """
-    set the xupdate
-    """
-    self.xupdate = xupdate
-
-  def setLocalValue(self, value):
-    """
-    get the domain
-    """
-    try:
-      self.publisher_value = value
-    except TypeError: # It happens when we try to store StringIO
-      self.publisher_value = None
-
-  def getSubscriberValue(self):
-    """
-    get the domain
-    """
-    return self.subscriber_value
-
-  def setRemoteValue(self, value):
-    """
-    get the domain
-    """
-    try:
-      self.subscriber_value = value
-    except TypeError: # It happens when we try to store StringIO
-      self.subscriber_value = None
-
-  def applyPublisherValue(self):
-    """
-      after a conflict resolution, we have decided
-      to keep the local version of this object
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    p_sync.applyPublisherValue(self)
-
-  def applyPublisherDocument(self):
-    """
-      after a conflict resolution, we have decided
-      to keep the local version of this object
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    p_sync.applyPublisherDocument(self)
-
-  def getPublisherDocument(self):
-    """
-      after a conflict resolution, we have decided
-      to keep the local version of this object
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    return p_sync.getPublisherDocument(self)
-
-  def getPublisherDocumentPath(self):
-    """
-      after a conflict resolution, we have decided
-      to keep the local version of this object
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    return p_sync.getPublisherDocumentPath(self)
-
-  def getSubscriberDocument(self):
-    """
-      after a conflict resolution, we have decided
-      to keep the local version of this object
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    return p_sync.getSubscriberDocument(self)
-
-  def getSubscriberDocumentPath(self):
-    """
-      after a conflict resolution, we have decided
-      to keep the local version of this object
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    return p_sync.getSubscriberDocumentPath(self)
-
-  def applySubscriberDocument(self):
-    """
-      after a conflict resolution, we have decided
-      to keep the local version of this object
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    p_sync.applySubscriberDocument(self)
-
-  def applySubscriberValue(self, object=None):
-    """
-    get the domain
-    """
-    p_sync = getToolByName(self, 'portal_synchronizations')
-    p_sync.applySubscriberValue(self, object=object)
-
-  def setSubscriber(self, subscriber):
-    """
-    set the domain
-    """
-    self.subscriber = subscriber
-
-  def getSubscriber(self):
-    """
-    get the domain
-    """
-    return self.subscriber
-
-  def getKeyword(self):
-    """
-    get the domain
-    """
-    return self.keyword
-
-  def getPropertyId(self):
-    """
-    get the property id
-    """
-    return self.keyword
-
-  def getCopyPath(self):
-    """
-    Get the path of the copy, or None if none has been made
-    """
-    copy_path = self.copy_path
-    return copy_path
-
-  def setCopyPath(self, path):
-    """
-    """
-    self.copy_path = path
-
-class Signature(Folder, SyncCode):
-  """
-    status -- SENT, CONFLICT...
-    md5_object -- An MD5 value of a given document
-    #uid -- The UID of the document
-    id -- the ID of the document
-    gid -- the global id of the document
-    rid -- the uid of the document on the remote database,
-        only needed on the server.
-    xml -- the xml of the object at the time where it was synchronized
-  """
-  isIndexable = 0
-  isPortalContent = 0 # Make sure RAD generated accessors at the class level
-
-  # Constructor
-  def __init__(self,
-               id=None,
-               rid=None,
-               status=None,
-               xml_string=None,
-               object=None):
-    if object is not None:
-      self.setPath(object.getPhysicalPath())
-      self.setObjectId(object.getId())
-    else:
-      self.setPath(None)
-    self.setId(id)
-    self.setRid(rid)
-    self.status = status
-    self.setXML(xml_string)
-    self.partial_xml = None
-    self.action = None
-    self.setTempXML(None)
-    self.resetConflictList()
-    self.md5_string = None
-    self.force = 0
-    self.setSubscriberXupdate(None)
-    self.setPublisherXupdate(None)
-    Folder.__init__(self,id)
-
-  def setStatus(self, status):
-    """
-      set the Status (see SyncCode for numbers)
-    """
-    self.status = status
-    if status == self.SYNCHRONIZED:
-      temp_xml = self.getTempXML()
-      self.setForce(0)
-      if temp_xml is not None:
-        # This happens when we have sent the xml
-        # and we just get the confirmation
-        self.setXML(temp_xml)
-      self.setTempXML(None)
-      self.setPartialXML(None)
-      self.setSubscriberXupdate(None)
-      self.setPublisherXupdate(None)
-      if len(self.getConflictList())>0:
-        self.resetConflictList()
-      # XXX This may be a problem, if the document is changed
-      # during a synchronization
-      self.setLastSynchronizationDate(DateTime())
-      self.getParentValue().removeRemainingObjectPath(self.getPath())
-    if status == self.NOT_SYNCHRONIZED:
-      self.setTempXML(None)
-      self.setPartialXML(None)
-    elif status in (self.PUB_CONFLICT_MERGE, self.SENT):
-      # We have a solution for the conflict, don't need to keep the list
-      self.resetConflictList()
-
-  def getStatus(self):
-    """
-      get the Status (see SyncCode for numbers)
-    """
-    return self.status
-
-  def getPath(self):
-    """
-      get the force value (if we need to force update or not)
-    """
-    return getattr(self, 'path', None)
-
-  def setPath(self, path):
-    """
-      set the force value (if we need to force update or not)
-    """
-    self.path = path
-
-  def getForce(self):
-    """
-      get the force value (if we need to force update or not)
-    """
-    return self.force
-
-  def setForce(self, force):
-    """
-      set the force value (if we need to force update or not)
-    """
-    self.force = force
-
-  def getLastModificationDate(self):
-    """
-      get the last modfication date, so that we don't always
-      check the xml
-    """
-    return getattr(self, 'modification_date', None)
-
-  def setLastModificationDate(self,value):
-    """
-      set the last modfication date, so that we don't always
-      check the xml
-    """
-    setattr(self, 'modification_date', value)
-
-  def getLastSynchronizationDate(self):
-    """
-      get the last modfication date, so that we don't always
-      check the xml
-    """
-    return getattr(self, 'synchronization_date', None)
-
-  def setLastSynchronizationDate(self,value):
-    """
-      set the last modfication date, so that we don't always
-      check the xml
-    """
-    setattr(self, 'synchronization_date', value)
-
-  def setXML(self, xml):
-    """
-      set the XML corresponding to the object
-    """
-    self.xml = xml
-    if self.xml is not None:
-      self.setTempXML(None) # We make sure that the xml will not be erased
-      self.setMD5(xml)
-
-  def getXML(self):
-    """
-      get the XML corresponding to the object
-    """
-    #Never return empty string
-    return getattr(self, 'xml', None) or None
-
-  def setTempXML(self, xml):
-    """
-      This is the xml temporarily saved, it will
-      be stored with setXML when we will receive
-      the confirmation of synchronization
-    """
-    self.temp_xml = xml
-
-  def getTempXML(self):
-    """
-      get the temp xml
-    """
-    return self.temp_xml
-
-  def setSubscriberXupdate(self, xupdate):
-    """
-    set the full temp xupdate
-    """
-    self.subscriber_xupdate = xupdate
-
-  def getSubscriberXupdate(self):
-    """
-    get the full temp xupdate
-    """
-    return self.subscriber_xupdate
-
-  def setPublisherXupdate(self, xupdate):
-    """
-    set the full temp xupdate
-    """
-    self.publisher_xupdate = xupdate
-
-  def getPublisherXupdate(self):
-    """
-    get the full temp xupdate
-    """
-    return self.publisher_xupdate
-
-  def setMD5(self, xml):
-    """
-      set the MD5 object of this signature
-    """
-    self.md5_string = md5.new(xml).digest()
-
-  def getMD5(self):
-    """
-      get the MD5 object of this signature
-    """
-    return self.md5_string
-
-  def checkMD5(self, xml_string):
-    """
-    check if the given md5_object returns the same things as
-    the one stored in this signature, this is very usefull
-    if we want to know if an objects has changed or not
-    Returns 1 if MD5 are equals, else it returns 0
-    """
-    return ((md5.new(xml_string).digest()) == self.getMD5())
-
-  def setRid(self, rid):
-    """
-      set the rid
-    """
-    if isinstance(rid, unicode):
-      rid = rid.encode('utf-8')
-    self.rid = rid
-
-  def getRid(self):
-    """
-      get the rid
-    """
-    return getattr(self, 'rid', None)
-
-  def setId(self, id):
-    """
-      set the id
-    """
-    if isinstance(id, unicode):
-      id = id.encode('utf-8')
-    self.id = id
-
-  def getId(self):
-    """
-      get the id
-    """
-    return self.id
-
-  def getGid(self):
-    """
-      get the gid
-    """
-    return self.getId()
-
-  def setObjectId(self, id):
-    """
-      set the id of the object associated to this signature
-    """
-    if isinstance(id, unicode):
-      id = id.encode('utf-8')
-    self.object_id = id
-
-  def getObjectId(self):
-    """
-      get the id of the object associated to this signature
-    """
-    return getattr(self, 'object_id', None)
-
-  def setPartialXML(self, xml):
-    """
-    Set the partial string we will have to
-    deliver in the future
-    """
-    self.partial_xml = xml
-
-  def getPartialXML(self):
-    """
-    Set the partial string we will have to
-    deliver in the future
-    """
-    return self.partial_xml
-
-  def getAction(self):
-    """
-    Return the actual action for a partial synchronization
-    """
-    return self.action
-
-  def setAction(self, action):
-    """
-    Return the actual action for a partial synchronization
-    """
-    self.action = action
-
-  def getConflictList(self):
-    """
-    Return the actual action for a partial synchronization
-    """
-    returned_conflict_list = []
-    if len(self.conflict_list)>0:
-      returned_conflict_list.extend(self.conflict_list)
-    return returned_conflict_list
-
-  def resetConflictList(self):
-    """
-    Return the actual action for a partial synchronization
-    """
-    self.conflict_list = PersistentMapping()
-
-  def setConflictList(self, conflict_list):
-    """
-    Return the actual action for a partial synchronization
-    """
-    if conflict_list is None or conflict_list == []:
-      self.resetConflictList()
-    else:
-      self.conflict_list = conflict_list
-
-  def delConflict(self, conflict):
-    """
-    Return the actual action for a partial synchronization
-    """
-    conflict_list = []
-    for c in self.getConflictList():
-      #LOG('delConflict, c==conflict',0,c==aq_base(conflict))
-      if c != aq_base(conflict):
-        conflict_list += [c]
-    if conflict_list != []:
-      self.setConflictList(conflict_list)
-    else:
-      self.resetConflictList()
-
-  def getObject(self):
-    """
-    Returns the object corresponding to this signature
-    """
-    return self.getParentValue().getObjectFromGid(self.getObjectId())
-
 def addSubscription( self, id, title='', REQUEST=None ):
     """
-    Add a new Subscribption
-    """
-    o = Subscription( id ,'','','','','','')
-    self._setObject( id, o )
+    Add a new Subscription
+    """
+    o = Subscription(id, '', '', '', '', '', '')
+    self._setObject(id, o)
     if REQUEST is not None:
         return self.manage_main(self, REQUEST, update_menu=1)
     return o
@@ -573,7 +64,7 @@
 
     publication_url -- a URI to a publication
 
-    subsribtion_url -- URL of ourselves
+    subscription_url -- URL of ourselves
 
     destination_path -- the place where objects are stored
 
@@ -662,7 +153,6 @@
     self.title = title
     self.setSyncContentType(sync_content_type)
     self.setSynchronizeWithERP5Sites(synchronize_with_erp5_sites)
-    #self.signatures = PersitentMapping()
 
   def getAlertCodeList(self):
     return self.CODE_LIST
@@ -910,18 +400,6 @@
     xml_mapping = getattr(self, 'xml_mapping', None)
     return xml_mapping
 
-  def getXMLFromObject(self, object, force=0):
-    """
-      return the xml mapping
-    """
-    xml_mapping = self.getXMLMapping(force=force)
-    xml = ''
-    if xml_mapping is not None:
-      func = getattr(object, xml_mapping, None)
-      if func is not None:
-        xml = func()
-    return xml
-
   def getMediaType(self):
     """
     This method return the type of media used in this session,
@@ -1005,6 +483,8 @@
 
   def getGidFromObject(self, object):
     """
+      GetGidFromObject is return the gid for mapping between server and
+      client
     """
     o_base = aq_base(object)
     o_gid = None
@@ -1041,12 +521,12 @@
         pass
       o_id = signature.getObjectId()
       #try with id param too, because gid is not catalogged
-      object_list = self.getObjectList(gid = b16decode(gid), id = o_id)
+      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))
       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))
+    object_list = self.getObjectList(gid=b16decode(gid))
     #LOG('getObjectFromGid :', DEBUG, 'object_list slow loop=%s, gid=%s' % (object_list, gid))
     for o in object_list:
       o_gid = self.getGidFromObject(o)
@@ -1067,36 +547,34 @@
         break
     return o
 
-  def getObjectFromRid(self, rid):
-    """
-    return the object corresponding to the id
-    """
-    signature = self.getSignatureFromRid(rid)
-    destination = self.getDestination()
-    o = None
-    if signature is not None and signature.getPath() is not None:
-      try:
-        o = destination.getPortalObject().restrictedTraverse(signature.getPath())
-      except:
-        pass
-    return o
-
   def getObjectList(self, **kw):
     """
     This returns the list of sub-object corresponding
     to the query
     """
-    destination = self.getDestination()
+    destination = self.getDestinationPath()
     query = self.getQuery()
-    query_list = []
     if query is not None and isinstance(query, str):
+      count = query.count("/")
+      if count > 0:
+        # There is a query path different than destination path change
+        # destination path for this query
+        cut_query = query.split('/')
+        if destination.endswith('/'):
+          destination = "%s%s" % (destination, "/".join(cut_query[:count]))
+        else:  
+          destination = "%s/s" % (destination, "/".join(cut_query[:count]))
+        query = cut_query[count]
+      query_list = []
+      destination = self.unrestrictedTraverse(destination)
       query_method = getattr(destination, query, None)
       if query_method is not None:
         query_list = query_method(**kw)
       else:
-        raise KeyError, 'This Subscriber %s provide no Query with id: %s'\
+        raise KeyError, 'This Subscriber %s provide no Query: %s'\
           % (self.getTitle(), query)
     elif callable(query): # used in the test
+      destination = self.unrestrictedTraverse(destination)
       query_list = query(destination)
     else:
       raise KeyError, 'This Subscriber %s provide no Query with id: %s'\
@@ -1121,7 +599,7 @@
         # 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('generateNewIdWithGenerator, new_id: ', DEBUG, new_id)
       return new_id
     return None
 
@@ -1386,7 +864,6 @@
         s.setPartialXML(None)
         s.setTempXML(None)
     self.setRemainingObjectPathList(None)
-
 
   def isAuthenticated(self):
     """
@@ -1467,3 +944,7 @@
       conduit = getattr(conduit_module, conduit_name)()
     return conduit
 
+#XXX backwards compatibility
+from Products.ERP5SyncML import Signature, Conflict
+Signature = Signature.Signature
+Conflict = Conflict.Conflict




More information about the Erp5-report mailing list