diff --git a/openerp/addons/base/tests/test_orm.py b/openerp/addons/base/tests/test_orm.py index c6bb9310acb..0c877a43622 100644 --- a/openerp/addons/base/tests/test_orm.py +++ b/openerp/addons/base/tests/test_orm.py @@ -111,6 +111,18 @@ class TestORM(common.TransactionCase): found = self.partner.search_read(self.cr, UID, [['name', '=', 'Does not exists']], ['name']) self.assertEqual(len(found), 0) + def test_exists(self): + partner = self.partner.browse(self.cr, UID, []) + + # check that records obtained from search exist + recs = partner.search([]) + self.assertTrue(recs) + self.assertEqual(recs.exists(), recs) + + # check that there is no record with id 0 + recs = partner.browse([0]) + self.assertFalse(recs.exists()) + def test_groupby_date(self): partners = dict( A='2012-11-19', diff --git a/openerp/models.py b/openerp/models.py index ad91afeb5d1..3f1bf70a54e 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -4774,14 +4774,15 @@ class BaseModel(object): By convention, new records are returned as existing. """ - ids = filter(None, self._ids) # ids to check in database + ids, new_ids = [], [] + for i in self._ids: + (ids if isinstance(i, (int, long)) else new_ids).append(i) if not ids: return self query = """SELECT id FROM "%s" WHERE id IN %%s""" % self._table - self._cr.execute(query, (ids,)) - ids = ([r[0] for r in self._cr.fetchall()] + # ids in database - [id for id in self._ids if not id]) # new ids - existing = self.browse(ids) + self._cr.execute(query, [tuple(ids)]) + ids = [r[0] for r in self._cr.fetchall()] + existing = self.browse(ids + new_ids) if len(existing) < len(self): # mark missing records in cache with a failed value exc = MissingError(_("Record does not exist or has been deleted."))