[REF] ir_model_field replace the serialisation_field by serialization_field_id
authorsebastien beau <sebastien.beau@akretion.com.br>
Tue, 20 Sep 2011 17:07:07 +0000 (19:07 +0200)
committersebastien beau <sebastien.beau@akretion.com.br>
Tue, 20 Sep 2011 17:07:07 +0000 (19:07 +0200)
change request in base.sql as a new field is created in ir_model_fields

bzr revid: sebastien.beau@akretion.com.br-20110920170707-2wmfs1sg37hgvbl1

openerp/addons/base/base.sql
openerp/addons/base/ir/ir.xml
openerp/addons/base/ir/ir_model.py
openerp/osv/orm.py

index 54dcc3a..2a13348 100644 (file)
@@ -49,6 +49,8 @@ CREATE TABLE ir_model_fields (
   primary key(id)
 );
 
+ALTER TABLE ir_model_fields ADD column serialization_field_id int references ir_model_fields on delete cascade;
+
 
 -------------------------------------------------------------------------
 -- Actions
index c54b4e3..d8d77c2 100644 (file)
                                         <field name="selection" attrs="{'required': [('ttype','in',['selection','reference'])], 'readonly': [('ttype','not in',['selection','reference'])]}"/>
                                         <field name="size" attrs="{'required': [('ttype','in',['char','reference'])], 'readonly': [('ttype','not in',['char','reference'])]}"/>
                                         <field name="domain" attrs="{'readonly': [('relation','=','')]}"/>
-                                        <field name="serialization_field" attrs="{'readonly': [('state','=','base')]}"/>
+                                        <field name="model_id" invisible="1"/>
+                                        <field name="serialization_field_id" attrs="{'readonly': [('state','=','base')]}" domain = "[('ttype','=','serialized'), ('model_id', '=', model_id)]"/>
                                     </group>
                                     <group colspan="2" col="2">
                                         <field name="required"/>
                                 <field name="selection" attrs="{'required': [('ttype','in',['selection','reference'])], 'readonly': [('ttype','not in',['selection','reference'])]}"/>
                                 <field name="size" attrs="{'required': [('ttype','in',['char','reference'])], 'readonly': [('ttype','not in',['char','reference'])]}"/>
                                 <field name="domain" attrs="{'readonly': [('relation','=','')]}"/>
-                                <field name="serialization_field" attrs="{'readonly': [('state','=','base')]}"/>
+                                <field name="model_id" invisible="1"/>
+                                <field name="serialization_field_id" attrs="{'readonly': [('state','=','base')]}" domain = "[('ttype','=','serialized'), ('model_id', '=', model_id)]"/>
                             </group>
 
                             <group colspan="2" col="2">
index da9c5f9..bbd021e 100644 (file)
@@ -202,7 +202,7 @@ class ir_model_fields(osv.osv):
         'view_load': fields.boolean('View Auto-Load'),
         'selectable': fields.boolean('Selectable'),
         'modules': fields.function(_in_modules, method=True, type='char', size=128, string='In modules', help='List of modules in which the field is defined'),
-        'serialization_field': fields.char('Serialization Field', size=64),
+        'serialization_field_id': fields.many2one('ir.model.fields', 'Serialization Field', domain = "[('ttype','=','serialized')]", ondelete='cascade'),
     }
     _rec_name='field_description'
     _defaults = {
@@ -280,14 +280,11 @@ class ir_model_fields(osv.osv):
             if vals.get('relation',False) and not self.pool.get('ir.model').search(cr, user, [('model','=',vals['relation'])]):
                  raise except_orm(_('Error'), _("Model %s does not exist!") % vals['relation'])
 
-            if vals.get('serialization_field',False) and not self.search(cr, user, [('model','=',vals['model']), ('name', '=', vals['serialization_field'])]):
-                 raise except_orm(_('Error'), _("The field %s does not exist!") % vals['serialization_field'])
-            
             if self.pool.get(vals['model']):
                 self.pool.get(vals['model']).__init__(self.pool, cr)
                 #Added context to _auto_init for special treatment to custom field for select_level
                 ctx = context.copy()
-                ctx.update({'field_name':vals['name'],'field_state':'manual','select':vals.get('select_level','0'),'update_custom_fields':True, 'serialization_field': vals.get('serialization_field',False)})
+                ctx.update({'field_name':vals['name'],'field_state':'manual','select':vals.get('select_level','0'),'update_custom_fields':True})
                 self.pool.get(vals['model'])._auto_init(cr, ctx)
 
         return res
@@ -298,11 +295,11 @@ class ir_model_fields(osv.osv):
         if context and context.get('manual',False):
             vals['state'] = 'manual'
 
-        if vals['serialization_field'] or vals['name']:
+        if vals['serialization_field_id'] or vals['name']:
             for field in self.browse(cr, user, ids, context=context):
-                if field.serialization_field and field.serialization_field != vals['serialization_field'] or (not field.serialization_field and vals['serialization_field']):
+                if field.serialization_field_id and field.serialization_field_id.id != vals['serialization_field_id'] or (not field.serialization_field_id and vals['serialization_field_id']):
                     raise except_orm(_('Error!'),  _('Changing the storing system for the field "%s" is not allowed.'%field.name))
-                elif field.serialization_field and (field.name != vals['name']):
+                elif field.serialization_field_id and (field.name != vals['name']):
                     raise except_orm(_('Error!'),  _('Renaming the sparse field "%s" is not allowed'%field.name))           
                 
         column_rename = None # if set, *one* column can be renamed here
index b3a71ee..1ca0c19 100644 (file)
@@ -663,7 +663,17 @@ class orm_template(object):
         for rec in cr.dictfetchall():
             cols[rec['name']] = rec
 
-        for (k, f) in self._columns.items():
+        ir_model_fields_obj = self.pool.get('ir.model.fields')
+        
+        high_priority_items=[]
+        low_priority_items=[]
+        #sparse field should be created at the end, indeed this field depend of other field
+        for item in self._columns.items():
+            if item[1].__class__ == fields.sparse:
+                low_priority_items.append(item)
+            else:
+                high_priority_items.append(item)
+        for (k, f) in high_priority_items + low_priority_items:
             vals = {
                 'model_id': model_id,
                 'model': self._name,
@@ -678,8 +688,14 @@ class orm_template(object):
                 'selectable': (f.selectable and 1) or 0,
                 'translate': (f.translate and 1) or 0,
                 'relation_field': (f._type=='one2many' and isinstance(f, fields.one2many)) and f._fields_id or '',
-                'serialization_field': 'serialization_field' in dir(f) and f.serialization_field or "",
+                'serialization_field_id': None,
             }
+            if 'serialization_field' in dir(f):
+                serialization_field_id = ir_model_fields_obj.search(cr, 1, [('model','=',vals['model']), ('name', '=', f.serialization_field)])
+                if not serialization_field_id:
+                    raise except_orm(_('Error'), _("The field %s does not exist!" %f.serialization_field))
+                vals['serialization_field_id'] = serialization_field_id[0]
+            
             # When its a custom field,it does not contain f.select
             if context.get('field_state', 'base') == 'manual':
                 if context.get('field_name', '') == k:
@@ -694,13 +710,13 @@ class orm_template(object):
                 vals['id'] = id
                 cr.execute("""INSERT INTO ir_model_fields (
                     id, model_id, model, name, field_description, ttype,
-                    relation,view_load,state,select_level,relation_field, translate, serialization_field
+                    relation,view_load,state,select_level,relation_field, translate, serialization_field_id
                 ) VALUES (
                     %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s
                 )""", (
                     id, vals['model_id'], vals['model'], vals['name'], vals['field_description'], vals['ttype'],
                      vals['relation'], bool(vals['view_load']), 'base',
-                    vals['select_level'], vals['relation_field'], bool(vals['translate']), vals['serialization_field']
+                    vals['select_level'], vals['relation_field'], bool(vals['translate']), vals['serialization_field_id']
                 ))
                 if 'module' in context:
                     name1 = 'field_' + self._table + '_' + k
@@ -717,12 +733,12 @@ class orm_template(object):
                         cr.commit()
                         cr.execute("""UPDATE ir_model_fields SET
                             model_id=%s, field_description=%s, ttype=%s, relation=%s,
-                            view_load=%s, select_level=%s, readonly=%s ,required=%s, selectable=%s, relation_field=%s, translate=%s, serialization_field=%s
+                            view_load=%s, select_level=%s, readonly=%s ,required=%s, selectable=%s, relation_field=%s, translate=%s, serialization_field_id=%s
                         WHERE
                             model=%s AND name=%s""", (
                                 vals['model_id'], vals['field_description'], vals['ttype'],
                                 vals['relation'], bool(vals['view_load']),
-                                vals['select_level'], bool(vals['readonly']), bool(vals['required']), bool(vals['selectable']), vals['relation_field'], bool(vals['translate']), vals['serialization_field'], vals['model'], vals['name']
+                                vals['select_level'], bool(vals['readonly']), bool(vals['required']), bool(vals['selectable']), vals['relation_field'], bool(vals['translate']), vals['serialization_field_id'], vals['model'], vals['name']
                             ))
                         break
         cr.commit()
@@ -3291,8 +3307,9 @@ class orm(orm_template):
                     #'select': int(field['select_level'])
                 }
 
-                if field['serialization_field']:
-                    attrs.update({'serialization_field': field['serialization_field']})
+                if field['serialization_field_id']:
+                    cr.execute('SELECT name FROM ir_model_fields WHERE id=%s', (field['serialization_field_id'],))
+                    attrs.update({'serialization_field': cr.fetchone()[0], 'type': field['ttype']})
                     if field['ttype'] in ['many2one', 'one2many', 'many2many']:
                         attrs.update({'relation': field['relation']})
                     self._columns[field['name']] = fields.sparse(**attrs)