diff options
| author | Raphael Collet <rco@odoo.com> | 2019-02-14 14:37:48 +0000 |
|---|---|---|
| committer | Xavier Morel <xmo@odoo.com> | 2020-04-07 09:25:08 +0000 |
| commit | 1b1b2142f163e323e2d73bec6b380272a9c42998 (patch) | |
| tree | 1bded85eb3e004978ae58129cf76963d3ecf754f | |
| parent | 00c82d3121bc28c4902f8f084d2bb2807350c560 (diff) | |
[IMP] fields: add validation of parameter names
| -rw-r--r-- | addons/base_sparse_field/models/models.py | 7 | ||||
| -rw-r--r-- | addons/mail/models/ir_model.py | 11 | ||||
| -rw-r--r-- | addons/mail/models/mail_thread.py | 4 | ||||
| -rw-r--r-- | addons/payment/models/payment_acquirer.py | 3 | ||||
| -rw-r--r-- | odoo/addons/base/models/ir_model.py | 3 | ||||
| -rw-r--r-- | odoo/addons/base/models/res_config.py | 7 | ||||
| -rw-r--r-- | odoo/fields.py | 34 | ||||
| -rw-r--r-- | odoo/models.py | 4 |
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 """ |
