summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
authorAdrian Torres <adt@odoo.com>2019-07-10 14:59:37 +0200
committerAdrian Torres <adt@odoo.com>2019-07-17 14:13:12 +0200
commit4b38cc6590abcb58a0ca102a06063eb3db7ac1f4 (patch)
treecfd11739fc6b4c0cb4b23b54cc6badad4bf5c55e /odoo
parentf6fdde96bddfedf8764cd8a73089e44340d476ae (diff)
[REM] *: calls to @api.multi
Multi is the default api for methods, it is not necessary to explicitly decorate methods with it, adds clutter and most people use it because they see that the rest of the code uses it. Done with `find . -type f -name '*.py' | xargs sed -i '/@api.multi/d'`
Diffstat (limited to 'odoo')
-rw-r--r--odoo/addons/base/models/decimal_precision.py2
-rw-r--r--odoo/addons/base/models/image_mixin.py3
-rw-r--r--odoo/addons/base/models/ir_actions.py14
-rw-r--r--odoo/addons/base/models/ir_actions_report.py11
-rw-r--r--odoo/addons/base/models/ir_attachment.py5
-rw-r--r--odoo/addons/base/models/ir_config_parameter.py2
-rw-r--r--odoo/addons/base/models/ir_cron.py5
-rw-r--r--odoo/addons/base/models/ir_default.py2
-rw-r--r--odoo/addons/base/models/ir_filters.py2
-rw-r--r--odoo/addons/base/models/ir_mail_server.py1
-rw-r--r--odoo/addons/base/models/ir_model.py15
-rw-r--r--odoo/addons/base/models/ir_module.py22
-rw-r--r--odoo/addons/base/models/ir_property.py4
-rw-r--r--odoo/addons/base/models/ir_rule.py2
-rw-r--r--odoo/addons/base/models/ir_sequence.py6
-rw-r--r--odoo/addons/base/models/ir_translation.py4
-rw-r--r--odoo/addons/base/models/ir_ui_menu.py5
-rw-r--r--odoo/addons/base/models/ir_ui_view.py11
-rw-r--r--odoo/addons/base/models/res_bank.py2
-rw-r--r--odoo/addons/base/models/res_company.py6
-rw-r--r--odoo/addons/base/models/res_config.py13
-rw-r--r--odoo/addons/base/models/res_country.py3
-rw-r--r--odoo/addons/base/models/res_currency.py9
-rw-r--r--odoo/addons/base/models/res_lang.py3
-rw-r--r--odoo/addons/base/models/res_partner.py17
-rw-r--r--odoo/addons/base/models/res_users.py27
-rw-r--r--odoo/addons/base/report/report_base_report_irmodulereference.py1
-rw-r--r--odoo/addons/base/wizard/base_export_language.py1
-rw-r--r--odoo/addons/base/wizard/base_import_language.py1
-rw-r--r--odoo/addons/base/wizard/base_language_install.py1
-rw-r--r--odoo/addons/base/wizard/base_module_uninstall.py1
-rw-r--r--odoo/addons/base/wizard/base_module_update.py2
-rw-r--r--odoo/addons/base/wizard/base_module_upgrade.py3
-rw-r--r--odoo/addons/base/wizard/base_partner_merge.py10
-rw-r--r--odoo/addons/base/wizard/base_update_translations.py1
-rw-r--r--odoo/addons/test_assetsbundle/tests/test_assetsbundle.py1
-rw-r--r--odoo/addons/test_exceptions/models.py23
-rw-r--r--odoo/addons/test_impex/models.py4
-rw-r--r--odoo/addons/test_inherit/models.py1
-rw-r--r--odoo/addons/test_new_api/models.py2
-rw-r--r--odoo/api.py1
-rw-r--r--odoo/models.py31
-rw-r--r--odoo/tools/profiler.py1
43 files changed, 0 insertions, 281 deletions
diff --git a/odoo/addons/base/models/decimal_precision.py b/odoo/addons/base/models/decimal_precision.py
index dec400b1328..6e683914223 100644
--- a/odoo/addons/base/models/decimal_precision.py
+++ b/odoo/addons/base/models/decimal_precision.py
@@ -38,13 +38,11 @@ class DecimalPrecision(models.Model):
self.clear_caches()
return res
- @api.multi
def write(self, data):
res = super(DecimalPrecision, self).write(data)
self.clear_caches()
return res
- @api.multi
def unlink(self):
res = super(DecimalPrecision, self).unlink()
self.clear_caches()
diff --git a/odoo/addons/base/models/image_mixin.py b/odoo/addons/base/models/image_mixin.py
index d6de91f9fbb..855415e385f 100644
--- a/odoo/addons/base/models/image_mixin.py
+++ b/odoo/addons/base/models/image_mixin.py
@@ -22,7 +22,6 @@ class ImageMixin(models.AbstractModel):
image = fields.Binary("Image", compute='_compute_image', inverse='_set_image')
- @api.multi
@api.depends('image_original')
def _compute_images(self):
for record in self:
@@ -36,13 +35,11 @@ class ImageMixin(models.AbstractModel):
record.image_small = image and images['image_small']
record.can_image_be_zoomed = image and tools.is_image_size_above(image)
- @api.multi
@api.depends('image_big')
def _compute_image(self):
for record in self:
record.image = record.image_big
- @api.multi
def _set_image(self):
for record in self:
record.image_original = record.image
diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py
index 66d11d4bd6e..0a7f34c141f 100644
--- a/odoo/addons/base/models/ir_actions.py
+++ b/odoo/addons/base/models/ir_actions.py
@@ -61,14 +61,12 @@ class IrActions(models.Model):
self.clear_caches()
return res
- @api.multi
def write(self, vals):
res = super(IrActions, self).write(vals)
# self.get_bindings() depends on action records
self.clear_caches()
return res
- @api.multi
def unlink(self):
"""unlink ir.action.todo which are related to actions which will be deleted.
NOTE: ondelete cascade will not work on ir.actions.actions so we will need to do it manually."""
@@ -197,7 +195,6 @@ class IrActionsActWindow(models.Model):
filter = fields.Boolean()
search_view = fields.Text(compute='_compute_search_view')
- @api.multi
def read(self, fields=None, load='_classic_read'):
""" call the method get_empty_list_help of the model and set the window action help message
"""
@@ -234,12 +231,10 @@ class IrActionsActWindow(models.Model):
vals['name'] = self.env[vals['res_model']]._description
return super(IrActionsActWindow, self).create(vals_list)
- @api.multi
def unlink(self):
self.clear_caches()
return super(IrActionsActWindow, self).unlink()
- @api.multi
def exists(self):
ids = self._existing()
existing = self.filtered(lambda rec: rec.id in ids)
@@ -423,7 +418,6 @@ class IrActionsServer(models.Model):
def _onchange_model_id(self):
self.model_name = self.model_id.model
- @api.multi
def create_action(self):
""" Create a contextual action for each server action. """
for action in self:
@@ -431,7 +425,6 @@ class IrActionsServer(models.Model):
'binding_type': 'action'})
return True
- @api.multi
def unlink_action(self):
""" Remove the contextual actions created for the server actions. """
self.check_access_rights('write', raise_exception=True)
@@ -541,7 +534,6 @@ class IrActionsServer(models.Model):
})
return eval_context
- @api.multi
def run(self):
""" Runs the server action. For each server action, the
run_action_<STATE> method is called. This allows easy overriding
@@ -647,7 +639,6 @@ class IrServerObjectLines(models.Model):
if line.resource_ref:
line.value = str(line.resource_ref.id)
- @api.multi
def eval_value(self, eval_context=None):
result = dict.fromkeys(self.ids, False)
for line in self:
@@ -684,7 +675,6 @@ class IrActionsTodo(models.Model):
self.ensure_one_open_todo()
return todos
- @api.multi
def write(self, vals):
res = super(IrActionsTodo, self).write(vals)
if vals.get('state', '') == 'open':
@@ -697,11 +687,9 @@ class IrActionsTodo(models.Model):
if open_todo:
open_todo.write({'state': 'done'})
- @api.multi
def name_get(self):
return [(record.id, record.action_id.name) for record in self]
- @api.multi
def unlink(self):
if self:
try:
@@ -722,7 +710,6 @@ class IrActionsTodo(models.Model):
return self.browse(action_ids).name_get()
return super(IrActionsTodo, self)._name_search(name, args=args, operator=operator, limit=limit, name_get_uid=name_get_uid)
- @api.multi
def action_launch(self):
""" Launch Action of Wizard"""
self.ensure_one()
@@ -750,7 +737,6 @@ class IrActionsTodo(models.Model):
return result
- @api.multi
def action_open(self):
""" Sets configuration wizard in TODO state"""
return self.write({'state': 'open'})
diff --git a/odoo/addons/base/models/ir_actions_report.py b/odoo/addons/base/models/ir_actions_report.py
index 5c5ead2507f..1e76c8c1cf8 100644
--- a/odoo/addons/base/models/ir_actions_report.py
+++ b/odoo/addons/base/models/ir_actions_report.py
@@ -143,7 +143,6 @@ class IrActionsReport(models.Model):
else:
return FALSE_DOMAIN
- @api.multi
def associated_view(self):
"""Used in the ir.actions.report form view in order to search naively after the view(s)
used in the rendering.
@@ -156,7 +155,6 @@ class IrActionsReport(models.Model):
action_data['domain'] = [('name', 'ilike', self.report_name.split('.')[1]), ('type', '=', 'qweb')]
return action_data
- @api.multi
def create_action(self):
""" Create a contextual action for each report. """
for report in self:
@@ -164,7 +162,6 @@ class IrActionsReport(models.Model):
report.write({'binding_model_id': model.id, 'binding_type': 'report'})
return True
- @api.multi
def unlink_action(self):
""" Remove the contextual actions created for the reports. """
self.check_access_rights('write', raise_exception=True)
@@ -174,7 +171,6 @@ class IrActionsReport(models.Model):
#--------------------------------------------------------------------------
# Main report methods
#--------------------------------------------------------------------------
- @api.multi
def _retrieve_stream_from_attachment(self, attachment):
#This import is needed to make sure a PDF stream can be saved in Image
from PIL import PdfImagePlugin
@@ -185,7 +181,6 @@ class IrActionsReport(models.Model):
return stream
return io.BytesIO(base64.decodestring(attachment.datas))
- @api.multi
def retrieve_attachment(self, record):
'''Retrieve an attachment for a specific record.
@@ -202,7 +197,6 @@ class IrActionsReport(models.Model):
('res_id', '=', record.id)
], limit=1)
- @api.multi
def postprocess_pdf_report(self, record, buffer):
'''Hook to handle post processing during the pdf report generation.
The basic behavior consists to create a new attachment containing the pdf
@@ -325,7 +319,6 @@ class IrActionsReport(models.Model):
return command_args
- @api.multi
def _prepare_html(self, html):
'''Divide and recreate the header/footer html by merging all found in html.
The bodies are extracted and added to a list. Then, extract the specific_paperformat_args.
@@ -515,7 +508,6 @@ class IrActionsReport(models.Model):
else:
return self.barcode('Code128', value, width=width, height=height, humanreadable=humanreadable)
- @api.multi
def render_template(self, template, values=None):
"""Allow to render a QWeb template python-side. This function returns the 'ir.ui.view'
render but embellish it with some variables/methods used in reports.
@@ -546,7 +538,6 @@ class IrActionsReport(models.Model):
)
return view_obj.render_template(template, values)
- @api.multi
def _post_pdf(self, save_in_attachment, pdf_content=None, res_ids=None):
'''Merge the existing attachments by adding one by one the content of the attachments
and then, we add the pdf_content if exists. Create the attachments for each record individually
@@ -650,7 +641,6 @@ class IrActionsReport(models.Model):
writer.write(result_stream)
return result_stream.getvalue()
- @api.multi
def render_qweb_pdf(self, res_ids=None, data=None):
if not data:
data = {}
@@ -786,7 +776,6 @@ class IrActionsReport(models.Model):
})
return data
- @api.multi
def render(self, res_ids, data=None):
report_type = self.report_type.lower().replace('-', '_')
render_func = getattr(self, 'render_' + report_type, None)
diff --git a/odoo/addons/base/models/ir_attachment.py b/odoo/addons/base/models/ir_attachment.py
index 0cd42acce97..e6508eb0e22 100644
--- a/odoo/addons/base/models/ir_attachment.py
+++ b/odoo/addons/base/models/ir_attachment.py
@@ -461,12 +461,10 @@ class IrAttachment(models.Model):
return len(result) if count else list(result)
- @api.multi
def read(self, fields=None, load='_classic_read'):
self.check('read')
return super(IrAttachment, self).read(fields, load=load)
- @api.multi
def write(self, vals):
self.check('write', values=vals)
# remove computed field depending of datas
@@ -476,12 +474,10 @@ class IrAttachment(models.Model):
vals = self._check_contents(vals)
return super(IrAttachment, self).write(vals)
- @api.multi
def copy(self, default=None):
self.check('write')
return super(IrAttachment, self).copy(default)
- @api.multi
def unlink(self):
if not self:
return True
@@ -516,7 +512,6 @@ class IrAttachment(models.Model):
self.check('write', values={'res_model':res_model, 'res_id':res_id})
return super(IrAttachment, self).create(vals_list)
- @api.multi
def _post_add_create(self):
pass
diff --git a/odoo/addons/base/models/ir_config_parameter.py b/odoo/addons/base/models/ir_config_parameter.py
index 32e7a838854..3dd77cc1304 100644
--- a/odoo/addons/base/models/ir_config_parameter.py
+++ b/odoo/addons/base/models/ir_config_parameter.py
@@ -97,12 +97,10 @@ class IrConfigParameter(models.Model):
self.clear_caches()
return super(IrConfigParameter, self).create(vals_list)
- @api.multi
def write(self, vals):
self.clear_caches()
return super(IrConfigParameter, self).write(vals)
- @api.multi
def unlink(self):
self.clear_caches()
return super(IrConfigParameter, self).unlink()
diff --git a/odoo/addons/base/models/ir_cron.py b/odoo/addons/base/models/ir_cron.py
index b2ff473bbe5..b9ccfcfbec6 100644
--- a/odoo/addons/base/models/ir_cron.py
+++ b/odoo/addons/base/models/ir_cron.py
@@ -70,7 +70,6 @@ class ir_cron(models.Model):
values['usage'] = 'ir_cron'
return super(ir_cron, self).create(values)
- @api.multi
def method_direct_trigger(self):
self.check_access_rights('write')
for cron in self:
@@ -277,7 +276,6 @@ class ir_cron(models.Model):
except Exception:
_logger.warning('Exception in cron:', exc_info=True)
- @api.multi
def _try_lock(self):
"""Try to grab a dummy exclusive write-lock to the rows with the given ids,
to make sure a following write() or unlink() will not block due
@@ -291,17 +289,14 @@ class ir_cron(models.Model):
"This cron task is currently being executed and may not be modified "
"Please try again in a few minutes"))
- @api.multi
def write(self, vals):
self._try_lock()
return super(ir_cron, self).write(vals)
- @api.multi
def unlink(self):
self._try_lock()
return super(ir_cron, self).unlink()
- @api.multi
def try_write(self, values):
try:
with self._cr.savepoint():
diff --git a/odoo/addons/base/models/ir_default.py b/odoo/addons/base/models/ir_default.py
index 1672f5f7da3..042279de073 100644
--- a/odoo/addons/base/models/ir_default.py
+++ b/odoo/addons/base/models/ir_default.py
@@ -27,13 +27,11 @@ class IrDefault(models.Model):
self.clear_caches()
return super(IrDefault, self).create(vals_list)
- @api.multi
def write(self, vals):
if self:
self.clear_caches()
return super(IrDefault, self).write(vals)
- @api.multi
def unlink(self):
if self:
self.clear_caches()
diff --git a/odoo/addons/base/models/ir_filters.py b/odoo/addons/base/models/ir_filters.py
index 75845870224..036e903c884 100644
--- a/odoo/addons/base/models/ir_filters.py
+++ b/odoo/addons/base/models/ir_filters.py
@@ -33,13 +33,11 @@ class IrFilters(models.Model):
self._cr.execute("SELECT model, name FROM ir_model ORDER BY name")
return self._cr.fetchall()
- @api.multi
def copy(self, default=None):
self.ensure_one()
default = dict(default or {}, name=_('%s (copy)') % self.name)
return super(IrFilters, self).copy(default)
- @api.multi
def _get_eval_domain(self):
self.ensure_one()
return safe_eval(self.domain, {
diff --git a/odoo/addons/base/models/ir_mail_server.py b/odoo/addons/base/models/ir_mail_server.py
index 9ab49f9e5c5..3cdc256646b 100644
--- a/odoo/addons/base/models/ir_mail_server.py
+++ b/odoo/addons/base/models/ir_mail_server.py
@@ -162,7 +162,6 @@ class IrMailServer(models.Model):
"is used. Default priority is 10 (smaller number = higher priority)")
active = fields.Boolean(default=True)
- @api.multi
def test_smtp_connection(self):
for server in self:
smtp = False
diff --git a/odoo/addons/base/models/ir_model.py b/odoo/addons/base/models/ir_model.py
index 848ef658bf2..1dcdff20e1c 100644
--- a/odoo/addons/base/models/ir_model.py
+++ b/odoo/addons/base/models/ir_model.py
@@ -196,7 +196,6 @@ class IrModel(models.Model):
_logger.warning('The model %s could not be dropped because it did not exist in the registry.', model.model)
return True
- @api.multi
def unlink(self):
# Prevent manual deletion of module tables
if not self._context.get(MODULE_UNINSTALL_FLAG):
@@ -220,7 +219,6 @@ class IrModel(models.Model):
return res
- @api.multi
def write(self, vals):
if '__last_update' in self._context:
self = self.with_context({k: v for k, v in self._context.items() if k != '__last_update'})
@@ -558,7 +556,6 @@ class IrModelFields(models.Model):
result = self.env.cr.fetchone()
return result and result[0]
- @api.multi
def _drop_column(self):
tables_to_drop = set()
@@ -593,7 +590,6 @@ class IrModelFields(models.Model):
return True
- @api.multi
def _prepare_update(self):
""" Check whether the fields in ``self`` may be modified or removed.
This method prevents the modification/deletion of many2one fields
@@ -650,7 +646,6 @@ class IrModelFields(models.Model):
# the registry has been modified, restore it
self.pool.setup_models(self._cr)
- @api.multi
def unlink(self):
if not self:
return True
@@ -709,7 +704,6 @@ class IrModelFields(models.Model):
return res
- @api.multi
def write(self, vals):
# if set, *one* column can be renamed here
column_rename = None
@@ -782,7 +776,6 @@ class IrModelFields(models.Model):
return res
- @api.multi
def name_get(self):
res = []
for field in self:
@@ -989,7 +982,6 @@ class IrModelConstraint(models.Model):
'Constraints with the same name are unique per module.'),
]
- @api.multi
def _module_data_uninstall(self):
"""
Delete PostgreSQL foreign keys and constraints tracked by this model.
@@ -1033,7 +1025,6 @@ class IrModelConstraint(models.Model):
self.unlink()
- @api.multi
def copy(self, default=None):
default = dict(default or {})
default['name'] = self.name + '_copy'
@@ -1114,7 +1105,6 @@ class IrModelRelation(models.Model):
date_update = fields.Datetime(string='Update Date')
date_init = fields.Datetime(string='Initialization Date')
- @api.multi
def _module_data_uninstall(self):
"""
Delete PostgreSQL many2many relations tracked by this model.
@@ -1322,12 +1312,10 @@ class IrModelAccess(models.Model):
self.call_cache_clearing_methods()
return super(IrModelAccess, self).create(vals_list)
- @api.multi
def write(self, values):
self.call_cache_clearing_methods()
return super(IrModelAccess, self).write(values)
- @api.multi
def unlink(self):
self.call_cache_clearing_methods()
return super(IrModelAccess, self).unlink()
@@ -1378,7 +1366,6 @@ class IrModelData(models.Model):
self._table, ['model', 'res_id'])
return res
- @api.multi
def name_get(self):
model_id_name = defaultdict(dict) # {res_model: {res_id: name}}
for xid in self:
@@ -1474,7 +1461,6 @@ class IrModelData(models.Model):
"""
return self.xmlid_to_object("%s.%s" % (module, xml_id), raise_if_not_found=True)
- @api.multi
def unlink(self):
""" Regular unlink method, but make sure to clear the caches. """
self.clear_caches()
@@ -1738,7 +1724,6 @@ class WizardModelMenu(models.TransientModel):
menu_id = fields.Many2one('ir.ui.menu', string='Parent Menu', required=True, ondelete='cascade')
name = fields.Char(string='Menu Name', required=True)
- @api.multi
def menu_create(self):
for menu in self:
model = self.env['ir.model'].browse(self._context.get('model_id'))
diff --git a/odoo/addons/base/models/ir_module.py b/odoo/addons/base/models/ir_module.py
index f5250ccf03a..ec97847c9a9 100644
--- a/odoo/addons/base/models/ir_module.py
+++ b/odoo/addons/base/models/ir_module.py
@@ -298,7 +298,6 @@ class Module(models.Model):
('name_uniq', 'UNIQUE (name)', 'The name of the module must be unique!'),
]
- @api.multi
def unlink(self):
if not self:
return True
@@ -339,7 +338,6 @@ class Module(models.Model):
msg = _('Unable to process module "%s" because an external dependency is not met: %s')
raise UserError(msg % (module_name, e.args[0]))
- @api.multi
def _state_update(self, newstate, states_to_update, level=100):
if level < 1:
raise UserError(_('Recursion error in modules dependencies !'))
@@ -371,7 +369,6 @@ class Module(models.Model):
return demo
@assert_log_admin_access
- @api.multi
def button_install(self):
# domain to select auto-installable (but not yet installed) modules
auto_domain = [('state', '=', 'uninstalled'), ('auto_install', '=', True)]
@@ -429,7 +426,6 @@ class Module(models.Model):
return dict(ACTION_DICT, name=_('Install'))
@assert_log_admin_access
- @api.multi
def button_immediate_install(self):
""" Installs the selected module(s) immediately and fully,
returns the next res.config action to execute
@@ -449,13 +445,11 @@ class Module(models.Model):
return self._button_immediate_function(type(self).button_install)
@assert_log_admin_access
- @api.multi
def button_install_cancel(self):
self.write({'state': 'uninstalled', 'demo': False})
return True
@assert_log_admin_access
- @api.multi
def module_uninstall(self):
""" Perform the various steps required to uninstall a module completely
including the deletion of all database structures created by the module:
@@ -467,7 +461,6 @@ class Module(models.Model):
self.with_context(prefetch_fields=False).write({'state': 'uninstalled', 'latest_version': False})
return True
- @api.multi
def _remove_copied_views(self):
""" Remove the copies of the views installed by the modules in `self`.
@@ -481,7 +474,6 @@ class Module(models.Model):
orphans = self.env['ir.ui.view'].with_context(**{'active_test': False, MODULE_UNINSTALL_FLAG: True}).search(domain)
orphans.unlink()
- @api.multi
@api.returns('self')
def downstream_dependencies(self, known_deps=None,
exclude_states=('uninstalled', 'uninstallable', 'to remove')):
@@ -506,7 +498,6 @@ class Module(models.Model):
known_deps |= missing_mods.downstream_dependencies(known_deps, exclude_states)
return known_deps
- @api.multi
@api.returns('self')
def upstream_dependencies(self, known_deps=None,
exclude_states=('installed', 'uninstallable', 'to remove')):
@@ -548,7 +539,6 @@ class Module(models.Model):
'url': '/web',
}
- @api.multi
def _button_immediate_function(self, function):
try:
# This is done because the installation/uninstallation/upgrade can modify a currently
@@ -580,7 +570,6 @@ class Module(models.Model):
}
@assert_log_admin_access
- @api.multi
def button_immediate_uninstall(self):
"""
Uninstall the selected module(s) immediately and fully,
@@ -590,7 +579,6 @@ class Module(models.Model):
return self._button_immediate_function(type(self).button_uninstall)
@assert_log_admin_access
- @api.multi
def button_uninstall(self):
if 'base' in self.mapped('name'):
raise UserError(_("The `base` module cannot be uninstalled"))
@@ -599,7 +587,6 @@ class Module(models.Model):
return dict(ACTION_DICT, name=_('Uninstall'))
@assert_log_admin_access
- @api.multi
def button_uninstall_wizard(self):
""" Launch the wizard to uninstall the given module. """
return {
@@ -611,13 +598,11 @@ class Module(models.Model):
'context': {'default_module_id': self.id},
}
- @api.multi
def button_uninstall_cancel(self):
self.write({'state': 'installed'})
return True
@assert_log_admin_access
- @api.multi
def button_immediate_upgrade(self):
"""
Upgrade the selected module(s) immediately and fully,
@@ -626,7 +611,6 @@ class Module(models.Model):
return self._button_immediate_function(type(self).button_upgrade)
@assert_log_admin_access
- @api.multi
def button_upgrade(self):
Dependency = self.env['ir.module.module.dependency']
self.update_list()
@@ -657,7 +641,6 @@ class Module(models.Model):
return dict(ACTION_DICT, name=_('Apply Schedule Upgrade'))
@assert_log_admin_access
- @api.multi
def button_upgrade_cancel(self):
self.write({'state': 'installed'})
return True
@@ -737,7 +720,6 @@ class Module(models.Model):
return res
@assert_log_admin_access
- @api.multi
def download(self, download=True):
return []
@@ -873,7 +855,6 @@ class Module(models.Model):
cat_id = modules.db.create_categories(self._cr, categs)
self.write({'category_id': cat_id})
- @api.multi
def _update_translations(self, filter_lang=None):
if not filter_lang:
langs = self.env['res.lang'].search([('translatable', '=', True)])
@@ -889,7 +870,6 @@ class Module(models.Model):
mod_names = topological_sort(mod_dict)
self.env['ir.translation']._load_module_terms(mod_names, filter_lang)
- @api.multi
def _check(self):
for module in self:
if not module.description_html:
@@ -926,7 +906,6 @@ class ModuleDependency(models.Model):
help="Whether this dependency blocks automatic installation "
"of the dependent")
- @api.multi
@api.depends('name')
def _compute_depend(self):
# retrieve all modules corresponding to the dependency names
@@ -958,7 +937,6 @@ class ModuleExclusion(models.Model):
exclusion_id = fields.Many2one('ir.module.module', 'Exclusion Module', compute='_compute_exclusion')
state = fields.Selection(DEP_STATES, string='Status', compute='_compute_state')
- @api.multi
@api.depends('name')
def _compute_exclusion(self):
# retrieve all modules corresponding to the exclusion names
diff --git a/odoo/addons/base/models/ir_property.py b/odoo/addons/base/models/ir_property.py
index dfefc5a42de..534119c4c22 100644
--- a/odoo/addons/base/models/ir_property.py
+++ b/odoo/addons/base/models/ir_property.py
@@ -60,7 +60,6 @@ class Property(models.Model):
default='many2one',
index=True)
- @api.multi
def _update_values(self, values):
if 'value' not in values:
return values
@@ -98,7 +97,6 @@ class Property(models.Model):
values[field] = value
return values
- @api.multi
def write(self, values):
# if any of the records we're writing on has a res_id=False *or*
# we're writing a res_id=False on any record
@@ -124,7 +122,6 @@ class Property(models.Model):
self.clear_caches()
return r
- @api.multi
def unlink(self):
default_deleted = False
if self._ids:
@@ -138,7 +135,6 @@ class Property(models.Model):
self.clear_caches()
return r
- @api.multi
def get_by_record(self):
self.ensure_one()
if self.type in ('char', 'text', 'selection'):
diff --git a/odoo/addons/base/models/ir_rule.py b/odoo/addons/base/models/ir_rule.py
index f73206b19a6..1cbde0632a4 100644
--- a/odoo/addons/base/models/ir_rule.py
+++ b/odoo/addons/base/models/ir_rule.py
@@ -186,7 +186,6 @@ class IrRule(models.Model):
return query.where_clause, query.where_clause_params, query.tables
return [], [], ['"%s"' % self.env[model_name]._table]
- @api.multi
def unlink(self):
res = super(IrRule, self).unlink()
self.clear_caches()
@@ -198,7 +197,6 @@ class IrRule(models.Model):
self.clear_caches()
return res
- @api.multi
def write(self, vals):
res = super(IrRule, self).write(vals)
self.clear_caches()
diff --git a/odoo/addons/base/models/ir_sequence.py b/odoo/addons/base/models/ir_sequence.py
index 01caf67a001..0a6b603e4f6 100644
--- a/odoo/addons/base/models/ir_sequence.py
+++ b/odoo/addons/base/models/ir_sequence.py
@@ -149,12 +149,10 @@ class IrSequence(models.Model):
_create_sequence(self._cr, "ir_sequence_%03d" % seq.id, values.get('number_increment', 1), values.get('number_next', 1))
return seq
- @api.multi
def unlink(self):
_drop_sequences(self._cr, ["ir_sequence_%03d" % x.id for x in self])
return super(IrSequence, self).unlink()
- @api.multi
def write(self, values):
new_implementation = values.get('implementation')
for seq in self:
@@ -253,7 +251,6 @@ class IrSequence(models.Model):
seq_date = self._create_date_range_seq(dt)
return seq_date.with_context(ir_sequence_date_range=seq_date.date_from)._next()
- @api.multi
def next_by_id(self, sequence_date=None):
""" Draw an interpolated string using the specified sequence."""
self.check_access_rights('read')
@@ -349,7 +346,6 @@ class IrSequenceDateRange(models.Model):
number_next = _update_nogap(self, self.sequence_id.number_increment)
return self.sequence_id.get_next_char(number_next)
- @api.multi
def _alter_sequence(self, number_increment=None, number_next=None):
for seq in self:
_alter_sequence(self._cr, "ir_sequence_%03d_%03d" % (seq.sequence_id.id, seq.id), number_increment=number_increment, number_next=number_next)
@@ -364,12 +360,10 @@ class IrSequenceDateRange(models.Model):
_create_sequence(self._cr, "ir_sequence_%03d_%03d" % (main_seq.id, seq.id), main_seq.number_increment, values.get('number_next_actual', 1))
return seq
- @api.multi
def unlink(self):
_drop_sequences(self._cr, ["ir_sequence_%03d_%03d" % (x.sequence_id.id, x.id) for x in self])
return super(IrSequenceDateRange, self).unlink()
- @api.multi
def write(self, values):
if values.get('number_next'):
seq_to_alter = self.filtered(lambda seq: seq.sequence_id.implementation == 'standard')
diff --git a/odoo/addons/base/models/ir_translation.py b/odoo/addons/base/models/ir_translation.py
index a381f871fe2..3d5303610ff 100644
--- a/odoo/addons/base/models/ir_translation.py
+++ b/odoo/addons/base/models/ir_translation.py
@@ -288,7 +288,6 @@ class IrTranslation(models.Model):
if model_name in self.CACHED_MODELS:
self.clear_caches()
- @api.multi
def _modified(self):
""" Invalidate the ormcache if necessary, depending on the translations ``self``. """
for trans in self:
@@ -507,7 +506,6 @@ class IrTranslation(models.Model):
fields = self.env['ir.model.fields'].sudo().search([('model', '=', model_name)])
return {field.name: field.help for field in fields}
- @api.multi
def check(self, mode):
""" Check access rights of operation ``mode`` on ``self`` for the
current user. Raise an AccessError in case conditions are not met.
@@ -569,7 +567,6 @@ class IrTranslation(models.Model):
records._modified()
return records
- @api.multi
def write(self, vals):
if vals.get('value'):
vals.setdefault('state', 'translated')
@@ -581,7 +578,6 @@ class IrTranslation(models.Model):
self._modified()
return result
- @api.multi
def unlink(self):
self.check('unlink')
self._modified()
diff --git a/odoo/addons/base/models/ir_ui_menu.py b/odoo/addons/base/models/ir_ui_menu.py
index d726ee2cfa1..9cde7d2fb81 100644
--- a/odoo/addons/base/models/ir_ui_menu.py
+++ b/odoo/addons/base/models/ir_ui_menu.py
@@ -115,7 +115,6 @@ class IrUiMenu(models.Model):
return set(visible.ids)
- @api.multi
@api.returns('self')
def _filter_visible_menus(self):
""" Filter `self` to only keep the menu items that should be visible in
@@ -139,7 +138,6 @@ class IrUiMenu(models.Model):
menus = menus[:limit]
return len(menus) if count else menus.ids
- @api.multi
def name_get(self):
return [(menu.id, menu._get_full_name()) for menu in self]
@@ -151,7 +149,6 @@ class IrUiMenu(models.Model):
values['web_icon_data'] = self._compute_web_icon_data(values.get('web_icon'))
return super(IrUiMenu, self).create(vals_list)
- @api.multi
def write(self, values):
self.clear_caches()
if 'web_icon' in values:
@@ -168,7 +165,6 @@ class IrUiMenu(models.Model):
if web_icon and len(web_icon.split(',')) == 2:
return self.read_image(web_icon)
- @api.multi
def unlink(self):
# Detach children and promote them to top-level, because it would be unwise to
# cascade-delete submenus blindly. We also can't use ondelete=set null because
@@ -181,7 +177,6 @@ class IrUiMenu(models.Model):
self.clear_caches()
return super(IrUiMenu, self).unlink()
- @api.multi
def copy(self, default=None):
record = super(IrUiMenu, self).copy(default=default)
match = NUMBER_PARENS.search(record.name)
diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py
index 8a8d88bc17a..cff628c9349 100644
--- a/odoo/addons/base/models/ir_ui_view.py
+++ b/odoo/addons/base/models/ir_ui_view.py
@@ -90,7 +90,6 @@ class ViewCustom(models.Model):
user_id = fields.Many2one('res.users', string='User', index=True, required=True, ondelete='cascade')
arch = fields.Text(string='View Architecture', required=True)
- @api.multi
def name_get(self):
return [(rec.id, rec.user_id.name) for rec in self]
@@ -294,7 +293,6 @@ actual arch.
for view, view_wo_lang in zip(self, self.with_context(lang=None)):
view_wo_lang.arch = view.arch_base
- @api.multi
def reset_arch(self, mode='soft'):
for view in self:
arch = False
@@ -450,7 +448,6 @@ actual arch.
self.clear_caches()
return super(View, self).create(vals_list)
- @api.multi
def write(self, vals):
# Keep track if view was modified. That will be useful for the --dev mode
# to prefer modified arch over file arch.
@@ -474,7 +471,6 @@ actual arch.
self.inherit_children_ids.unlink()
super(View, self).unlink()
- @api.multi
@api.returns('self', lambda value: value.id)
def copy(self, default=None):
self.ensure_one()
@@ -483,7 +479,6 @@ actual arch.
default = dict(default or {}, key=new_key)
return super(View, self).copy(default)
- @api.multi
def toggle(self):
""" Switches between enabled and disabled statuses
"""
@@ -758,7 +753,6 @@ actual arch.
source = self.apply_view_inheritance(source, view_id, model, root_id=root_id)
return source
- @api.multi
def read_combined(self, fields=None):
"""
Utility function to get a view combined with its inherited views.
@@ -1317,12 +1311,10 @@ actual arch.
for attr in node.attrib
)
- @api.multi
def translate_qweb(self, arch, lang):
# Deprecated: templates are translated once read from database
return arch
- @api.multi
@tools.ormcache('self.id')
def get_view_xmlid(self):
domain = [('model', '=', 'ir.ui.view'), ('res_id', '=', self.id)]
@@ -1333,7 +1325,6 @@ actual arch.
def render_template(self, template, values=None, engine='ir.qweb'):
return self.browse(self.get_view_id(template)).render(values, engine)
- @api.multi
def render(self, values=None, engine='ir.qweb', minimal_qcontext=False):
assert isinstance(self.id, int)
@@ -1371,7 +1362,6 @@ actual arch.
# Misc
#------------------------------------------------------
- @api.multi
def open_translations(self):
""" Open a view for editing the translations of field 'arch_db'. """
return self.env['ir.translation'].translate_fields('ir.ui.view', self.id, 'arch_db')
@@ -1570,7 +1560,6 @@ class ResetViewArchWizard(models.TransientModel):
diff = handle_style(diff)
view.arch_diff = diff
- @api.multi
def reset_view_button(self):
self.ensure_one()
self.view_id.reset_arch(self.reset_mode)
diff --git a/odoo/addons/base/models/res_bank.py b/odoo/addons/base/models/res_bank.py
index 2c6801459eb..cd8c501028d 100644
--- a/odoo/addons/base/models/res_bank.py
+++ b/odoo/addons/base/models/res_bank.py
@@ -32,7 +32,6 @@ class Bank(models.Model):
active = fields.Boolean(default=True)
bic = fields.Char('Bank Identifier Code', index=True, help="Sometimes called BIC or Swift.")
- @api.multi
def name_get(self):
result = []
for bank in self:
@@ -135,7 +134,6 @@ class ResPartnerBank(models.Model):
qr_code_url = '/report/barcode/?type=%s&value=%s&width=%s&height=%s&humanreadable=1' % ('QR', werkzeug.url_quote_plus(qr_code_string), 128, 128)
return qr_code_url
- @api.multi
def _validate_qr_code_arguments(self):
for bank in self:
if bank.currency_id.name == False:
diff --git a/odoo/addons/base/models/res_company.py b/odoo/addons/base/models/res_company.py
index fb9146aea6b..1c4a001096e 100644
--- a/odoo/addons/base/models/res_company.py
+++ b/odoo/addons/base/models/res_company.py
@@ -22,7 +22,6 @@ class Company(models.Model):
_description = 'Companies'
_order = 'sequence, name'
- @api.multi
def copy(self, default=None):
raise UserError(_('Duplicating a company is not allowed. Please create a new company instead.'))
@@ -163,7 +162,6 @@ class Company(models.Model):
def _onchange_state(self):
self.country_id = self.state_id.country_id
- @api.multi
def on_change_country(self, country_id):
# This function is called from account/models/chart_template.py, hence decorated with `multi`.
self.ensure_one()
@@ -240,7 +238,6 @@ class Company(models.Model):
currency.write({'active': True})
return company
- @api.multi
def write(self, values):
self.clear_caches()
# Make sure that the selected currency is enabled
@@ -256,12 +253,10 @@ class Company(models.Model):
if not self._check_recursion():
raise ValidationError(_('You cannot create recursive companies.'))
- @api.multi
def open_company_edit_report(self):
self.ensure_one()
return self.env['res.config.settings'].open_company()
- @api.multi
def write_company_and_print_report(self):
context = self.env.context
report_name = context.get('default_report_name')
@@ -302,7 +297,6 @@ class Company(models.Model):
self[onboarding_state] = 'done'
return old_values
- @api.multi
def action_save_onboarding_company_step(self):
if bool(self.street):
self.set_onboarding_step_done('base_onboarding_company_state')
diff --git a/odoo/addons/base/models/res_config.py b/odoo/addons/base/models/res_config.py
index b8617a09d5a..44d7082e8a3 100644
--- a/odoo/addons/base/models/res_config.py
+++ b/odoo/addons/base/models/res_config.py
@@ -53,12 +53,10 @@ class ResConfigConfigurable(models.TransientModel):
_name = 'res.config'
_description = 'Config'
- @api.multi
def start(self):
# pylint: disable=next-method-called
return self.next()
- @api.multi
def next(self):
"""
Reload the settings page
@@ -68,7 +66,6 @@ class ResConfigConfigurable(models.TransientModel):
'tag': 'reload',
}
- @api.multi
def execute(self):
""" Method called when the user clicks on the ``Next`` button.
@@ -81,7 +78,6 @@ class ResConfigConfigurable(models.TransientModel):
raise NotImplementedError(
'Configuration items need to implement execute')
- @api.multi
def cancel(self):
""" Method called when the user click on the ``Skip`` button.
@@ -96,7 +92,6 @@ class ResConfigConfigurable(models.TransientModel):
"""
pass
- @api.multi
def action_next(self):
""" Action handler for the ``next`` event.
@@ -108,7 +103,6 @@ class ResConfigConfigurable(models.TransientModel):
# pylint: disable=next-method-called
return self.execute() or self.next()
- @api.multi
def action_skip(self):
""" Action handler for the ``skip`` event.
@@ -120,7 +114,6 @@ class ResConfigConfigurable(models.TransientModel):
# pylint: disable=next-method-called
return self.cancel() or self.next()
- @api.multi
def action_cancel(self):
""" Action handler for the ``cancel`` event. That event isn't
generated by the res.config.view.base inheritable view, the
@@ -316,7 +309,6 @@ class ResConfigInstaller(models.TransientModel, ResConfigModuleInstallationMixin
_('\n\nThis addon is already installed on your system'))
return fields
- @api.multi
def execute(self):
to_install = list(self.modules_to_install())
_logger.info('Selecting addons %s to install', to_install)
@@ -383,7 +375,6 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin)
_name = 'res.config.settings'
_description = 'Config Settings'
- @api.multi
def copy(self, values):
raise UserError(_("Cannot duplicate configuration!"), "")
@@ -412,7 +403,6 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin)
ret_val['arch'] = etree.tostring(doc, encoding='unicode')
return ret_val
- @api.multi
def onchange_module(self, field_value, module_name):
ModuleSudo = self.env['ir.module.module'].sudo()
modules = ModuleSudo.search(
@@ -609,7 +599,6 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin)
if method.startswith('set_') and method is not 'set_values':
_logger.warning(_('Methods that start with `set_` are deprecated. Override `set_values` instead (Method %s)') % method)
- @api.multi
def execute(self):
self.ensure_one()
if not self.env.is_admin():
@@ -653,7 +642,6 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin)
'tag': 'reload',
}
- @api.multi
def cancel(self):
# ignore the current record, and send the action to reopen the view
actions = self.env['ir.actions.act_window'].search([('res_model', '=', self._name)], limit=1)
@@ -661,7 +649,6 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin)
return actions.read()[0]
return {}
- @api.multi
def name_get(self):
""" Override name_get method to return an appropriate configuration wizard
name, and not the generated name."""
diff --git a/odoo/addons/base/models/res_country.py b/odoo/addons/base/models/res_country.py
index 8fd1f978ed0..2655f1ba01e 100644
--- a/odoo/addons/base/models/res_country.py
+++ b/odoo/addons/base/models/res_country.py
@@ -83,13 +83,11 @@ class Country(models.Model):
vals['code'] = vals['code'].upper()
return super(Country, self).create(vals_list)
- @api.multi
def write(self, vals):
if vals.get('code'):
vals['code'] = vals['code'].upper()
return super(Country, self).write(vals)
- @api.multi
def get_address_fields(self):
self.ensure_one()
return re.findall(r'\((.+?)\)', self.address_format)
@@ -135,7 +133,6 @@ class CountryState(models.Model):
state_ids = first_state_ids + [state_id for state_id in self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid) if not state_id in first_state_ids]
return self.browse(state_ids).name_get()
- @api.multi
def name_get(self):
result = []
for record in self:
diff --git a/odoo/addons/base/models/res_currency.py b/odoo/addons/base/models/res_currency.py
index 1fcb1bbe8f6..a7f25a2df0b 100644
--- a/odoo/addons/base/models/res_currency.py
+++ b/odoo/addons/base/models/res_currency.py
@@ -58,7 +58,6 @@ class Currency(models.Model):
currency_rates = dict(self._cr.fetchall())
return currency_rates
- @api.multi
@api.depends('rate_ids.rate')
def _compute_current_rate(self):
date = self._context.get('date') or fields.Date.today()
@@ -68,7 +67,6 @@ class Currency(models.Model):
for currency in self:
currency.rate = currency_rates.get(currency.id) or 1.0
- @api.multi
@api.depends('rounding')
def _compute_decimal_places(self):
for currency in self:
@@ -77,7 +75,6 @@ class Currency(models.Model):
else:
currency.decimal_places = 0
- @api.multi
@api.depends('rate_ids.name')
def _compute_date(self):
for currency in self:
@@ -92,11 +89,9 @@ class Currency(models.Model):
results = super(Currency, self)._name_search(name_match.group(1), args, operator=operator, limit=limit, name_get_uid=name_get_uid)
return results
- @api.multi
def name_get(self):
return [(currency.id, tools.ustr(currency.name)) for currency in self]
- @api.multi
def amount_to_text(self, amount):
self.ensure_one()
def _num2words(number, lang):
@@ -127,7 +122,6 @@ class Currency(models.Model):
)
return amount_words
- @api.multi
def round(self, amount):
"""Return ``amount`` rounded according to ``self``'s rounding rules.
@@ -137,7 +131,6 @@ class Currency(models.Model):
self.ensure_one()
return tools.float_round(amount, precision_rounding=self.rounding)
- @api.multi
def compare_amounts(self, amount1, amount2):
"""Compare ``amount1`` and ``amount2`` after rounding them according to the
given currency's precision..
@@ -161,7 +154,6 @@ class Currency(models.Model):
self.ensure_one()
return tools.float_compare(amount1, amount2, precision_rounding=self.rounding)
- @api.multi
def is_zero(self, amount):
"""Returns true if ``amount`` is small enough to be treated as
zero according to current currency's rounding rules.
@@ -212,7 +204,6 @@ class Currency(models.Model):
company = self.env['res.company'].browse(self._context.get('company_id')) or self.env.company
return from_currency._convert(from_amount, to_currency, company, date)
- @api.multi
def compute(self, from_amount, to_currency, round=True):
_logger.warning('The `compute` method is deprecated. Use `_convert` instead')
date = self._context.get('date') or fields.Date.today()
diff --git a/odoo/addons/base/models/res_lang.py b/odoo/addons/base/models/res_lang.py
index 050eba993ff..6eb7badf603 100644
--- a/odoo/addons/base/models/res_lang.py
+++ b/odoo/addons/base/models/res_lang.py
@@ -231,7 +231,6 @@ class Lang(models.Model):
self.clear_caches()
return super(Lang, self).create(vals_list)
- @api.multi
def write(self, vals):
lang_codes = self.mapped('code')
if 'code' in vals and any(code != vals['code'] for code in lang_codes):
@@ -246,7 +245,6 @@ class Lang(models.Model):
self.clear_caches()
return res
- @api.multi
def unlink(self):
for language in self:
if language.code == 'en_US':
@@ -260,7 +258,6 @@ class Lang(models.Model):
self.clear_caches()
return super(Lang, self).unlink()
- @api.multi
def format(self, percent, value, grouping=False, monetary=False):
""" Format() will return the language-specific output for float values"""
self.ensure_one()
diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py
index 711c46d4460..bd3c0ab4489 100644
--- a/odoo/addons/base/models/res_partner.py
+++ b/odoo/addons/base/models/res_partner.py
@@ -87,7 +87,6 @@ class PartnerCategory(models.Model):
if not self._check_recursion():
raise ValidationError(_('You can not create recursive tags.'))
- @api.multi
def name_get(self):
""" Return the categories' display name, including their direct
parent by default.
@@ -369,7 +368,6 @@ class Partner(models.Model):
if not self._check_recursion():
raise ValidationError(_('You cannot create recursive Partner hierarchies.'))
- @api.multi
def copy(self, default=None):
self.ensure_one()
chosen_name = default.get('name') if default else ''
@@ -438,7 +436,6 @@ class Partner(models.Model):
def onchange_company_type(self):
self.is_company = (self.company_type == 'company')
- @api.multi
def _update_fields_values(self, fields):
""" Returns dict of write() values for synchronizing ``fields`` """
values = {}
@@ -464,7 +461,6 @@ class Partner(models.Model):
"""Returns the list of address fields usable to format addresses."""
return self._address_fields()
- @api.multi
def update_address(self, vals):
addr_vals = {key: vals[key] for key in self._address_fields() if key in vals}
if addr_vals:
@@ -479,7 +475,6 @@ class Partner(models.Model):
extended by inheriting classes. """
return ['vat', 'credit_limit']
- @api.multi
def _commercial_sync_from_company(self):
""" Handle sync of commercial fields when a new parent commercial entity is set,
as if they were related fields """
@@ -488,7 +483,6 @@ class Partner(models.Model):
sync_vals = commercial_partner._update_fields_values(self._commercial_fields())
self.write(sync_vals)
- @api.multi
def _commercial_sync_to_children(self):
""" Handle sync of commercial fields to descendants """
commercial_partner = self.commercial_partner_id
@@ -499,7 +493,6 @@ class Partner(models.Model):
sync_children._compute_commercial_partner()
return sync_children.write(sync_vals)
- @api.multi
def _fields_sync(self, values):
""" Sync commercial fields and address fields from company and to children after create/update,
just as if those were all modeled as fields.related to the parent """
@@ -534,7 +527,6 @@ class Partner(models.Model):
contacts = self.child_ids.filtered(lambda c: c.type == 'contact')
contacts.update_address(values)
- @api.multi
def _handle_first_contact_creation(self):
""" On creation of first contact for a company (or root) that has no address, assume contact address
was meant to be company address """
@@ -553,7 +545,6 @@ class Partner(models.Model):
website = url.replace(scheme='http').to_url()
return website
- @api.multi
def write(self, vals):
if vals.get('active') is False:
for partner in self:
@@ -656,7 +647,6 @@ class Partner(models.Model):
partner._handle_first_contact_creation()
return partners
- @api.multi
def create_company(self):
self.ensure_one()
if self.company_name:
@@ -671,7 +661,6 @@ class Partner(models.Model):
})
return True
- @api.multi
def open_commercial_entity(self):
""" Utility method used to add an "Open Company" button in partner views """
self.ensure_one()
@@ -682,7 +671,6 @@ class Partner(models.Model):
'target': 'current',
'flags': {'form': {'action_buttons': True}}}
- @api.multi
def open_parent(self):
""" Utility method used to add an "Open Parent" button in partner views """
self.ensure_one()
@@ -721,7 +709,6 @@ class Partner(models.Model):
name = "%s ‒ %s" % (name, partner.vat)
return name
- @api.multi
def name_get(self):
res = []
for partner in self:
@@ -850,13 +837,11 @@ class Partner(models.Model):
return False
return base64.b64encode(res.content)
- @api.multi
def _email_send(self, email_from, subject, body, on_error=None):
for partner in self.filtered('email'):
tools.email_send(email_from, [partner.email], subject, body, on_error)
return True
- @api.multi
def address_get(self, adr_pref=None):
""" Find contacts/addresses of the right type(s) by doing a depth-first-search
through descendants within company boundaries (stop at entities flagged ``is_company``)
@@ -917,7 +902,6 @@ class Partner(models.Model):
def _get_address_format(self):
return self.country_id.address_format or self._get_default_address_format()
- @api.multi
def _display_address(self, without_company=False):
'''
@@ -981,7 +965,6 @@ class Partner(models.Model):
state = States.search(state_domain, limit=1)
vals['state_id'] = state.id # replace state or remove it if not found
- @api.multi
def _get_country_name(self):
return self.country_id.name or ''
diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py
index a8043cc0d99..fce31aa09b2 100644
--- a/odoo/addons/base/models/res_users.py
+++ b/odoo/addons/base/models/res_users.py
@@ -107,7 +107,6 @@ class Groups(models.Model):
('name_uniq', 'unique (category_id, name)', 'The name of the group must be unique within an application!')
]
- @api.multi
@api.constrains('users')
def _check_one_user_type(self):
self.users._check_one_user_type()
@@ -161,7 +160,6 @@ class Groups(models.Model):
return len(groups) if count else groups.ids
return super(Groups, self)._search(args, offset=offset, limit=limit, order=order, count=count, access_rights_uid=access_rights_uid)
- @api.multi
def copy(self, default=None):
self.ensure_one()
chosen_name = default.get('name') if default else ''
@@ -169,7 +167,6 @@ class Groups(models.Model):
default = dict(default or {}, name=default_name)
return super(Groups, self).copy(default)
- @api.multi
def write(self, vals):
if 'name' in vals:
if vals['name'].startswith('-'):
@@ -348,7 +345,6 @@ class Users(models.Model):
for user in self:
user.share = not user.has_group('base.group_user')
- @api.multi
def _compute_companies_count(self):
companies_count = self._companies_count()
for user in self:
@@ -389,34 +385,29 @@ class Users(models.Model):
# skip SpecialValue (e.g. for missing record or access right)
pass
- @api.multi
@api.constrains('company_id', 'company_ids')
def _check_company(self):
if any(user.company_ids and user.company_id not in user.company_ids for user in self):
raise ValidationError(_('The chosen company is not in the allowed companies for this user'))
- @api.multi
@api.constrains('action_id')
def _check_action_id(self):
action_open_website = self.env.ref('base.action_open_website', raise_if_not_found=False)
if action_open_website and any(user.action_id.id == action_open_website.id for user in self):
raise ValidationError(_('The "App Switcher" action cannot be selected as home action.'))
- @api.multi
@api.constrains('groups_id')
def _check_one_user_type(self):
for user in self:
if len(user.groups_id.filtered(lambda x: x.category_id.xml_id == 'base.module_category_user_type')) > 1:
raise ValidationError(_('The user cannot have more than one user types.'))
- @api.multi
def toggle_active(self):
for user in self:
if not user.active and not user.partner_id.active:
user.partner_id.toggle_active()
super(Users, self).toggle_active()
- @api.multi
def read(self, fields=None, load='_classic_read'):
if fields and self == self.env.user:
for key in fields:
@@ -453,7 +444,6 @@ class Users(models.Model):
user.partner_id.write({'company_id': user.company_id.id})
return users
- @api.multi
def write(self, values):
if values.get('active') and SUPERUSER_ID in self._ids:
raise UserError(_("You cannot activate the superuser."))
@@ -500,7 +490,6 @@ class Users(models.Model):
return res
- @api.multi
def unlink(self):
if SUPERUSER_ID in self.ids:
raise UserError(_('You can not remove the admin user as it is used internally for resources created by Odoo (updates, module installation, ...)'))
@@ -522,7 +511,6 @@ class Users(models.Model):
user_ids = self._search(expression.AND([[('name', operator, name)], args]), limit=limit, access_rights_uid=name_get_uid)
return self.browse(user_ids).name_get()
- @api.multi
def copy(self, default=None):
self.ensure_one()
default = dict(default or {})
@@ -659,7 +647,6 @@ class Users(models.Model):
# keep in the cache the token
return h.hexdigest()
- @api.multi
def _invalidate_session_cache(self):
""" Clear the sessions cache """
self._compute_session_token.clear_cache(self)
@@ -680,14 +667,12 @@ class Users(models.Model):
return self.env.user.write({'password': new_passwd})
raise UserError(_("Setting empty passwords is not allowed for security reasons!"))
- @api.multi
def preference_save(self):
return {
'type': 'ir.actions.client',
'tag': 'reload_context',
}
- @api.multi
def preference_change_password(self):
return {
'type': 'ir.actions.client',
@@ -758,22 +743,18 @@ class Users(models.Model):
'target': 'current',
}
- @api.multi
def _is_public(self):
self.ensure_one()
return self.has_group('base.group_public')
- @api.multi
def _is_system(self):
self.ensure_one()
return self.has_group('base.group_system')
- @api.multi
def _is_admin(self):
self.ensure_one()
return self._is_superuser() or self.has_group('base.group_erp_manager')
- @api.multi
def _is_superuser(self):
self.ensure_one()
return self.id == SUPERUSER_ID
@@ -922,7 +903,6 @@ class GroupsImplied(models.Model):
group.write({'users': user_ids})
return groups
- @api.multi
def write(self, values):
res = super(GroupsImplied, self).write(values)
if values.get('users') or values.get('implied_ids'):
@@ -970,7 +950,6 @@ class UsersImplied(models.Model):
values['groups_id'] = type(self).groups_id.convert_to_write(gs, user)
return super(UsersImplied, self).create(vals_list)
- @api.multi
def write(self, values):
res = super(UsersImplied, self).write(values)
if values.get('groups_id'):
@@ -1017,7 +996,6 @@ class GroupsView(models.Model):
self.env['ir.actions.actions'].clear_caches()
return user
- @api.multi
def write(self, values):
res = super(GroupsView, self).write(values)
self._update_user_groups_view()
@@ -1025,7 +1003,6 @@ class GroupsView(models.Model):
self.env['ir.actions.actions'].clear_caches()
return res
- @api.multi
def unlink(self):
res = super(GroupsView, self).unlink()
self._update_user_groups_view()
@@ -1179,7 +1156,6 @@ class UsersView(models.Model):
user.write({'groups_id': [(4, group_multi_company.id)]})
return user
- @api.multi
def write(self, values):
values = self._remove_reified_groups(values)
res = super(UsersView, self).write(values)
@@ -1236,7 +1212,6 @@ class UsersView(models.Model):
self._add_reified_groups(group_fields, values)
return values
- @api.multi
def read(self, fields=None, load='_classic_read'):
# determine whether reified groups fields are required, and which ones
fields1 = fields or list(self.fields_get())
@@ -1332,7 +1307,6 @@ class ChangePasswordWizard(models.TransientModel):
user_ids = fields.One2many('change.password.user', 'wizard_id', string='Users', default=_default_user_ids)
- @api.multi
def change_password_button(self):
self.ensure_one()
self.user_ids.change_password_button()
@@ -1351,7 +1325,6 @@ class ChangePasswordUser(models.TransientModel):
user_login = fields.Char(string='User Login', readonly=True)
new_passwd = fields.Char(string='New Password', default='')
- @api.multi
def change_password_button(self):
for line in self:
if not line.new_passwd:
diff --git a/odoo/addons/base/report/report_base_report_irmodulereference.py b/odoo/addons/base/report/report_base_report_irmodulereference.py
index 64102f2848b..4a88e0e1f0a 100644
--- a/odoo/addons/base/report/report_base_report_irmodulereference.py
+++ b/odoo/addons/base/report/report_base_report_irmodulereference.py
@@ -15,7 +15,6 @@ class IrModelReferenceReport(models.AbstractModel):
res_ids = data.mapped('res_id')
return self.env['ir.model'].browse(res_ids)
- @api.multi
def _fields_find(self, model, module):
Data = self.env['ir.model.data'].sudo()
fname_wildcard = 'field_' + model.replace('.', '_') + '_%'
diff --git a/odoo/addons/base/wizard/base_export_language.py b/odoo/addons/base/wizard/base_export_language.py
index 8ba74b710d4..bf5210c2ae6 100644
--- a/odoo/addons/base/wizard/base_export_language.py
+++ b/odoo/addons/base/wizard/base_export_language.py
@@ -29,7 +29,6 @@ class BaseLanguageExport(models.TransientModel):
state = fields.Selection([('choose', 'choose'), ('get', 'get')], # choose language or get the file
default='choose')
- @api.multi
def act_getfile(self):
this = self[0]
lang = this.lang if this.lang != NEW_LANG_KEY else False
diff --git a/odoo/addons/base/wizard/base_import_language.py b/odoo/addons/base/wizard/base_import_language.py
index 20bb24e7c06..6abce13916c 100644
--- a/odoo/addons/base/wizard/base_import_language.py
+++ b/odoo/addons/base/wizard/base_import_language.py
@@ -25,7 +25,6 @@ class BaseLanguageImport(models.TransientModel):
help="If you enable this option, existing translations (including custom ones) "
"will be overwritten and replaced by those in this file")
- @api.multi
def import_lang(self):
this = self[0]
this = this.with_context(overwrite=this.overwrite)
diff --git a/odoo/addons/base/wizard/base_language_install.py b/odoo/addons/base/wizard/base_language_install.py
index 7e2d40be08b..a617b685ae9 100644
--- a/odoo/addons/base/wizard/base_language_install.py
+++ b/odoo/addons/base/wizard/base_language_install.py
@@ -29,7 +29,6 @@ class BaseLanguageInstall(models.TransientModel):
state = fields.Selection([('init', 'init'), ('done', 'done')],
string='Status', readonly=True, default='init')
- @api.multi
def lang_install(self):
self.ensure_one()
mods = self.env['ir.module.module'].search([('state', '=', 'installed')])
diff --git a/odoo/addons/base/wizard/base_module_uninstall.py b/odoo/addons/base/wizard/base_module_uninstall.py
index 5661036a8b2..c27bd69b283 100644
--- a/odoo/addons/base/wizard/base_module_uninstall.py
+++ b/odoo/addons/base/wizard/base_module_uninstall.py
@@ -54,7 +54,6 @@ class BaseModuleUninstall(models.TransientModel):
if not self.module_id.application:
self.show_all = True
- @api.multi
def action_uninstall(self):
modules = self.module_id
return modules.button_immediate_uninstall()
diff --git a/odoo/addons/base/wizard/base_module_update.py b/odoo/addons/base/wizard/base_module_update.py
index 4481eb848f3..4bc43d89e66 100644
--- a/odoo/addons/base/wizard/base_module_update.py
+++ b/odoo/addons/base/wizard/base_module_update.py
@@ -11,14 +11,12 @@ class BaseModuleUpdate(models.TransientModel):
added = fields.Integer('Number of modules added', readonly=True)
state = fields.Selection([('init', 'init'), ('done', 'done')], 'Status', readonly=True, default='init')
- @api.multi
def update_module(self):
for this in self:
updated, added = self.env['ir.module.module'].update_list()
this.write({'updated': updated, 'added': added, 'state': 'done'})
return False
- @api.multi
def action_module_open(self):
res = {
'domain': str([]),
diff --git a/odoo/addons/base/wizard/base_module_upgrade.py b/odoo/addons/base/wizard/base_module_upgrade.py
index 0d760c549c0..debacf8657a 100644
--- a/odoo/addons/base/wizard/base_module_upgrade.py
+++ b/odoo/addons/base/wizard/base_module_upgrade.py
@@ -42,7 +42,6 @@ class BaseModuleUpgrade(models.TransientModel):
return res
- @api.multi
def upgrade_module_cancel(self):
Module = self.env['ir.module.module']
to_install = Module.search([('state', 'in', ['to upgrade', 'to remove'])])
@@ -51,7 +50,6 @@ class BaseModuleUpgrade(models.TransientModel):
to_uninstall.write({'state': 'uninstalled'})
return {'type': 'ir.actions.act_window_close'}
- @api.multi
def upgrade_module(self):
Module = self.env['ir.module.module']
@@ -77,7 +75,6 @@ class BaseModuleUpgrade(models.TransientModel):
return {'type': 'ir.actions.act_window_close'}
- @api.multi
def config(self):
# pylint: disable=next-method-called
return self.env['res.config'].next()
diff --git a/odoo/addons/base/wizard/base_partner_merge.py b/odoo/addons/base/wizard/base_partner_merge.py
index 058fd8732d5..cadefd5941a 100644
--- a/odoo/addons/base/wizard/base_partner_merge.py
+++ b/odoo/addons/base/wizard/base_partner_merge.py
@@ -316,7 +316,6 @@ class MergePartnerAutomatic(models.TransientModel):
# delete source partner, since they are merged
src_partners.unlink()
- @api.multi
def _log_merge_operation(self, src_partners, dst_partner):
_logger.info('(uid = %s) merged the partners %r with %s', self._uid, src_partners.ids, dst_partner.id)
@@ -407,7 +406,6 @@ class MergePartnerAutomatic(models.TransientModel):
reverse=True,
)
- @api.multi
def _compute_models(self):
""" Compute the different models needed by the system if you want to exclude some partners. """
model_mapping = {}
@@ -421,14 +419,12 @@ class MergePartnerAutomatic(models.TransientModel):
# Actions
# ----------------------------------------
- @api.multi
def action_skip(self):
""" Skip this wizard line. Don't compute any thing, and simply redirect to the new step."""
if self.current_line_id:
self.current_line_id.unlink()
return self._action_next_screen()
- @api.multi
def _action_next_screen(self):
""" return the action of the next screen ; this means the wizard is set to treat the
next wizard line. Each line is a subset of partner that can be merged together.
@@ -463,7 +459,6 @@ class MergePartnerAutomatic(models.TransientModel):
'target': 'new',
}
- @api.multi
def _process_query(self, query):
""" Execute the select request and write the result in this wizard
:param query : the SQL query used to fill the wizard line
@@ -499,7 +494,6 @@ class MergePartnerAutomatic(models.TransientModel):
_logger.info("counter: %s", counter)
- @api.multi
def action_start_manual_process(self):
""" Start the process 'Merge with Manual Check'. Fill the wizard according to the group_by and exclude
options, and redirect to the first step (treatment of first wizard line). After, for each subset of
@@ -513,7 +507,6 @@ class MergePartnerAutomatic(models.TransientModel):
self._process_query(query)
return self._action_next_screen()
- @api.multi
def action_start_automatic_process(self):
""" Start the process 'Merge Automatically'. This will fill the wizard with the same mechanism as 'Merge
with Manual Check', but instead of refreshing wizard with the current line, it will automatically process
@@ -538,7 +531,6 @@ class MergePartnerAutomatic(models.TransientModel):
'target': 'new',
}
- @api.multi
def parent_migration_process_cb(self):
self.ensure_one()
@@ -595,7 +587,6 @@ class MergePartnerAutomatic(models.TransientModel):
'target': 'new',
}
- @api.multi
def action_update_all_process(self):
self.ensure_one()
self.parent_migration_process_cb()
@@ -618,7 +609,6 @@ class MergePartnerAutomatic(models.TransientModel):
return self._action_next_screen()
- @api.multi
def action_merge(self):
""" Merge Contact button. Merge the selected partners, and redirect to
the end screen (since there is no other wizard line to process.
diff --git a/odoo/addons/base/wizard/base_update_translations.py b/odoo/addons/base/wizard/base_update_translations.py
index 0bbfc17ab24..402118f3048 100644
--- a/odoo/addons/base/wizard/base_update_translations.py
+++ b/odoo/addons/base/wizard/base_update_translations.py
@@ -26,7 +26,6 @@ class BaseUpdateTranslations(models.TransientModel):
raise UserError(_('No language with code "%s" exists') % lang_code)
return lang.name
- @api.multi
def act_update(self):
this = self[0]
lang_name = self._get_lang_name(this.lang)
diff --git a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
index 4a03d7bd9b1..f96d7d268ab 100644
--- a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
+++ b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
@@ -563,7 +563,6 @@ class TestAssetsBundleWithIRAMock(FileTouchable):
counter.update(['create'])
return origin_create(self, vals)
- @api.multi
def unlink(self):
counter.update(['unlink'])
return origin_unlink(self)
diff --git a/odoo/addons/test_exceptions/models.py b/odoo/addons/test_exceptions/models.py
index 0a09164eaa7..7028ddda128 100644
--- a/odoo/addons/test_exceptions/models.py
+++ b/odoo/addons/test_exceptions/models.py
@@ -14,98 +14,75 @@ class m(models.Model):
_name = 'test.exceptions.model'
_description = 'Test Exception Model'
- @api.multi
def generate_except_osv(self):
# title is ignored in the new (6.1) exceptions
raise odoo.osv.osv.except_osv('title', 'description')
- @api.multi
def generate_except_orm(self):
# title is ignored in the new (6.1) exceptions
raise odoo.exceptions.except_orm('title', 'description')
- @api.multi
def generate_warning(self):
raise odoo.exceptions.Warning('description')
- @api.multi
def generate_redirect_warning(self):
action = self.env.ref('test_exceptions.action_test_exceptions')
raise odoo.exceptions.RedirectWarning('description', action.id, 'Go to the redirection')
- @api.multi
def generate_access_denied(self):
raise odoo.exceptions.AccessDenied()
- @api.multi
def generate_access_error(self):
raise odoo.exceptions.AccessError('description')
- @api.multi
def generate_exc_access_denied(self):
raise Exception('AccessDenied')
- @api.multi
def generate_undefined(self):
self.surely_undefined_symbol
- @api.multi
def generate_user_error(self):
raise odoo.exceptions.UserError('description')
- @api.multi
def generate_missing_error(self):
raise odoo.exceptions.MissingError('description')
- @api.multi
def generate_validation_error(self):
raise odoo.exceptions.ValidationError('description')
- @api.multi
def generate_except_osv_safe_eval(self):
self.generate_safe_eval(self.generate_except_osv)
- @api.multi
def generate_except_orm_safe_eval(self):
self.generate_safe_eval(self.generate_except_orm)
- @api.multi
def generate_warning_safe_eval(self):
self.generate_safe_eval(self.generate_warning)
- @api.multi
def generate_redirect_warning_safe_eval(self):
self.generate_safe_eval(self.generate_redirect_warning)
- @api.multi
def generate_access_denied_safe_eval(self):
self.generate_safe_eval(self.generate_access_denied)
- @api.multi
def generate_access_error_safe_eval(self):
self.generate_safe_eval(self.generate_access_error)
- @api.multi
def generate_exc_access_denied_safe_eval(self):
self.generate_safe_eval(self.generate_exc_access_denied)
- @api.multi
def generate_undefined_safe_eval(self):
self.generate_safe_eval(self.generate_undefined)
- @api.multi
def generate_user_error_safe_eval(self):
self.generate_safe_eval(self.generate_user_error)
- @api.multi
def generate_missing_error_safe_eval(self):
self.generate_safe_eval(self.generate_missing_error)
- @api.multi
def generate_validation_error_safe_eval(self):
self.generate_safe_eval(self.generate_validation_error)
- @api.multi
def generate_safe_eval(self, f):
globals_dict = { 'generate': f }
safe_eval("generate()", mode='exec', globals_dict=globals_dict)
diff --git a/odoo/addons/test_impex/models.py b/odoo/addons/test_impex/models.py
index 726bf9041c0..353c8223f82 100644
--- a/odoo/addons/test_impex/models.py
+++ b/odoo/addons/test_impex/models.py
@@ -44,7 +44,6 @@ for name, field in MODELS:
const = fields.Integer(default=4)
value = field
- @api.multi
def name_get(self):
return [(record.id, "%s:%s" % (self._name, record.value)) for record in self]
@@ -66,7 +65,6 @@ class One2ManyChild(models.Model):
str = fields.Char()
value = fields.Integer()
- @api.multi
def name_get(self):
return [(record.id, "%s:%s" % (self._name, record.value)) for record in self]
@@ -99,7 +97,6 @@ class One2ManyChildMultiple(models.Model):
str = fields.Char()
value = fields.Integer()
- @api.multi
def name_get(self):
return [(record.id, "%s:%s" % (self._name, record.value)) for record in self]
@@ -125,7 +122,6 @@ class Many2ManyChild(models.Model):
str = fields.Char()
value = fields.Integer()
- @api.multi
def name_get(self):
return [(record.id, "%s:%s" % (self._name, record.value)) for record in self]
diff --git a/odoo/addons/test_inherit/models.py b/odoo/addons/test_inherit/models.py
index ffbcc47d31c..74d8b406705 100644
--- a/odoo/addons/test_inherit/models.py
+++ b/odoo/addons/test_inherit/models.py
@@ -96,7 +96,6 @@ class test_inherit_property(models.Model):
# override property_bar with a new-api computed field
property_bar = fields.Integer(compute='_compute_bar', company_dependent=False)
- @api.multi
def _compute_bar(self):
for record in self:
record.property_bar = 42
diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py
index 1d7d034e22a..031b55aa3ac 100644
--- a/odoo/addons/test_new_api/models.py
+++ b/odoo/addons/test_new_api/models.py
@@ -60,7 +60,6 @@ class Category(models.Model):
# assign name of last category, and reassign display_name (to normalize it)
cat.name = names[-1].strip()
- @api.multi
def read(self, fields=None, load='_classic_read'):
if self.search_count([('id', 'in', self._ids), ('name', '=', 'NOACCESS')]):
raise AccessError('Sorry')
@@ -189,7 +188,6 @@ class Message(models.Model):
def _search_author_partner(self, operator, value):
return [('author.partner_id', operator, value)]
- @api.multi
def write(self, vals):
if 'priority' in vals:
vals['priority'] = 5
diff --git a/odoo/api.py b/odoo/api.py
index 432d5c5875d..8312ae58bae 100644
--- a/odoo/api.py
+++ b/odoo/api.py
@@ -293,7 +293,6 @@ def multi(method):
""" Decorate a record-style method where ``self`` is a recordset. The method
typically defines an operation on records. Such a method::
- @api.multi
def method(self, args):
...
diff --git a/odoo/models.py b/odoo/models.py
index 0ab45f403d1..6a95f72f296 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -728,7 +728,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
for record in self
)
- @api.multi
def _export_rows(self, fields, *, _is_toplevel_call=True):
""" Export fields of the records in ``self``.
@@ -830,7 +829,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
# backward compatibility
__export_rows = _export_rows
- @api.multi
def export_data(self, fields_to_export, raw_data=False):
""" Export fields for selected objects
@@ -1097,7 +1095,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
yield dbid, xid, converted, dict(extras, record=stream.index)
- @api.multi
def _validate_fields(self, field_names):
field_names = set(field_names)
@@ -1498,7 +1495,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
}
return result
- @api.multi
def get_formview_id(self, access_uid=None):
""" Return an view id to open the document ``self`` with. This method is
meant to be overridden in addons that want to give specific view ids
@@ -1509,7 +1505,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
"""
return False
- @api.multi
def get_formview_action(self, access_uid=None):
""" Return an action to open the document ``self``. This method is meant
to be overridden in addons that want to give specific view ids for
@@ -1529,7 +1524,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
'context': dict(self._context),
}
- @api.multi
def get_access_action(self, access_uid=None):
""" Return an action to open the document. This method is meant to be
overridden in addons that want to give specific access to the document.
@@ -1594,7 +1588,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
for record in self:
record.display_name = names.get(record.id, False)
- @api.multi
def name_get(self):
""" name_get() -> [(id, name), ...]
@@ -2795,7 +2788,6 @@ Fields:
return fields
- @api.multi
def read(self, fields=None, load='_classic_read'):
""" read([fields])
@@ -2848,7 +2840,6 @@ Fields:
return result
- @api.multi
def _prefetch_field(self, field):
""" Read from the database in order to fetch ``field`` (:class:`Field`
instance) for ``self`` in cache.
@@ -2899,7 +2890,6 @@ Fields:
exc = AccessError("No value found for %s.%s" % (self, field.name))
self.env.cache.set_failed(self, [field], exc)
- @api.multi
def _read_from_database(self, field_names, inherited_field_names=[]):
""" Read the given fields of the records in ``self`` from the database,
and store them in cache. Access errors are also stored in cache.
@@ -3007,7 +2997,6 @@ Fields:
exc = self.env['ir.rule']._make_access_error('read', forbidden)
self.env.cache.set_failed(forbidden, self._fields.values(), exc)
- @api.multi
def get_metadata(self):
"""
Returns some metadata about the given records.
@@ -3040,7 +3029,6 @@ Fields:
r['noupdate'] = value.get('noupdate', False)
return res
- @api.multi
def get_base_url(self):
"""
Returns rooturl for a specific given record.
@@ -3055,7 +3043,6 @@ Fields:
self.ensure_one()
return self.env['ir.config_parameter'].sudo().get_param('web.base.url')
- @api.multi
def _check_concurrency(self):
if not (self._log_access and self._context.get(self.CONCURRENCY_CHECK_FIELD)):
return
@@ -3085,7 +3072,6 @@ Fields:
"""
return self.env['ir.model.access'].check(self._name, operation, raise_exception)
- @api.multi
def check_access_rule(self, operation):
""" Verifies that the operation given by ``operation`` is allowed for
the current user according to ir.rules.
@@ -3162,7 +3148,6 @@ Fields:
if not (it or it.origin) or (it or it.origin) in valid_ids
])
- @api.multi
def unlink(self):
""" unlink()
@@ -3240,7 +3225,6 @@ Fields:
return True
- @api.multi
def write(self, vals):
""" write(vals)
@@ -3429,7 +3413,6 @@ Fields:
return True
- @api.multi
def _write(self, vals):
# low-level implementation of write()
if not self:
@@ -4204,7 +4187,6 @@ Fields:
return _uniquify_list([x[0] for x in res])
- @api.multi
@api.returns(None, lambda value: value[0])
def copy_data(self, default=None):
"""
@@ -4275,7 +4257,6 @@ Fields:
return [default]
- @api.multi
def copy_translations(old, new, excluded=()):
""" Recursively copy the translations from original to new record
@@ -4348,7 +4329,6 @@ Fields:
vals_list.append(vals)
Translation._upsert_translations(vals_list)
- @api.multi
@api.returns('self', lambda value: value.id)
def copy(self, default=None):
""" copy(default=None)
@@ -4367,7 +4347,6 @@ Fields:
self.with_context(from_copy_translation=True).copy_translations(new, excluded=default or ())
return new
- @api.multi
@api.returns('self')
def exists(self):
""" exists() -> records
@@ -4398,7 +4377,6 @@ Fields:
self.env.cache.set_failed(self - existing, self._fields.values(), exc)
return existing
- @api.multi
def _check_recursion(self, parent=None):
"""
Verifies that there is no loop in a hierarchical structure of records,
@@ -4424,7 +4402,6 @@ Fields:
return False
return True
- @api.multi
def _check_m2m_recursion(self, field_name):
"""
Verifies that there is no loop in a directed graph of records, by
@@ -4463,7 +4440,6 @@ Fields:
todo.add(id2)
return True
- @api.multi
def _get_external_ids(self):
"""Retrieve the External ID(s) of any database record.
@@ -4482,7 +4458,6 @@ Fields:
result[data['res_id']].append('%(module)s.%(name)s' % data)
return result
- @api.multi
def get_external_id(self):
"""Retrieve the External ID of any database record, if there
is one. This method works as a possible implementation
@@ -4665,7 +4640,6 @@ Fields:
index = {vals['id']: vals for vals in result}
return [index[record.id] for record in records if record.id in index]
- @api.multi
def toggle_active(self):
""" Inverse the value of the field ``active`` on the records in ``self``. """
for record in self:
@@ -4678,7 +4652,6 @@ Fields:
"""
return self.filtered(lambda record: record.active).toggle_active()
- @api.multi
def action_unarchive(self):
"""
Set active=True on a recordset, by calling toggle_active to take the
@@ -4699,7 +4672,6 @@ Fields:
Example::
- @api.multi
def do_write(self, values):
# do stuff, and call the original method
return do_write.origin(self, values)
@@ -5017,7 +4989,6 @@ Fields:
key = itemgetter(key)
return self.browse(item.id for item in sorted(self, key=key, reverse=reverse))
- @api.multi
def update(self, values):
""" Update the records in ``self`` with ``values``. """
for record in self:
@@ -5269,7 +5240,6 @@ Fields:
[(invf, None) for f in fields for invf in self._field_inverses[f]]
self.env.cache.invalidate(spec)
- @api.multi
def modified(self, fnames):
""" Notify that fields have been modified on ``self``. This invalidates
the cache, and prepares the recomputation of stored function fields
@@ -5441,7 +5411,6 @@ Fields:
process(method_res)
return
- @api.multi
def onchange(self, values, field_name, field_onchange):
""" Perform an onchange on the given field.
diff --git a/odoo/tools/profiler.py b/odoo/tools/profiler.py
index 0904faf3c1b..e44dfadac1f 100644
--- a/odoo/tools/profiler.py
+++ b/odoo/tools/profiler.py
@@ -105,7 +105,6 @@ def profile(method=None, whitelist=None, blacklist=(None,), files=None,
@profile # log only this create method
def create(self, vals):
...
- @api.multi
@profile() # log all methods for all odoo models
def unlink(self):
...