diff --git a/addons/account_edi_proxy_client/models/account_edi_proxy_user.py b/addons/account_edi_proxy_client/models/account_edi_proxy_user.py index 57952974f7a..fd3b8d2124a 100644 --- a/addons/account_edi_proxy_client/models/account_edi_proxy_user.py +++ b/addons/account_edi_proxy_client/models/account_edi_proxy_user.py @@ -191,3 +191,13 @@ class AccountEdiProxyClientUser(models.Model): ) f = Fernet(key) return f.decrypt(base64.b64decode(data)) + + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute(""" + INSERT INTO ir_config_parameter(key, value) + VALUES ('account_edi_proxy_client.demo', true) + ON CONFLICT (key) DO UPDATE SET value = true + """) diff --git a/addons/auth_oauth/models/auth_oauth.py b/addons/auth_oauth/models/auth_oauth.py index bdecce9bd02..cbee5ced816 100644 --- a/addons/auth_oauth/models/auth_oauth.py +++ b/addons/auth_oauth/models/auth_oauth.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. - from odoo import fields, models @@ -21,3 +20,9 @@ class AuthOAuthProvider(models.Model): css_class = fields.Char(string='CSS class', default='fa fa-fw fa-sign-in text-primary') body = fields.Char(required=True, help='Link text in Login Dialog', translate=True) sequence = fields.Integer(default=10) + + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute("UPDATE auth_oauth_provider SET enabled = false") diff --git a/addons/delivery/models/delivery_carrier.py b/addons/delivery/models/delivery_carrier.py index 8c3389f0842..f845f8ab7e5 100644 --- a/addons/delivery/models/delivery_carrier.py +++ b/addons/delivery/models/delivery_carrier.py @@ -358,3 +358,16 @@ class DeliveryCarrier(models.Model): def _product_price_to_company_currency(self, quantity, product, company): return company.currency_id._convert(quantity * product.standard_price, product.currency_id, company, fields.Date.today()) + + # -------------------------- # + # neutralize # + # -------------------------- # + + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute(""" + UPDATE delivery_carrier + SET prod_environment = false, active = false + """) diff --git a/addons/delivery/tests/test_packing_delivery.py b/addons/delivery/tests/test_packing_delivery.py index e4710c705e8..82e51f442d9 100644 --- a/addons/delivery/tests/test_packing_delivery.py +++ b/addons/delivery/tests/test_packing_delivery.py @@ -76,3 +76,9 @@ class TestPacking(TestPackingCommon): # default weight was set. pack_wiz = self.env['choose.delivery.package'].with_context(pack_action_ctx).create({}) self.assertEqual(pack_wiz.shipping_weight, 13.5) + + def test_delivery_carrier_neutralize(self): + """ ensure that devlivery carriers can be nautralized """ + self.assertTrue(self.test_carrier.active) + self.env['delivery.carrier']._neutralize() + self.assertFalse(self.test_carrier.active, "Delivery Carrier was not neutralized") diff --git a/addons/l10n_es_edi_sii/models/res_company.py b/addons/l10n_es_edi_sii/models/res_company.py index 8ee3cc98142..122190348af 100644 --- a/addons/l10n_es_edi_sii/models/res_company.py +++ b/addons/l10n_es_edi_sii/models/res_company.py @@ -42,3 +42,9 @@ class ResCompany(models.Model): ) else: company.l10n_es_edi_certificate_id = False + + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute("UPDATE res_company SET l10n_es_edi_test_env = true") diff --git a/addons/l10n_es_edi_sii/tests/__init__.py b/addons/l10n_es_edi_sii/tests/__init__.py index 78cb5d78f6d..cbd129afd8a 100644 --- a/addons/l10n_es_edi_sii/tests/__init__.py +++ b/addons/l10n_es_edi_sii/tests/__init__.py @@ -2,3 +2,4 @@ from . import test_edi_xml from . import test_edi_web_services +from . import test_neutralize diff --git a/addons/l10n_es_edi_sii/tests/test_neutralize.py b/addons/l10n_es_edi_sii/tests/test_neutralize.py new file mode 100644 index 00000000000..c3af2ab20b6 --- /dev/null +++ b/addons/l10n_es_edi_sii/tests/test_neutralize.py @@ -0,0 +1,15 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo.tests.common import tagged, TransactionCase + + +@tagged('post_install_l10n', 'post_install', '-at_install') +class TestL10nEsEdiNeutralize(TransactionCase): + + def test_l10n_es_edi_neutralize(self): + ar_company = self.env['res.company'].create({ + 'name': 'Test ES Company', + 'l10n_es_edi_test_env': False, + }) + + self.env['res.company']._neutralize() + self.assertEqual(ar_company.l10n_es_edi_test_env, True) diff --git a/addons/mail/models/mail_template.py b/addons/mail/models/mail_template.py index 02887737cae..43dd8377ab6 100644 --- a/addons/mail/models/mail_template.py +++ b/addons/mail/models/mail_template.py @@ -338,3 +338,13 @@ class MailTemplate(models.Model): if force_send: mail.send(raise_exception=raise_exception) return mail.id # TDE CLEANME: return mail + api.returns ? + + # ------------------------------------------------------------ + # neutralize + # ------------------------------------------------------------ + + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute("UPDATE mail_template SET mail_server_id=NULL") diff --git a/addons/mail/tests/test_mail_render.py b/addons/mail/tests/test_mail_render.py index 4d13d47ec9f..1c3c8202653 100644 --- a/addons/mail/tests/test_mail_render.py +++ b/addons/mail/tests/test_mail_render.py @@ -463,3 +463,19 @@ class TestMailRender(common.MailCommon): self.assertEqual(result, '''
foobar
body''') + + def test_mail_template_neutralize(self): + """ ensure mail templates can be neutralized """ + fake_mail_server = self.env['ir.mail_server'].create({ + 'name': "fake test email server", + 'smtp_host': "mail.example.com", + 'smtp_port': 15626, + }) + self.test_template.mail_server_id = fake_mail_server + self.env['mail.template']._neutralize() + self.assertFalse(self.test_template.mail_server_id) + + # bonus test mail server neutralize too + self.assertTrue(fake_mail_server.active) + self.env['ir.mail_server']._neutralize() + self.assertFalse(fake_mail_server.active) diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 6e58d249111..622f1336ee2 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -1758,3 +1758,12 @@ class Website(models.Model): for word in re.findall(match_pattern, value): if word[0] == search[0]: yield word.lower() + + # ---------------------------------------------------------- + # ORM overrides + # ---------------------------------------------------------- + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute("UPDATE website SET domain=NULL") diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py index df3bc8bcf70..ca3e87d4fa1 100644 --- a/odoo/addons/base/models/ir_actions.py +++ b/odoo/addons/base/models/ir_actions.py @@ -658,6 +658,19 @@ class IrActionsServer(models.Model): ) return res or False + def _neutralize(self): + # In some cases, cron neutralization is not enough as modifying records + # like `fetchmail.server`, `calendar.alarm` and `base.automation` will + # re-enable their cron jobs as a side-effect. + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute(""" + UPDATE ir_act_server + SET code = '#' || REPLACE(code, E'\n', E'\n#') + WHERE usage = 'ir_cron' AND state = 'code' + """) + class IrServerObjectLines(models.Model): _name = 'ir.server.object.lines' diff --git a/odoo/addons/base/models/ir_cron.py b/odoo/addons/base/models/ir_cron.py index 6e2f8de7f26..79e0f414510 100644 --- a/odoo/addons/base/models/ir_cron.py +++ b/odoo/addons/base/models/ir_cron.py @@ -465,6 +465,19 @@ class ir_cron(models.Model): cr.execute('NOTIFY cron_trigger, %s', [self.env.cr.dbname]) _logger.debug("cron workers notified") + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute(""" + UPDATE ir_cron + SET active = false + WHERE id NOT IN ( + SELECT res_id FROM ir_model_data + WHERE model='ir.cron' AND name = 'autovacuum_job' + ) + """) + class ir_cron_trigger(models.Model): _name = 'ir.cron.trigger' diff --git a/odoo/addons/base/models/ir_mail_server.py b/odoo/addons/base/models/ir_mail_server.py index 6f14a678358..0ff6bb2a7b4 100644 --- a/odoo/addons/base/models/ir_mail_server.py +++ b/odoo/addons/base/models/ir_mail_server.py @@ -712,3 +712,9 @@ class IrMailServer(models.Model): outgoing mail server. """ return getattr(threading.currentThread(), 'testing', False) or self.env.registry.in_test_mode() + + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute("UPDATE ir_mail_server SET active = false")