diff --git a/proteus/__init__.py b/proteus/__init__.py index ffd9451755..0936522f5f 100644 --- a/proteus/__init__.py +++ b/proteus/__init__.py @@ -258,6 +258,8 @@ class Model(object): def __init__(self, id=None, **kwargs): super(Model, self).__init__() + if id: + assert not kwargs self.__id = id or Model.__counter if self.__id < 0: Model.__counter -= 1 @@ -271,8 +273,15 @@ class Model(object): for field_name, value in kwargs.iteritems(): definition = self._fields[field_name] if definition['type'] in ('one2many', 'many2many'): + relation = Model.get(definition['relation']) + value = [isinstance(x, (int, long)) and relation(x) or x + for x in value] getattr(self, field_name).extend(value) else: + if (definition['type'] == 'many2one' + and isinstance(value, (int, long))): + relation = Model.get(definition['relation']) + value = relation(value) setattr(self, field_name, value) __init__.__doc__ = object.__init__.__doc__ @@ -481,7 +490,7 @@ class Model(object): res[arg] = scope return res - def _set_on_change(self, field, value): + def _on_change_set(self, field, value): if self._fields[field]['type'] in ('one2many', 'many2many'): if isinstance(value, (list, tuple)): self._values[field] = value @@ -501,13 +510,13 @@ class Model(object): relation = Model.get(self._fields[field]['relation'], self._config) # append without signal - list.append(getattr(self, field), relation(*vals)) + list.append(getattr(self, field), relation(**vals)) for vals in value.get('update', []): if 'id' not in vals: continue for record in getattr(self, field): if record.id == vals['id']: - for i, j in vals.iteritems: + for i, j in vals.iteritems(): record._values[i] = j record._changed.add(i) else: @@ -531,9 +540,9 @@ class Model(object): if self._fields[field]['type'] in ('one2many', 'many2many'): later[field] = value continue - self._set_on_change(field, value) + self._on_change_set(field, value) for field, value in later.iteritems(): - self._set_on_change(field, value) + self._on_change_set(field, value) if self._parent: self._parent._changed.add(self._parent_field_name) if definition.get('change_default'): @@ -552,7 +561,7 @@ class Model(object): context = self._config.context res = getattr(self._proxy, 'on_change_with_%s' % field)(args, context) - self._set_on_change(field, res) + self._on_change_set(field, res) class Wizard(object): diff --git a/proteus/tests/test_model.py b/proteus/tests/test_model.py index fe2d4130c9..a29767e209 100644 --- a/proteus/tests/test_model.py +++ b/proteus/tests/test_model.py @@ -79,6 +79,22 @@ class TestModel(TestCase): self.assert_(test2.id < 0) self.assertNotEqual(test1.id, test2.id) + def test_init(self): + User = Model.get('res.user') + self.assertEqual(User(1).id, 1) + self.assertEqual(User(name='Foo').name, 'Foo') + + Lang = Model.get('ir.lang') + en_US = Lang.find([('code', '=', 'en_US')])[0] + self.assertEqual(User(language=en_US).language, en_US) + self.assertEqual(User(language=en_US.id).language, en_US) + + Group = Model.get('res.group') + groups = Group.find() + self.assertEqual(len(User(groups=groups).groups), len(groups)) + self.assertEqual(len(User(groups=[x.id for x in groups]).groups), + len(groups)) + def test_save(self): User = Model.get('res.user') test = User() @@ -266,3 +282,30 @@ class TestModel(TestCase): trigger.on_create = True self.assertEqual(trigger.on_time, False) + + def test_on_change_set(self): + User = Model.get('res.user') + Group = Model.get('res.group') + + test = User() + test._on_change_set('name', 'Test') + self.assertEqual(test.name, 'Test') + group_ids = [x.id for x in Group.find()] + test._on_change_set('groups', group_ids) + self.assertEqual([x.id for x in test.groups], group_ids) + + test._on_change_set('groups', {'remove': [group_ids[0]]}) + self.assertEqual([x.id for x in test.groups], group_ids[1:]) + + test._on_change_set('groups', {'add': [{ + 'name': 'Bar', + }]}) + self.assert_([x for x in test.groups if x.name == 'Bar']) + + test.groups.extend(Group.find()) + group = test.groups[0] + test._on_change_set('groups', {'update': [{ + 'id': group.id, + 'name': 'Foo', + }]}) + self.assert_([x for x in test.groups if x.name == 'Foo'])