[IMP] add the posibility to create sparse field dynamically
bzr revid: sebastien.beau@akretion.com.br-20110917183535-idzw9wg340gywduy
This commit is contained in:
parent
926980b325
commit
29297ed841
|
@ -1037,6 +1037,7 @@
|
|||
<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')]}"/>
|
||||
</group>
|
||||
<group colspan="2" col="2">
|
||||
<field name="required"/>
|
||||
|
@ -1149,6 +1150,7 @@
|
|||
<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')]}"/>
|
||||
</group>
|
||||
|
||||
<group colspan="2" col="2">
|
||||
|
|
|
@ -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),..])
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue