credativ team mailing list archive
-
credativ team
-
Mailing list archive
-
Message #04914
[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):
"""