diff options
| author | Olivier Dony <odo@openerp.com> | 2010-12-20 17:09:59 +0100 |
|---|---|---|
| committer | Olivier Dony <odo@openerp.com> | 2010-12-20 17:09:59 +0100 |
| commit | afed2d47fe33aa6f3f0aa1c3de500e26f8bf40da (patch) | |
| tree | 92f1e08d33b464b2160c5faca79d826a4fd6aa72 | |
| parent | 4236d93ba505d6771af5373d91ff8d7499622a3c (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.py | 46 |
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') |
