summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Dony <odo@openerp.com>2010-12-20 17:09:59 +0100
committerOlivier Dony <odo@openerp.com>2010-12-20 17:09:59 +0100
commitafed2d47fe33aa6f3f0aa1c3de500e26f8bf40da (patch)
tree92f1e08d33b464b2160c5faca79d826a4fd6aa72
parent4236d93ba505d6771af5373d91ff8d7499622a3c (diff)
[FIX] fields.reference: don't accept half-defined references, and avoid crashing on previous bad ones
lp bug: https://launchpad.net/bugs/604604 fixed bzr revid: odo@openerp.com-20101220160959-f6x2kik46btf0uol
-rw-r--r--bin/osv/orm.py46
1 files changed, 29 insertions, 17 deletions
diff --git a/bin/osv/orm.py b/bin/osv/orm.py
index aa5835414fd..44219344519 100644
--- a/bin/osv/orm.py
+++ b/bin/osv/orm.py
@@ -260,8 +260,11 @@ class browse_record(object):
else:
ref_obj, ref_id = result_line[field_name].split(',')
ref_id = long(ref_id)
- obj = self._table.pool.get(ref_obj)
- new_data[field_name] = browse_record(self._cr, self._uid, ref_id, obj, self._cache, context=self._context, list_class=self._list_class, fields_process=self._fields_process)
+ if ref_id:
+ obj = self._table.pool.get(ref_obj)
+ new_data[field_name] = browse_record(self._cr, self._uid, ref_id, obj, self._cache, context=self._context, list_class=self._list_class, fields_process=self._fields_process)
+ else:
+ new_data[field_name] = browse_null()
else:
new_data[field_name] = browse_null()
else:
@@ -2436,6 +2439,29 @@ class orm(orm_template):
if (val<>False) or (type(val)<>bool):
cr.execute(update_query, (ss[1](val), key))
+ def _check_selection_field_value(self, cr, uid, field, value, context=None):
+ """Raise except_orm if value is not among the valid values for the selection field"""
+ if self._columns[field]._type == 'reference':
+ val_model, val_id_str = value.split(',', 1)
+ val_id = False
+ try:
+ val_id = long(val_id_str)
+ except ValueError:
+ pass
+ if not val_id:
+ raise except_orm(_('ValidateError'),
+ _('Invalid value for reference field "%s" (last part must be a non-zero integer): "%s"') % (field, value))
+ val = val_model
+ else:
+ val = value
+ if isinstance(self._columns[field].selection, (tuple, list)):
+ if val in dict(self._columns[field].selection):
+ return
+ elif val in dict(self._columns[field].selection(self, cr, uid, context=context)):
+ return
+ raise except_orm(_('ValidateError'),
+ _('The value "%s" for the field "%s" is not in the selection') % (value, field))
+
def _check_removed_columns(self, cr, log=False):
# iterate on the database columns to drop the NOT NULL constraints
# of fields which were required but have been removed (or will be added by another module)
@@ -3469,21 +3495,7 @@ class orm(orm_template):
if field in self._columns \
and hasattr(self._columns[field], 'selection') \
and vals[field]:
- if self._columns[field]._type == 'reference':
- val = vals[field].split(',')[0]
- else:
- val = vals[field]
- if isinstance(self._columns[field].selection, (tuple, list)):
- if val not in dict(self._columns[field].selection):
- raise except_orm(_('ValidateError'),
- _('The value "%s" for the field "%s" is not in the selection') \
- % (vals[field], field))
- else:
- if val not in dict(self._columns[field].selection(
- self, cr, user, context=context)):
- raise except_orm(_('ValidateError'),
- _('The value "%s" for the field "%s" is not in the selection') \
- % (vals[field], field))
+ self._check_selection_field_value(cr, user, field, vals[field], context=context)
if self._log_access:
upd0.append('write_uid=%s')