Fix _on_change_set and handle integer as value of relation field in __init__ for issue1733

This commit is contained in:
Cédric Krier committed 2010-10-23 16:36:21 +02:00
1 parent b9d97207e2
commit 3e693f6940
2 files changed
+58 -6

No files matched your search

+15 -6
View File
@@ -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):
+43
View File
@@ -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'])