diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index 8d0cdbca54e..f4130da55a4 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -647,11 +647,14 @@ - - - + + + + - + @@ -661,7 +664,7 @@ - + @@ -724,11 +727,14 @@ - - - + + + + - + @@ -737,7 +743,7 @@ - + diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py index 93365dc643e..b06f6edd7f6 100644 --- a/bin/addons/base/ir/ir_model.py +++ b/bin/addons/base/ir/ir_model.py @@ -72,7 +72,7 @@ class ir_model(osv.osv): def unlink(self, cr, user, ids, context=None): for model in self.browse(cr, user, ids, context): if model.state <> 'manual': - raise except_orm(_('Error'), _("You can not remove the model '%s' !") %(field.name,)) + raise except_orm(_('Error'), _("You can not remove the model '%s' !") %(model.name,)) res = super(ir_model, self).unlink(cr, user, ids, context) pooler.restart_pool(cr.dbname) return res @@ -201,6 +201,7 @@ class ir_model_fields(osv.osv): 'name': fields.char('Name', required=True, size=64, select=1), 'model': fields.char('Object Name', size=64, required=True), 'relation': fields.char('Object Relation', size=64), + 'relation_field': fields.char('Relation Field', size=64), 'model_id': fields.many2one('ir.model', 'Object id', required=True, select=True, ondelete='cascade'), 'field_description': fields.char('Field Label', required=True, size=256), 'relate': fields.boolean('Click and Relate'), @@ -212,7 +213,7 @@ class ir_model_fields(osv.osv): 'select_level': fields.selection([('0','Not Searchable'),('1','Always Searchable'),('2','Advanced Search')],'Searchable', required=True), 'translate': fields.boolean('Translate'), 'size': fields.integer('Size'), - 'state': fields.selection([('manual','Custom Field'),('base','Base Field')],'Manualy Created'), + 'state': fields.selection([('manual','Custom Field'),('base','Base Field')],'Manualy Created', required=True, readonly=True), 'on_delete': fields.selection([('cascade','Cascade'),('set null','Set NULL')], 'On delete', help='On delete property for many2one fields'), 'domain': fields.char('Domain', size=256), diff --git a/bin/osv/orm.py b/bin/osv/orm.py index e163cf23e4e..961f79e6aee 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -1594,6 +1594,14 @@ class orm(orm_template): self._columns[field['name']] = getattr(fields, field['ttype'])(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': + import random + _rel1 = field['relation'].replace('.', '_') + _rel2 = field['model'].replace('.', '_') + _rel_name = 'x_%s_%s_%s_rel' %(_rel1, _rel2, random.randint(0, 10000)) + 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)