diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 011ad437cca..c54b4e3657d 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1037,6 +1037,7 @@ + @@ -1149,6 +1150,7 @@ + diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index a9d2a21b7a5..da9c5f9a7d4 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -202,6 +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), } _rec_name='field_description' _defaults = { @@ -279,11 +280,14 @@ 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}) + 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)}) self.pool.get(vals['model'])._auto_init(cr, ctx) return res @@ -294,6 +298,13 @@ class ir_model_fields(osv.osv): if context and context.get('manual',False): vals['state'] = 'manual' + if vals['serialization_field'] 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']): + 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']): + 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 obj = None models_patch = {} # structs of (obj, [(field, prop, change_to),..]) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 1ba5abbf85b..b3a71ee79c5 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -678,6 +678,7 @@ 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 "", } # When its a custom field,it does not contain f.select if context.get('field_state', 'base') == 'manual': @@ -693,13 +694,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 + relation,view_load,state,select_level,relation_field, translate, serialization_field ) VALUES ( - %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s + %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['select_level'], vals['relation_field'], bool(vals['translate']), vals['serialization_field'] )) if 'module' in context: name1 = 'field_' + self._table + '_' + k @@ -716,12 +717,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 + view_load=%s, select_level=%s, readonly=%s ,required=%s, selectable=%s, relation_field=%s, translate=%s, serialization_field=%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['model'], vals['name'] + 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'] )) break cr.commit() @@ -3290,7 +3291,12 @@ class orm(orm_template): #'select': int(field['select_level']) } - if field['ttype'] == 'selection': + if field['serialization_field']: + attrs.update({'serialization_field': field['serialization_field']}) + if field['ttype'] in ['many2one', 'one2many', 'many2many']: + attrs.update({'relation': field['relation']}) + self._columns[field['name']] = fields.sparse(**attrs) + elif field['ttype'] == 'selection': self._columns[field['name']] = fields.selection(eval(field['selection']), **attrs) elif field['ttype'] == 'reference': self._columns[field['name']] = fields.reference(selection=eval(field['selection']), **attrs)