Fix _on_change_set and handle integer as value of relation field in __init__ for issue1733
This commit is contained in:
1 parent
b9d97207e2
commit
3e693f6940
2 files changed
+58
-6
No files matched your search
+15
-6
@@ -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):
|
||||
|
||||
@@ -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'])
|
||||
Reference in new issue
Block a user