From 503b8ed6925eddc36afd05683eaaad1a93312c8d Mon Sep 17 00:00:00 2001 From: Adrian Torres Date: Mon, 11 Jun 2018 09:47:34 +0200 Subject: [PATCH] [FIX] *: cleanup (un|re)installation hacks Replace hacks introduced in V11 by the proper solution. --- addons/auth_signup/models/__init__.py | 1 - addons/auth_signup/models/ir_model_fields.py | 19 ---------- addons/mass_mailing/models/__init__.py | 1 - addons/mass_mailing/models/ir_model_fields.py | 30 ---------------- addons/sale/models/__init__.py | 3 +- addons/sale/models/ir_model_fields.py | 19 ---------- addons/website/models/__init__.py | 2 -- addons/website/models/ir_model.py | 15 -------- addons/website/models/ir_model_fields.py | 29 --------------- addons/website/models/res_config_settings.py | 4 +-- addons/website_quote/models/__init__.py | 1 - .../website_quote/models/ir_model_fields.py | 35 ------------------- addons/website_sale/models/__init__.py | 1 - addons/website_sale/models/ir_model_fields.py | 35 ------------------- 14 files changed, 3 insertions(+), 192 deletions(-) delete mode 100644 addons/auth_signup/models/ir_model_fields.py delete mode 100644 addons/mass_mailing/models/ir_model_fields.py delete mode 100644 addons/sale/models/ir_model_fields.py delete mode 100644 addons/website/models/ir_model.py delete mode 100644 addons/website/models/ir_model_fields.py delete mode 100644 addons/website_quote/models/ir_model_fields.py delete mode 100644 addons/website_sale/models/ir_model_fields.py diff --git a/addons/auth_signup/models/__init__.py b/addons/auth_signup/models/__init__.py index a25160266e7..44dc1ee6b11 100644 --- a/addons/auth_signup/models/__init__.py +++ b/addons/auth_signup/models/__init__.py @@ -4,4 +4,3 @@ from . import res_config_settings from . import ir_http from . import res_partner from . import res_users -from . import ir_model_fields diff --git a/addons/auth_signup/models/ir_model_fields.py b/addons/auth_signup/models/ir_model_fields.py deleted file mode 100644 index 828b9de8346..00000000000 --- a/addons/auth_signup/models/ir_model_fields.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details - -from odoo import models - - -# This is a nasty hack, targeted for V11 only -class IrModelFields(models.Model): - _inherit = 'ir.model.fields' - - def unlink(self): - # Prevent the deletion of some `shared` fields... -_- - self = self.filtered( - lambda rec: not ( - rec.model == 'res.config.settings' - and rec.name == 'auth_signup_uninvited' - ) - ) - return super(IrModelFields, self).unlink() diff --git a/addons/mass_mailing/models/__init__.py b/addons/mass_mailing/models/__init__.py index ee8bfe34058..baa418a63a9 100644 --- a/addons/mass_mailing/models/__init__.py +++ b/addons/mass_mailing/models/__init__.py @@ -8,5 +8,4 @@ from . import mail_thread from . import res_config_settings from . import mass_mailing_report from . import link_tracker -from . import ir_model_fields from . import res_users diff --git a/addons/mass_mailing/models/ir_model_fields.py b/addons/mass_mailing/models/ir_model_fields.py deleted file mode 100644 index 1e963bf650e..00000000000 --- a/addons/mass_mailing/models/ir_model_fields.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details - -from odoo import api, models - - -# This is a nasty hack, targeted for V11 only -class IrModelFields(models.Model): - _inherit = 'ir.model.fields' - - @api.multi - def unlink(self): - # Prevent the deletion of social_* fields defined in res.company if - # the other module is installed - social = ( - 'social_facebook', - 'social_github', - 'social_googleplus', - 'social_linkedin', - 'social_twitter', - 'social_youtube', - ) - - self = self.filtered( - lambda rec: not ( - rec.model == 'res.company' and - rec.name in social - ) - ) - return super(IrModelFields, self).unlink() diff --git a/addons/sale/models/__init__.py b/addons/sale/models/__init__.py index dcd51bccca5..408ed3ad3b6 100644 --- a/addons/sale/models/__init__.py +++ b/addons/sale/models/__init__.py @@ -12,5 +12,4 @@ from . import sale from . import res_config_settings from . import sale_layout from . import sales_team -from . import ir_model_fields -from . import res_users \ No newline at end of file +from . import res_users diff --git a/addons/sale/models/ir_model_fields.py b/addons/sale/models/ir_model_fields.py deleted file mode 100644 index 828b9de8346..00000000000 --- a/addons/sale/models/ir_model_fields.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details - -from odoo import models - - -# This is a nasty hack, targeted for V11 only -class IrModelFields(models.Model): - _inherit = 'ir.model.fields' - - def unlink(self): - # Prevent the deletion of some `shared` fields... -_- - self = self.filtered( - lambda rec: not ( - rec.model == 'res.config.settings' - and rec.name == 'auth_signup_uninvited' - ) - ) - return super(IrModelFields, self).unlink() diff --git a/addons/website/models/__init__.py b/addons/website/models/__init__.py index ae4613baff0..349e9792e01 100644 --- a/addons/website/models/__init__.py +++ b/addons/website/models/__init__.py @@ -10,6 +10,4 @@ from . import ir_ui_view from . import res_company from . import res_partner from . import res_config_settings -from . import ir_model_fields -from . import ir_model from . import res_users diff --git a/addons/website/models/ir_model.py b/addons/website/models/ir_model.py deleted file mode 100644 index 6d254374c38..00000000000 --- a/addons/website/models/ir_model.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details - -from odoo import api, models - - -# This is a nasty hack, targeted for V11 only -class IrModel(models.Model): - _inherit = 'ir.model' - - @api.multi - def unlink(self): - self.env.cr.execute( - "DELETE FROM ir_model_fields WHERE name='website_id'") - return super(IrModel, self).unlink() diff --git a/addons/website/models/ir_model_fields.py b/addons/website/models/ir_model_fields.py deleted file mode 100644 index 51f5c2a7dc5..00000000000 --- a/addons/website/models/ir_model_fields.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details - -from odoo import models - - -# This is a nasty hack, targeted for V11 only -class IrModelFields(models.Model): - _inherit = 'ir.model.fields' - - def unlink(self): - # Prevent the deletion of some `shared` fields... -_- - social = ( - 'social_facebook', - 'social_github', - 'social_googleplus', - 'social_linkedin', - 'social_twitter', - 'social_youtube', - ) - - self = self.filtered( - lambda rec: not ( - (rec.model == 'res.company' and rec.name in social) - or (rec.model == 'res.config.settings' - and rec.name == 'auth_signup_uninvited') - ) - ) - return super(IrModelFields, self).unlink() diff --git a/addons/website/models/res_config_settings.py b/addons/website/models/res_config_settings.py index c42656c190b..155f54602d5 100644 --- a/addons/website/models/res_config_settings.py +++ b/addons/website/models/res_config_settings.py @@ -13,8 +13,8 @@ class ResConfigSettings(models.TransientModel): def _default_website(self): return self.env['website'].search([], limit=1) - # FIXME: Set website_id to ondelete='cascade' in master - website_id = fields.Many2one('website', string="website", default=_default_website, required=True) + website_id = fields.Many2one('website', string="website", + default=_default_website, required=True, ondelete='cascade') website_name = fields.Char('Website Name', related='website_id.name') language_ids = fields.Many2many(related='website_id.language_ids', relation='res.lang') language_count = fields.Integer(string='Number of languages', compute='_compute_language_count', readonly=True) diff --git a/addons/website_quote/models/__init__.py b/addons/website_quote/models/__init__.py index 43d640bca5f..08bb5a18917 100644 --- a/addons/website_quote/models/__init__.py +++ b/addons/website_quote/models/__init__.py @@ -4,5 +4,4 @@ from .import sale_order from .import sale_quote from .import product_template -from . import ir_model_fields from .import res_config_settings diff --git a/addons/website_quote/models/ir_model_fields.py b/addons/website_quote/models/ir_model_fields.py deleted file mode 100644 index 55643edfe0d..00000000000 --- a/addons/website_quote/models/ir_model_fields.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, models - -# !! Attention, this is a hack of a hack, do not try this at home !! -# This is done because website_quote defines the website_description -# field which is also defined by website_sale, but these two modules -# are independent of each other, the part of the ORM that generates -# xmlids does not support this case therefore it only creates a single -# pair of xmlids for whichever module is installed first, therefore -# when uninstalling any of the two modules the website_descripion field -# will be deleted from the db and the other module won't be able to -# use this field, resulting in a crash and data-loss. -# See opw-776464 for more details. -# -# This is hotfixed by overriding the unlink method so as to not delete -# the website_description field if website_quote is uninstalled, it's -# an ugly hack but it works and big changes can't be done to the ORM -# in stable versions, Odoo v12+ will properly fix this - - -class IrModelFields(models.Model): - _inherit = "ir.model.fields" - - @api.multi - def unlink(self): - # Prevent the deletion of the field "website_description" - self = self.filtered( - lambda rec: not ( - rec.model in ('product.product', 'product.template') and - rec.name == 'website_description' - ) - ) - return super(IrModelFields, self).unlink() diff --git a/addons/website_sale/models/__init__.py b/addons/website_sale/models/__init__.py index 3a394e73151..f2bc8685f6f 100644 --- a/addons/website_sale/models/__init__.py +++ b/addons/website_sale/models/__init__.py @@ -9,6 +9,5 @@ from . import res_country from . import res_partner from . import payment from . import sale_order -from . import ir_model_fields from . import website from . import res_config_settings diff --git a/addons/website_sale/models/ir_model_fields.py b/addons/website_sale/models/ir_model_fields.py deleted file mode 100644 index e109ab809b5..00000000000 --- a/addons/website_sale/models/ir_model_fields.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, models - -# !! Attention, this is a hack of a hack, do not try this at home !! -# This is done because website_sale defines the website_description -# field which is also defined by website_quote, but these two modules -# are independent of each other, the part of the ORM that generates -# xmlids does not support this case therefore it only creates a single -# pair of xmlids for whichever module is installed first, therefore -# when uninstalling any of the two modules the website_descripion field -# will be deleted from the db and the other module won't be able to -# use this field, resulting in a crash and data-loss. -# See opw-776464 for more details. -# -# This is hotfixed by overriding the unlink method so as to not delete -# the website_description field if website_sale is uninstalled, it's -# an ugly hack but it works and big changes can't be done to the ORM -# in stable versions, Odoo v12+ will properly fix this - - -class IrModelFields(models.Model): - _inherit = "ir.model.fields" - - @api.multi - def unlink(self): - # Prevent the deletion of the field "website_description" - self = self.filtered( - lambda rec: not ( - rec.model in ('product.product', 'product.template') and - rec.name == 'website_description' - ) - ) - return super(IrModelFields, self).unlink()