← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev/openobject-server/6.0-bug-731487-xrg into lp:openobject-server/6.0

 

xrg has proposed merging lp:~openerp-dev/openobject-server/6.0-bug-731487-xrg into lp:openobject-server/6.0.

Requested reviews:
  OpenERP Core Team (openerp)
Related bugs:
  #731487 [6.0] SERVER : Can not add a osv.memory field from the Openerp interface
  https://bugs.launchpad.net/bugs/731487

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/6.0-bug-731487-xrg/+merge/52656
-- 
https://code.launchpad.net/~openerp-dev/openobject-server/6.0-bug-731487-xrg/+merge/52656
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-server/6.0-bug-731487-xrg.
=== modified file 'bin/addons/base/ir/ir_model.py'
--- bin/addons/base/ir/ir_model.py	2011-01-20 16:27:06 +0000
+++ bin/addons/base/ir/ir_model.py	2011-03-09 10:49:09 +0000
@@ -375,7 +375,13 @@
         res = super(ir_model_fields,self).write(cr, user, ids, vals, context=context)
 
         if column_rename:
-            cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO "%s"' % column_rename[1])
+            if isinstance(column_rename[0], osv.orm.orm):
+                cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO "%s"' % column_rename[1])
+            elif isinstance(column_rename[0], osv.orm.orm_memory):
+                for id in column_rename[0].datas:
+                    rec = column_rename[0].datas[id]
+                    rec[column_rename[1][2]] = rec[column_rename[1][1]]
+                    del rec[column_rename[1][1]]
             # This is VERY risky, but let us have this feature:
             # we want to change the key of column in obj._columns dict
             col = column_rename[0]._columns.pop(column_rename[1][1]) # take object out, w/o copy

=== modified file 'bin/osv/orm.py'
--- bin/osv/orm.py	2011-03-03 14:24:25 +0000
+++ bin/osv/orm.py	2011-03-09 10:49:09 +0000
@@ -1902,6 +1902,39 @@
         self.check_id = 0
         cr.execute('delete from wkf_instance where res_type=%s', (self._name,))
 
+        # Load manual fields
+        if True:
+            cr.execute('SELECT * FROM ir_model_fields WHERE model=%s AND state=%s', (self._name, 'manual'))
+            for field in cr.dictfetchall():
+                if field['name'] in self._columns:
+                    continue
+                attrs = {
+                    'string': field['field_description'],
+                    'required': bool(field['required']),
+                    'readonly': bool(field['readonly']),
+                    'domain': field['domain'] or None,
+                    'size': field['size'],
+                    'ondelete': field['on_delete'],
+                    'translate': (field['translate']),
+                    #'select': int(field['select_level'])
+                }
+
+                if field['ttype'] == 'selection':
+                    self._columns[field['name']] = getattr(fields, field['ttype'])(eval(field['selection']), **attrs)
+                elif field['ttype'] == 'reference':
+                    self._columns[field['name']] = getattr(fields, field['ttype'])(selection=eval(field['selection']), **attrs)
+                elif field['ttype'] == 'many2one':
+                    self._columns[field['name']] = getattr(fields, field['ttype'])(field['relation'], **attrs)
+                elif field['ttype'] == 'one2many':
+                    self._columns[field['name']] = getattr(fields, field['ttype'])(field['relation'], field['relation_field'], **attrs)
+                elif field['ttype'] == 'many2many':
+                    _rel1 = field['relation'].replace('.', '_')
+                    _rel2 = field['model'].replace('.', '_')
+                    _rel_name = 'x_%s_%s_%s_rel' %(_rel1, _rel2, field['name'])
+                    self._columns[field['name']] = getattr(fields, field['ttype'])(field['relation'], _rel_name, 'id1', 'id2', **attrs)
+                else:
+                    self._columns[field['name']] = getattr(fields, field['ttype'])(**attrs)
+
     def _check_access(self, uid, object_id, mode):
         if uid != 1 and self.datas[object_id]['internal.create_uid'] != uid:
             raise except_orm(_('AccessError'), '%s access is only allowed on your own records for osv_memory objects except for the super-user' % mode.capitalize())


Follow ups