[FIX] browse_record: raise a better exception when the id doesn't exists

[IMP] new method "exists" that verify that a given id exists in database (or in memory for osv_memory objects)

bzr revid: christophe@tinyerp.com-20090610111535-54wcw8tw48fvf9z9
This commit is contained in:
Christophe Simonis 2009-06-10 13:15:35 +02:00
parent 5992ca0389
commit 34ac7f5945
1 changed files with 19 additions and 3 deletions

View File

@ -80,6 +80,8 @@ class except_orm(Exception):
self.value = value
self.args = (name, value)
class BrowseRecordError(Exception):
pass
# Readonly python database object browser
class browse_null(object):
@ -126,7 +128,6 @@ class browse_record(object):
'''
if not context:
context = {}
assert id and isinstance(id, (int, long,)), _('Wrong ID for the browse record, got %r, expected an integer.') % (id,)
self._list_class = list_class or browse_record_list
self._cr = cr
self._uid = uid
@ -139,6 +140,11 @@ class browse_record(object):
cache.setdefault(table._name, {})
self._data = cache[table._name]
if not (id and isinstance(id, (int, long,))):
raise BrowseRecordError(_('Wrong ID for the browse record, got %r, expected an integer.') % (id,))
if not table.exists(cr, uid, id, context):
raise BrowseRecordError(_('Object %s does not exists') % (self,))
if id not in self._data:
self._data[id] = {'id': id}
@ -1163,6 +1169,9 @@ class orm_template(object):
def copy(self, cr, uid, id, default=None, context=None):
raise _('The copy method is not implemented on this object !')
def exists(self, cr, uid, id, context=None):
raise _('The exists method is not implemented on this object !')
def read_string(self, cr, uid, id, langs, fields=None, context=None):
res = {}
res2 = {}
@ -1204,7 +1213,7 @@ class orm_template(object):
raise NotImplementedError()
class orm_memory(orm_template):
_protected = ['read', 'write', 'create', 'default_get', 'perm_read', 'unlink', 'fields_get', 'fields_view_get', 'search', 'name_get', 'distinct_field_get', 'name_search', 'copy', 'import_data', 'search_count']
_protected = ['read', 'write', 'create', 'default_get', 'perm_read', 'unlink', 'fields_get', 'fields_view_get', 'search', 'name_get', 'distinct_field_get', 'name_search', 'copy', 'import_data', 'search_count', 'exists']
_inherit_fields = {}
_max_count = 200
_max_hours = 1
@ -1389,11 +1398,14 @@ class orm_memory(orm_template):
def _check_removed_columns(self, cr, log=False):
# nothing to check in memory...
pass
def exists(self, cr, uid, id, context=None):
return id in self.datas
class orm(orm_template):
_sql_constraints = []
_table = None
_protected = ['read','write','create','default_get','perm_read','unlink','fields_get','fields_view_get','search','name_get','distinct_field_get','name_search','copy','import_data','search_count']
_protected = ['read','write','create','default_get','perm_read','unlink','fields_get','fields_view_get','search','name_get','distinct_field_get','name_search','copy','import_data','search_count', 'exists']
def _parent_store_compute(self, cr):
logger = netsvc.Logger()
@ -2736,6 +2748,10 @@ class orm(orm_template):
trans_obj.create(cr,uid,record)
return new_id
def exists(self, cr, uid, id, context=None):
cr.execute('SELECT count(1) FROM "%s" where id=%%s' % (self._table,), (id,))
return bool(cr.fetchone()[0])
def check_recursion(self, cr, uid, ids, parent=None):
if not parent:
parent = self._parent_name