summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2019-02-14 14:37:48 +0000
committerXavier Morel <xmo@odoo.com>2020-04-07 09:25:08 +0000
commit1b1b2142f163e323e2d73bec6b380272a9c42998 (patch)
tree1bded85eb3e004978ae58129cf76963d3ecf754f
parent00c82d3121bc28c4902f8f084d2bb2807350c560 (diff)
[IMP] fields: add validation of parameter names
-rw-r--r--addons/base_sparse_field/models/models.py7
-rw-r--r--addons/mail/models/ir_model.py11
-rw-r--r--addons/mail/models/mail_thread.py4
-rw-r--r--addons/payment/models/payment_acquirer.py3
-rw-r--r--odoo/addons/base/models/ir_model.py3
-rw-r--r--odoo/addons/base/models/res_config.py7
-rw-r--r--odoo/fields.py34
-rw-r--r--odoo/models.py4
8 files changed, 58 insertions, 15 deletions
diff --git a/addons/base_sparse_field/models/models.py b/addons/base_sparse_field/models/models.py
index 0f9a2deebf5..1991306a631 100644
--- a/addons/base_sparse_field/models/models.py
+++ b/addons/base_sparse_field/models/models.py
@@ -6,6 +6,13 @@ from odoo import models, fields, api, _
from odoo.exceptions import UserError
+class Base(models.AbstractModel):
+ _inherit = 'base'
+
+ def _valid_field_parameter(self, field, name):
+ return name == 'sparse' or super()._valid_field_parameter(field, name)
+
+
class IrModelFields(models.Model):
_inherit = 'ir.model.fields'
diff --git a/addons/mail/models/ir_model.py b/addons/mail/models/ir_model.py
index 8d3cc258069..9b7589318e6 100644
--- a/addons/mail/models/ir_model.py
+++ b/addons/mail/models/ir_model.py
@@ -5,6 +5,17 @@ from odoo import _, api, fields, models
from odoo.exceptions import UserError
+class Base(models.AbstractModel):
+ _inherit = 'base'
+
+ def _valid_field_parameter(self, field, name):
+ # allow tracking on abstract models; see also 'mail.thread'
+ return (
+ name == 'tracking' and self._abstract
+ or super()._valid_field_parameter(field, name)
+ )
+
+
class IrModel(models.Model):
_inherit = 'ir.model'
_order = 'is_mail_thread DESC, name ASC'
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index 8b639ae5207..75ed62c8a8e 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -112,6 +112,10 @@ class MailThread(models.AbstractModel):
message_attachment_count = fields.Integer('Attachment Count', compute='_compute_message_attachment_count', groups="base.group_user")
message_main_attachment_id = fields.Many2one(string="Main Attachment", comodel_name='ir.attachment', index=True, copy=False)
+ def _valid_field_parameter(self, field, name):
+ # allow tracking on models inheriting from 'mail.thread'
+ return name == 'tracking' or super()._valid_field_parameter(field, name)
+
@api.depends('message_follower_ids')
def _get_followers(self):
for thread in self:
diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py
index c8c79d0e51d..281d47c15c6 100644
--- a/addons/payment/models/payment_acquirer.py
+++ b/addons/payment/models/payment_acquirer.py
@@ -61,6 +61,9 @@ class PaymentAcquirer(models.Model):
_description = 'Payment Acquirer'
_order = 'module_state, state, sequence, name'
+ def _valid_field_parameter(self, field, name):
+ return name == 'required_if_provider' or super()._valid_field_parameter(field, name)
+
def _get_default_view_template_id(self):
return self.env.ref('payment.default_acquirer_button', raise_if_not_found=False)
diff --git a/odoo/addons/base/models/ir_model.py b/odoo/addons/base/models/ir_model.py
index 62bf232adbe..256b5df21ba 100644
--- a/odoo/addons/base/models/ir_model.py
+++ b/odoo/addons/base/models/ir_model.py
@@ -1068,7 +1068,8 @@ class IrModelFields(models.Model):
}
if field_data['ttype'] in ('char', 'text', 'html'):
attrs['translate'] = bool(field_data['translate'])
- attrs['size'] = field_data['size'] or None
+ if field_data['ttype'] == 'char':
+ attrs['size'] = field_data['size'] or None
elif field_data['ttype'] in ('selection', 'reference'):
attrs['selection'] = self.env['ir.model.fields.selection']._get_selection_data(field_data['id'])
elif field_data['ttype'] == 'many2one':
diff --git a/odoo/addons/base/models/res_config.py b/odoo/addons/base/models/res_config.py
index f10e4574a31..a03a70a2ec6 100644
--- a/odoo/addons/base/models/res_config.py
+++ b/odoo/addons/base/models/res_config.py
@@ -375,6 +375,13 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin)
_name = 'res.config.settings'
_description = 'Config Settings'
+ def _valid_field_parameter(self, field, name):
+ return (
+ name in ('default_model', 'config_parameter')
+ or field.type in ('boolean', 'selection') and name in ('group', 'implied_group')
+ or super()._valid_field_parameter(field, name)
+ )
+
def copy(self, values):
raise UserError(_("Cannot duplicate configuration!"), "")
diff --git a/odoo/fields.py b/odoo/fields.py
index 9919bbc0f48..9442e3c0595 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -29,9 +29,6 @@ from odoo.exceptions import CacheMiss
DATE_LENGTH = len(date.today().strftime(DATE_FORMAT))
DATETIME_LENGTH = len(datetime.now().strftime(DATETIME_FORMAT))
-RENAMED_ATTRS = [('select', 'index'), ('digits_compute', 'digits')]
-DEPRECATED_ATTRS = [("oldname", "use an upgrade script instead.")]
-
IR_MODELS = (
'ir.model', 'ir.model.data', 'ir.model.fields', 'ir.model.fields.selection',
'ir.model.relation', 'ir.model.constraint', 'ir.module.module',
@@ -345,19 +342,22 @@ class Field(MetaField('DummyField', (object,), {})):
def _setup_attrs(self, model, name):
""" Initialize the field parameter attributes. """
+ # validate extra arguments
+ for key in self.args:
+ # TODO: improve filter as there are attributes on the class which
+ # are not valid on the field, probably
+ if not (hasattr(self, key) or model._valid_field_parameter(self, key)):
+ _logger.warning(
+ "Field %s.%s: unknown parameter %r, if this is an actual"
+ " parameter you may want to override the method"
+ " _valid_field_parameter on the relevant model in order to"
+ " allow it",
+ model._name, name, key
+ )
+
attrs = self._get_attrs(model, name)
self.__dict__.update(attrs)
- # check for renamed attributes (conversion errors)
- for key1, key2 in RENAMED_ATTRS:
- if key1 in attrs:
- _logger.warning("Field %s: parameter %r is no longer supported; use %r instead.",
- self, key1, key2)
- for key, msg in DEPRECATED_ATTRS:
- if key in attrs:
- _logger.warning("Field %s: parameter %r is not longer supported; %s",
- self, key, msg)
-
# prefetch only stored, column, non-manual and non-deprecated fields
if not (self.store and self.column_type) or self.manual or self.deprecated:
self.prefetch = False
@@ -466,7 +466,7 @@ class Field(MetaField('DummyField', (object,), {})):
setattr(self, attr, getattr(field, prop))
for attr, value in field.__dict__.items():
- if not hasattr(self, attr):
+ if not hasattr(self, attr) and model._valid_field_parameter(self, attr):
setattr(self, attr, value)
# special cases of inherited fields
@@ -2136,6 +2136,12 @@ class Selection(Field):
field = self.related_field
self.selection = lambda model: field._description_selection(model.env)
+ def _get_attrs(self, model, name):
+ attrs = super(Selection, self)._get_attrs(model, name)
+ # arguments 'selection' and 'selection_add' are processed below
+ attrs.pop('selection_add', None)
+ return attrs
+
def _setup_attrs(self, model, name):
super(Selection, self)._setup_attrs(model, name)
diff --git a/odoo/models.py b/odoo/models.py
index 927263f2025..071c7ba02ef 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -353,6 +353,10 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
"""
pass
+ def _valid_field_parameter(self, field, name):
+ """ Return whether the given parameter name is valid for the field. """
+ return name == 'related_sudo'
+
@api.model
def _add_field(self, name, field):
""" Add the given ``field`` under the given ``name`` in the class """