← Back to team overview

credativ team mailing list archive

[Merge] lp:~zaber/openupgrade-server/recreate-currencies into lp:openupgrade-server/6.0

 

Don Kirkby has proposed merging lp:~zaber/openupgrade-server/recreate-currencies into lp:openupgrade-server/6.0.

Requested reviews:
  OpenUpgrade Committers (openupgrade-committers)
Related bugs:
  Bug #1025797 in OpenUpgrade Server: "New configuration records reference old ones that have been deleted"
  https://bugs.launchpad.net/openupgrade-server/+bug/1025797

For more details, see:
https://code.launchpad.net/~zaber/openupgrade-server/recreate-currencies/+merge/115404

Fix for bug 1025797 that recreates deleted currency records.
-- 
https://code.launchpad.net/~zaber/openupgrade-server/recreate-currencies/+merge/115404
Your team OpenUpgrade Committers is requested to review the proposed merge of lp:~zaber/openupgrade-server/recreate-currencies into lp:openupgrade-server/6.0.
=== modified file 'bin/addons/base/migrations/6.0.1.3/pre-migration.py'
--- bin/addons/base/migrations/6.0.1.3/pre-migration.py	2012-06-23 14:23:36 +0000
+++ bin/addons/base/migrations/6.0.1.3/pre-migration.py	2012-07-17 18:00:32 +0000
@@ -86,6 +86,18 @@
 
 @openupgrade.migrate()
 def migrate(cr, version):
+    openupgrade.recreate_deleted_data(cr, 
+                                      'res.currency',
+                                      'res_currency',
+                                      {'name': 'recreated dummy'})
+    
+    # Give currencies unique names to meet new constraint in OpenERP 6.1.
+    cr.execute("""\
+update  res_currency
+set     name = name || id
+where   name = 'recreated dummy'
+""")
+    
     openupgrade.update_module_names(
         cr, module_namespec
         )

=== modified file 'bin/openupgrade/openupgrade.py'
--- bin/openupgrade/openupgrade.py	2012-07-10 21:53:55 +0000
+++ bin/openupgrade/openupgrade.py	2012-07-17 18:00:32 +0000
@@ -313,6 +313,75 @@
         query = 'ALTER TABLE ir_model_fields ADD COLUMN %s %s' % (
             column)
         logged_query(cr, query, [])
+
+def recreate_deleted_data(cr, 
+                          model_name, 
+                          table_name, 
+                          defaults, 
+                          make_inactive=True):
+    """
+    If new configuration records refer to something that got deleted, those
+    inserts will fail. This recreates any deleted records, but deactivates
+    them. It looks for entries in ir_model_data with no matching resource.
+    
+    :param model_name: The model to check for deleted records. For example,
+        'product.uom'.
+    :param table_name: The table to recreate the records in. For example,
+        'product_uom'.
+    :param defaults: A dictionary of field names and their default values
+        for the new records. If 'active' is not included, it will be False.
+        Values must be strings, numbers, or booleans.
+    """
+    
+    data = dict(defaults)
+    if make_inactive:
+        data['active'] = False
+    field_names = data.keys()
+    field_values = [repr(data[field]) for field in field_names]
+    cr.execute("""\
+select  imd.id
+from    ir_model_data imd
+where   not exists
+        (
+        SELECT  1
+        from    %s res
+        where   res.id = imd.res_id
+        )
+and     imd.model = '%s'""" % (table_name, model_name))
+    rows = cr.fetchall()
+    for (imd_id,) in rows:
+        cr.execute("SELECT nextval('%s_id_seq')" % table_name)
+        (res_id, ) = cr.fetchone()
+        query = """\
+INSERT
+INTO    %s
+        (
+        id,
+        %s
+        )
+VALUES  (
+        %d,
+        %s
+        )
+""" % (table_name, ', '.join(field_names), res_id, ', '.join(field_values))
+        cr.execute(query)
+        cr.execute('update ir_model_data set res_id = %d where id = %d' % 
+                   (res_id, imd_id))
+
+def find_valid_id(cr, table_name):
+    """
+    Sometimes you just need a valid id from a table, and you don't care which
+    one it is. It might not even be an active record.
+    
+    :param table_name: The table to query for the id.
+    """
+    cr.execute("SELECT id FROM %s LIMIT 1" % table_name)
+    row = cr.fetchone()
+    if row:
+        return row[0]
+    raise RuntimeError('No records found in %s.' % table_name)
+    
+    
         
 def add_module_dependencies(cr, module_list):
     """