[Erp5-report] r9295 - in /erp5/trunk/products/ERP5Type: Document/ PropertySheet/

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Aug 21 16:35:25 CEST 2006


Author: vincent
Date: Mon Aug 21 16:35:23 2006
New Revision: 9295

URL: http://svn.erp5.org?rev=9295&view=rev
Log:
Import randint function.
Define _generateRandomId and _generateNextId which are id generation functions.
Remove extraneous Xs. 3 is enough.
Add a string property to Folder named id_generator.
Modify generateNewId to use the new property.

Modified:
    erp5/trunk/products/ERP5Type/Document/Folder.py
    erp5/trunk/products/ERP5Type/PropertySheet/Folder.py

Modified: erp5/trunk/products/ERP5Type/Document/Folder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Document/Folder.py?rev=9295&r1=9294&r2=9295&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Document/Folder.py (original)
+++ erp5/trunk/products/ERP5Type/Document/Folder.py Mon Aug 21 16:35:23 2006
@@ -45,6 +45,7 @@
   from Products.BTreeFolder2.CMFBTreeFolder import CMFBTreeFolder
 from AccessControl import getSecurityManager
 from Products.ERP5Type import Permissions
+from random import randint
 
 import os
 
@@ -113,6 +114,30 @@
       raise TypeError, 'deleteContent only accepts string or list, '\
                        'not %s' % type(id)
 
+  def _generateRandomId(self):
+    """
+      Generate a random Id.
+      10000 factor makes the odd to generate an already existing Id of 1 out
+      of 10000, not depending on the number of objects present in this folder.
+      len(self)+1 to make sure generation works on an empty Folder.
+    """
+    return '%X' % (randint(1, 10000 * (len(self) + 1)), )
+ 
+  def _generateNextId(self):
+    """
+      Get the last generated Id, increment it until no object with generated
+      Id exist, then save the Id.
+    """
+    try:
+      my_id = int(self.getLastId())
+    except TypeError:
+      my_id = 1
+    while self.hasContent(str(my_id)):
+      my_id = my_id + 1
+    my_id = str(my_id)
+    self._setLastId(my_id) # Make sure no reindexing happens
+    return my_id
+
   # Automatic ID Generation method
   security.declareProtected(Permissions.View, 'generateNewId')
   def generateNewId(self,id_group=None,default=None,method=None):
@@ -122,24 +147,23 @@
       can be found
 
       Permission is view because we may want to add content to a folder
-      without changing the folder content itself. XXXXXXXXXXX
-      XXXXXXXXXXXX
+      without changing the folder content itself.
+      XXX
     """
     my_id = None
     if id_group is None:
       id_group = self.getIdGroup()
-    if id_group is None or id_group=='None':
-      try:
-        my_id = int(self.getLastId())
-      except TypeError:
-        my_id = 1
-      while self.hasContent(str(my_id)):
-        my_id = my_id + 1
-      self._setLastId(str(my_id)) # Make sure no reindexing happens
+    if id_group in (None, 'None'):
+      idGenerator = getattr(self, self.getIdGenerator(), None)
+      if idGenerator is None:
+        idGenerator = self._generateNextId
+      my_id = idGenerator()
+      while self.hasContent(my_id):
+        my_id = _generateNextId()
     else:
-      my_id = self.portal_ids.generateNewId(id_group=id_group,default=default,method=method)
-
-    return str(my_id)
+      my_id = str(self.portal_ids.generateNewId(id_group=id_group,default=default,method=method))
+
+    return my_id
 
   security.declareProtected(Permissions.View, 'hasContent')
   def hasContent(self,id):

Modified: erp5/trunk/products/ERP5Type/PropertySheet/Folder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/PropertySheet/Folder.py?rev=9295&r1=9294&r2=9295&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/PropertySheet/Folder.py (original)
+++ erp5/trunk/products/ERP5Type/PropertySheet/Folder.py Mon Aug 21 16:35:23 2006
@@ -44,5 +44,10 @@
             'type'        : 'string',
             'default'     : '1',
             'mode'        : 'w'},
+        {   'id'          : 'id_generator',
+            'description' : 'The name of the function to use to generate the Id of a new contained object. Default behaviour (when this value is not set or the function cannot be found) is to increment last_id and update it.',
+            'type'        : 'string',
+            'default'     : '',
+            'mode'        : 'w'},
     )
 




More information about the Erp5-report mailing list