[Erp5-report] r36283 daniele - in /erp5/trunk/products/ERP5: Document/ PropertySheet/ boots...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Jun 11 18:05:04 CEST 2010


Author: daniele
Date: Fri Jun 11 18:04:59 2010
New Revision: 36283

URL: http://svn.erp5.org?rev=36283&view=rev
Log:
Add store interval on SQLNonContinuousIncreasingIdGenerator
Add a export and import dictionary for the generators
Add a method to update the persistent dictionary in the SQL table

Added:
    erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view/my_store_interval.xml
Removed:
    erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_zCreateTable.xml
Modified:
    erp5/trunk/products/ERP5/Document/IdGenerator.py
    erp5/trunk/products/ERP5/Document/SQLNonContinuousIncreasingIdGenerator.py
    erp5/trunk/products/ERP5/Document/ZODBContinuousIncreasingIdGenerator.py
    erp5/trunk/products/ERP5/PropertySheet/SQLIdGenerator.py
    erp5/trunk/products/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_ids/6.xml
    erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view.xml
    erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
    erp5/trunk/products/ERP5/interfaces/id_generator.py
    erp5/trunk/products/ERP5/tests/testIdTool.py

Modified: erp5/trunk/products/ERP5/Document/IdGenerator.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/IdGenerator.py?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/IdGenerator.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/IdGenerator.py [utf8] Fri Jun 11 18:04:59 2010
@@ -131,3 +131,28 @@ class IdGenerator(Base):
                         self.getReference()
     specialise.getLatestVersionValue().clearGenerator()
 
+  security.declareProtected(Permissions.ModifyPortalContent,
+      'exportGeneratorIdDict')
+  def exportGeneratorIdDict(self):
+    """
+      Export last id values in a dictionnary in the form { group_id : last_id }
+    """
+    specialise = self.getSpecialiseValue()
+    if specialise is None:
+      raise ValueError, "the id generator %s doesn't have specialise value" %\
+                        self.getReference()
+    return specialise.getLatestVersionValue().exportGeneratorIdDict()
+
+  security.declareProtected(Permissions.ModifyPortalContent,
+      'importGeneratorIdDict')
+  def importGeneratorIdDict(self, id_dict, clear=False):
+    """
+      Import data, this is usefull if we want to replace a generator by
+      another one.
+    """
+    specialise = self.getSpecialiseValue()
+    if specialise is None:
+      raise ValueError, "the id generator %s doesn't have specialise value" %\
+                        self.getReference()
+    specialise.getLatestVersionValue().importGeneratorIdDict(id_dict=id_dict,
+                                                           clear=clear)

Modified: erp5/trunk/products/ERP5/Document/SQLNonContinuousIncreasingIdGenerator.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/SQLNonContinuousIncreasingIdGenerator.py?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/SQLNonContinuousIncreasingIdGenerator.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/SQLNonContinuousIncreasingIdGenerator.py [utf8] Fri Jun 11 18:04:59 2010
@@ -90,7 +90,7 @@ class SQLNonContinuousIncreasingIdGenera
     except ProgrammingError, error:
       if error[0] != NO_SUCH_TABLE:
         raise
-      # If the database not exist, initialise the generator
+      # If the database not exist, initialize the generator
       self.initializeGenerator()
     if self.getStoredInZodb():
       # Store the new_id on ZODB if the checkbox storedInZodb is enabled
@@ -100,12 +100,46 @@ class SQLNonContinuousIncreasingIdGenera
         # If the dictionary not exist, initialize the generator
         self.initializeGenerator()
         last_max_id_dict = getattr(aq_base(self), 'last_max_id_dict')
-      # Store the new value id
+      if last_max_id_dict.get(id_group, None) is not None and \
+          last_max_id_dict[id_group].value > new_id:
+        raise ValueError, 'The last_id %s stored in zodb dictionary is ' \
+            'higher than the new id %s generated' % \
+            (last_max_id_dict[id_group].value, new_id)
+      # Check the store interval to store the data
+      store_interval = self.getStoreInterval()
+      if not store_interval:
+        store_interval = 1
+      # Store the new id
       if last_max_id_dict.get(id_group, None) is None:
         last_max_id_dict[id_group] = ScalarMaxConflictResolver(new_id)
-      last_max_id_dict[id_group].set(new_id)
+      elif last_max_id_dict[id_group].value <= (new_id - store_interval):
+        last_max_id_dict[id_group].set(new_id)
     return new_id
 
+  def _updateSqlTable(self):
+    """
+      Update the portal ids table with the data of persistent dictionary
+    """
+    portal = self.getPortalObject()
+    get_value_list = getattr(portal, 'IdTool_zGetValueList')
+    set_last_id_method = getattr(portal, 'IdTool_zSetLastId')
+    id_group_done = []
+    # Save the last id of persistent dict if it is higher that
+    # the last id stored in the sql table
+    for line in get_value_list().dictionaries():
+      id_group = line['id_group']
+      last_id = line['last_id']
+      if self.last_max_id_dict.has_key(id_group) and \
+        self.last_max_id_dict[id_group].value > last_id:
+        set_last_id_method(id_group=id_group,
+            last_id=self.last_max_id_dict[id_group].value)
+      id_group_done.append(id_group)
+   
+    # save the last ids which not exist in sql
+    for id_group in (set(self.last_max_id_dict) - set(id_group_done)):
+      set_last_id_method(id_group=id_group,
+          last_id=self.last_max_id_dict[id_group].value)
+
   security.declareProtected(Permissions.AccessContentsInformation,
       'generateNewId')
   def generateNewId(self, id_group=None, default=None):
@@ -178,13 +212,15 @@ class SQLNonContinuousIncreasingIdGenera
             if storage and (not self.last_max_id_dict.has_key(id_group) or \
                 self.last_max_id_dict[id_group].value < last_insert_id):
               self.last_max_id_dict[id_group] = ScalarMaxConflictResolver(last_insert_id)
-              self.last_max_id_dict[id_group].set(last_insert_id)
             continue
         last_id = int(last_id.value)
         set_last_id_method(id_group=id_group, last_id=last_id)
         if storage:
           self.last_max_id_dict[id_group] = ScalarMaxConflictResolver(last_id)
-          self.last_max_id_dict[id_group].set(last_id)
+
+    # Store last_max_id_dict in mysql
+    if self.getStoredInZodb(): 
+      self._updateSqlTable()
 
   security.declareProtected(Permissions.AccessContentsInformation,
       'clearGenerator')
@@ -210,7 +246,49 @@ class SQLNonContinuousIncreasingIdGenera
     drop_method()
     create_method()
 
-  security.declareProtected(Permissions.AccessContentsInformation,
+  security.declareProtected(Permissions.ModifyPortalContent,
+      'exportGeneratorIdDict')
+  def exportGeneratorIdDict(self):
+    """
+      Export last id values in a dictionnary in the form { group_id : last_id }
+    """
+    portal = self.getPortalObject()
+    # Store last_max_id_dict in mysql
+    if self.getStoredInZodb(): 
+      self._updateSqlTable()
+    # Return values from sql 
+    get_value_list = getattr(portal, 'IdTool_zGetValueList')
+    return dict([(line['id_group'],int(line['last_id'])) for line in
+      get_value_list().dictionaries()])
+
+  security.declareProtected(Permissions.ModifyPortalContent,
+      'importGeneratorIdDict')
+  def importGeneratorIdDict(self, id_dict=None, clear=False):
+    """
+      Import data, this is usefull if we want to replace a generator by
+      another one.
+    """
+    if clear:
+      self.clearGenerator()
+    portal = self.getPortalObject()
+    set_last_id_method = getattr(portal, 'IdTool_zSetLastId')
+    if not isinstance(id_dict, dict):
+      raise TypeError, 'the argument given is not a dictionary'
+    new_id_dict = dict()
+    for key, value in id_dict.items():
+      if isinstance(value, int):
+        set_last_id_method(id_group=key, last_id=value)
+        # The id must be a ScalarMaxConflictResolver object for the persistent dict
+        new_id_dict[key] = ScalarMaxConflictResolver(value)
+      else:
+        raise TypeError, 'the value in the dictionary given is not a integer'
+    # Update persistent dict
+    if self.getStoredInZodb():
+      if getattr(self, 'last_max_id_dict', None) is None:
+        self.last_max_id_dict = PersistentMapping()
+      self.last_max_id_dict.update(new_id_dict)
+
+  security.declareProtected(Permissions.ModifyPortalContent,
       'rebuildSqlTable')
   def rebuildSqlTable(self):
     """
@@ -221,14 +299,8 @@ class SQLNonContinuousIncreasingIdGenera
              generation 
     """
     portal = self.getPortalObject()
-    getattr(portal, 'IdTool_zDropTable')()
-    getattr(self, 'SQLNonContinuousIncreasingIdGenerator_zCreateTable')()
-
-  security.declareProtected(Permissions.AccessContentsInformation,
-      'rebuildSqlTable')
-  def getPersistentIdDict(self):
-    """
-      Return all data stored in zodb
-    """
-    return dict([(x[0],x[1].value) for x in
-       getattr(self, 'last_max_id_dict', {}).iteritems()])
+    drop_method = getattr(portal, 'IdTool_zDropTable')
+    create_method = getattr(portal, 'IdTool_zCreateEmptyTable')
+    drop_method()
+    create_method()
+    self._updateSqlTable()

Modified: erp5/trunk/products/ERP5/Document/ZODBContinuousIncreasingIdGenerator.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/ZODBContinuousIncreasingIdGenerator.py?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/ZODBContinuousIncreasingIdGenerator.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/ZODBContinuousIncreasingIdGenerator.py [utf8] Fri Jun 11 18:04:59 2010
@@ -133,3 +133,26 @@ class ZODBContinuousIncreasingIdGenerato
     # Remove dictionary
     self.last_id_dict = PersistentMapping()
 
+  security.declareProtected(Permissions.ModifyPortalContent,
+      'exportGeneratorIdDict')
+  def exportGeneratorIdDict(self):
+    """
+      Export last id values in a dictionnary in the form { group_id : last_id }
+    """
+    return dict(self.last_id_dict)
+
+  security.declareProtected(Permissions.ModifyPortalContent,
+      'importGeneratorIdDict')
+  def importGeneratorIdDict(self, id_dict, clear=False):
+    """
+      Import data, this is usefull if we want to replace a generator by
+      another one.
+    """
+    if clear:
+      self.clearGenerator()
+    if not isinstance(id_dict, dict):
+      raise TypeError, 'the argument given is not a dictionary'
+    for value in id_dict.values():
+      if not isinstance(value, int):
+        raise TypeError, 'the value given in dictionary is not a integer'
+    self.last_id_dict.update(id_dict)

Modified: erp5/trunk/products/ERP5/PropertySheet/SQLIdGenerator.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/PropertySheet/SQLIdGenerator.py?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/PropertySheet/SQLIdGenerator.py [utf8] (original)
+++ erp5/trunk/products/ERP5/PropertySheet/SQLIdGenerator.py [utf8] Fri Jun 11 18:04:59 2010
@@ -40,4 +40,10 @@ class SQLIdGenerator:
      'type'       :'boolean',
      'mode'       :'w'
     },
+    {'id'         :'store_interval',
+     'label'      :'The generator store the last id in the zodb \
+                   every store interval',
+     'type'       :'int',
+     'mode'       :'w'
+    },
   )

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_ids/6.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_ids/6.xml?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_ids/6.xml [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_ids/6.xml [utf8] Fri Jun 11 18:04:59 2010
@@ -34,6 +34,10 @@
             </value>
         </item>
         <item>
+            <key> <string>store_interval</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
             <key> <string>stored_in_zodb</string> </key>
             <value> <int>1</int> </value>
         </item>

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view.xml?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view.xml [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view.xml [utf8] Fri Jun 11 18:04:59 2010
@@ -92,14 +92,16 @@
                         <string>my_portal_type</string>
                         <string>my_reference</string>
                         <string>my_version</string>
-                        <string>my_stored_in_zodb</string>
                       </list>
                     </value>
                 </item>
                 <item>
                     <key> <string>right</string> </key>
                     <value>
-                      <list/>
+                      <list>
+                        <string>my_stored_in_zodb</string>
+                        <string>my_store_interval</string>
+                      </list>
                     </value>
                 </item>
               </dictionary>

Added: erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view/my_store_interval.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view/my_store_interval.xml?rev=36283&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view/my_store_interval.xml (added)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_view/my_store_interval.xml [utf8] Fri Jun 11 18:04:59 2010
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>delegated_list</string> </key>
+            <value>
+              <list>
+                <string>title</string>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>my_store_interval</string> </value>
+        </item>
+        <item>
+            <key> <string>message_values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>external_validator_failed</string> </key>
+                    <value> <string>The input failed the external validator.</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>overrides</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>tales</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string>my_integer_field</string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string>Base_viewFieldLibrary</string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string>Click to edit the target</string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string>Store Interval</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>

Removed: erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_zCreateTable.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_zCreateTable.xml?rev=36282&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_zCreateTable.xml [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/SQLNonContinuousIncreasingIdGenerator_zCreateTable.xml (removed)
@@ -1,169 +0,0 @@
-<?xml version="1.0"?>
-<ZopeData>
-  <record id="1" aka="AAAAAAAAAAE=">
-    <pickle>
-      <tuple>
-        <global name="SQL" module="Products.ZSQLMethods.SQL"/>
-        <tuple/>
-      </tuple>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_arg</string> </key>
-            <value>
-              <object>
-                <klass>
-                  <global name="Args" module="Shared.DC.ZRDB.Aqueduct"/>
-                </klass>
-                <tuple/>
-                <state>
-                  <dictionary>
-                    <item>
-                        <key> <string>_data</string> </key>
-                        <value>
-                          <dictionary/>
-                        </value>
-                    </item>
-                    <item>
-                        <key> <string>_keys</string> </key>
-                        <value>
-                          <list/>
-                        </value>
-                    </item>
-                  </dictionary>
-                </state>
-              </object>
-            </value>
-        </item>
-        <item>
-            <key> <string>_col</string> </key>
-            <value>
-              <tuple/>
-            </value>
-        </item>
-        <item>
-            <key> <string>allow_simple_one_argument_traversal</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>arguments_src</string> </key>
-            <value> <string></string> </value>
-        </item>
-        <item>
-            <key> <string>cache_time_</string> </key>
-            <value> <int>0</int> </value>
-        </item>
-        <item>
-            <key> <string>class_file_</string> </key>
-            <value> <string></string> </value>
-        </item>
-        <item>
-            <key> <string>class_name_</string> </key>
-            <value> <string></string> </value>
-        </item>
-        <item>
-            <key> <string>connection_hook</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>connection_id</string> </key>
-            <value> <string>erp5_sql_transactionless_connection</string> </value>
-        </item>
-        <item>
-            <key> <string>id</string> </key>
-            <value> <string>SQLNonContinuousIncreasingIdGenerator_zCreateTable</string> </value>
-        </item>
-        <item>
-            <key> <string>max_cache_</string> </key>
-            <value> <int>100</int> </value>
-        </item>
-        <item>
-            <key> <string>max_rows_</string> </key>
-            <value> <int>1000</int> </value>
-        </item>
-        <item>
-            <key> <string>src</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
-CREATE TABLE `portal_ids` (\n
-  `id_group` VARBINARY(255),\n
-  `last_id` BIGINT UNSIGNED,\n
-  PRIMARY KEY  (`id_group`)\n
-) TYPE=InnoDB\n
-<dtml-var sql_delimiter>\n
-<dtml-in expr="getPersistentIdDict().items()">\n
-INSERT INTO `portal_ids` (`id_group`, `last_id`) VALUES (<dtml-sqlvar sequence-key type="string">, <dtml-sqlvar sequence-item type="int">)\n
-<dtml-var sql_delimiter>\n
-</dtml-in>\n
-COMMIT
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>template</string> </key>
-            <value>
-              <object>
-                <klass>
-                  <global name="__newobj__" module="copy_reg"/>
-                </klass>
-                <tuple>
-                  <global name="SQL" module="Shared.DC.ZRDB.DA"/>
-                </tuple>
-                <state>
-                  <dictionary>
-                    <item>
-                        <key> <string>__name__</string> </key>
-                        <value> <string encoding="cdata"><![CDATA[
-
-<string>
-
-]]></string> </value>
-                    </item>
-                    <item>
-                        <key> <string>_vars</string> </key>
-                        <value>
-                          <dictionary/>
-                        </value>
-                    </item>
-                    <item>
-                        <key> <string>globals</string> </key>
-                        <value>
-                          <dictionary/>
-                        </value>
-                    </item>
-                    <item>
-                        <key> <string>raw</string> </key>
-                        <value> <string encoding="cdata"><![CDATA[
-
-CREATE TABLE `portal_ids` (\n
-  `id_group` VARBINARY(255),\n
-  `last_id` BIGINT UNSIGNED,\n
-  PRIMARY KEY  (`id_group`)\n
-) TYPE=InnoDB\n
-<dtml-var sql_delimiter>\n
-<dtml-in expr="getPersistentIdDict().items()">\n
-INSERT INTO `portal_ids` (`id_group`, `last_id`) VALUES (<dtml-sqlvar sequence-key type="string">, <dtml-sqlvar sequence-item type="int">)\n
-<dtml-var sql_delimiter>\n
-</dtml-in>\n
-COMMIT
-
-]]></string> </value>
-                    </item>
-                  </dictionary>
-                </state>
-              </object>
-            </value>
-        </item>
-        <item>
-            <key> <string>title</string> </key>
-            <value> <string></string> </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-</ZopeData>

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] Fri Jun 11 18:04:59 2010
@@ -1 +1 @@
-1610
\ No newline at end of file
+1611

Modified: erp5/trunk/products/ERP5/interfaces/id_generator.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/interfaces/id_generator.py?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/interfaces/id_generator.py [utf8] (original)
+++ erp5/trunk/products/ERP5/interfaces/id_generator.py [utf8] Fri Jun 11 18:04:59 2010
@@ -104,7 +104,7 @@ class IIdGenerator(Interface):
     added here)
     """
 
-  def importGeneratorIdDict(id_dict):
+  def importGeneratorIdDict(id_dict, clear=False):
     """
     Import data, this is usefull if we want to replace a generator by
     another one. It will allows to make the new generator starting from
@@ -114,6 +114,9 @@ class IIdGenerator(Interface):
 
     id_dict (dict)
       A dictionnary in the form { group_id : last_id }
+    
+    clear(bool)
+      A boolean to clear the generator before import the data
 
     This can be incompatible with some particular generator implementation,
     in this case a particular error will be raised (to be determined and

Modified: erp5/trunk/products/ERP5/tests/testIdTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testIdTool.py?rev=36283&r1=36282&r2=36283&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testIdTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testIdTool.py [utf8] Fri Jun 11 18:04:59 2010
@@ -41,13 +41,13 @@ class TestIdTool(ERP5TypeTestCase):
     self.login()
     self.portal = self.getPortal()
     self.id_tool = self.portal.portal_ids
+    self.id_tool.initializeGenerator(all=True)
     self.createGenerators()
     transaction.commit()
     self.tic()
 
   def beforeTearDown(self):
     self.id_tool.clearGenerator(all=True)
-    self.id_tool.initializeGenerator(all=True)
 
   def getTitle(self):
     """
@@ -156,7 +156,7 @@ class TestIdTool(ERP5TypeTestCase):
     zodb_generator = self.getLastGenerator('test_application_zodb')
     zodb_portal_type = 'ZODB Continuous Increasing Id Generator'
     self.assertEquals(zodb_generator.getPortalType(), zodb_portal_type)
-    self.assertEqual(getattr(zodb_generator, 'last_id_dict', None), None)
+    self.assertEqual(getattr(zodb_generator, 'last_id_dict', {}), {})
     # generate ids
     self.checkGenerateNewId('test_application_zodb')
     # check zodb dict
@@ -173,13 +173,14 @@ class TestIdTool(ERP5TypeTestCase):
     sql_generator = self.getLastGenerator('test_application_sql')
     sql_portal_type = 'SQL Non Continuous Increasing Id Generator'
     self.assertEquals(sql_generator.getPortalType(), sql_portal_type)
-    self.assertEqual(getattr(sql_generator, 'last_max_id_dict', None), None)
+    self.assertEquals(getattr(sql_generator, 'last_max_id_dict', {}), {})
     # retrieve method to recovery the last id in the database
     last_id_method = getattr(self.portal, 'IdTool_zGetLastId', None)
     self.assertNotEquals(last_id_method, None)
     # store the ids in zodb
     if store:
       sql_generator.setStoredInZodb(True)
+      sql_generator.setStoreInterval(1)
     # generate ids
     self.checkGenerateNewId('test_application_sql')
     # check last_id in sql
@@ -187,10 +188,10 @@ class TestIdTool(ERP5TypeTestCase):
     self.assertEquals(last_id_method(id_group='d02')[0]['LAST_INSERT_ID()'], 21)
     # check zodb dict
     if store:
-      self.assertEqual(sql_generator.last_max_id_dict['c02'].value, 0)
-      self.assertEqual(sql_generator.last_max_id_dict['d02'].value, 21)
+      self.assertEquals(sql_generator.last_max_id_dict['c02'].value, 0)
+      self.assertEquals(sql_generator.last_max_id_dict['d02'].value, 21)
     else:
-      self.assertEqual(getattr(sql_generator, 'last_max_id_dict', None), None)
+      self.assertEquals(getattr(sql_generator, 'last_max_id_dict', {}), {})
 
   def test_02b_generateNewIdWithSQLGeneratorWithoutStorageZODB(self):
     """
@@ -279,6 +280,57 @@ class TestIdTool(ERP5TypeTestCase):
     result =  sql_connection.manage_test(query)
     self.assertEqual(result[0].last_id, 4)
 
+  def checkExportImportDict(self, id_generator):
+    """
+      Check export import on id generator
+    """
+    generator = self.getLastGenerator(id_generator)
+    self.assertEquals(0, self.id_tool.generateNewId(id_generator=id_generator,
+                                                    id_group='06'))
+    id_dict = generator.exportGeneratorIdDict()
+    self.assertEquals(0, id_dict['06'])
+    generator.importGeneratorIdDict(id_dict={'06':6})
+    self.assertEquals(7, self.id_tool.generateNewId(id_generator=id_generator,
+                                                    id_group='06'))
+  def test_06_ExportImportDict(self):
+    """
+      Check export import dict for generator sql and zodb
+    """
+    self.checkExportImportDict(id_generator='test_application_zodb')
+    self.checkExportImportDict(id_generator='test_application_sql')
+
+  def test_07_checkImportValueAndStoreInterval(self):
+    """
+      Check that the store_interval store the last_id every N increments
+      store_interval is only on SQL
+    """
+    id_generator = 'test_application_sql'
+    sql_generator = self.getLastGenerator(id_generator)
+    sql_generator.setStoredInZodb(True)
+    sql_generator.setStoreInterval(2)
+    #sql_generator.setStoreInterval(2)
+    self.assertEquals(0, self.id_tool.generateNewId(id_generator=id_generator, 
+                                                    id_group='07'))
+    self.assertEquals(sql_generator.last_max_id_dict['07'].value, 0)
+    self.assertEquals(1, self.id_tool.generateNewId(id_generator=id_generator, 
+                                                    id_group='07'))
+    # last_id isn't stored because 1 < last_id (0) + store_interval
+    self.assertEquals(sql_generator.last_max_id_dict['07'].value, 0)
+    self.assertEquals(2, self.id_tool.generateNewId(id_generator=id_generator,
+                                                    id_group='07'))
+    self.assertEquals(sql_generator.last_max_id_dict['07'].value, 2)
+    
+    self.getLastGenerator(id_generator).\
+                 importGeneratorIdDict(id_dict = {'07':5})
+    self.assertEquals(6, self.id_tool.generateNewId(id_generator=id_generator,
+                                                    id_group='07'))
+    # last_id stored because 6 < last_id (5) + store_interval
+    self.assertEquals(sql_generator.last_max_id_dict['07'].value, 5)
+    # the sql value is higher that zodb value so the export return the sql
+    # value
+    id_dict = self.getLastGenerator(id_generator).exportGeneratorIdDict()
+    self.assertEquals(id_dict['07'], 6)
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestIdTool))




More information about the Erp5-report mailing list