From bdf8e4441a9486d7ab40e75d07d5c5749820f0b8 Mon Sep 17 00:00:00 2001 From: Sylvain Calador Date: Wed, 1 Apr 2015 11:12:02 +0200 Subject: [PATCH] [IMP] Module constraint install and uninstall --- pos_product_category/README.rst | 7 ++++ pos_product_category/__init__.py | 1 + pos_product_category/module.py | 59 ++++++++++++++++++++++++++++++++ pos_product_category/product.py | 11 +++++- 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 pos_product_category/module.py diff --git a/pos_product_category/README.rst b/pos_product_category/README.rst index a0380b6d..83fe6d6a 100644 --- a/pos_product_category/README.rst +++ b/pos_product_category/README.rst @@ -6,6 +6,13 @@ POS Product Category This module was written to replace POS categories by product categories. +Important notes: +- When the module is installed the link beetween products and POS categories + is **overwritten** by a link beetween product categories + (the link is the field pos_categ_id in the table product_template) +- When the module is uninstalled the link beetween products and POS categories + is restored in an **empty** state (NULL values) + Installation ============ diff --git a/pos_product_category/__init__.py b/pos_product_category/__init__.py index 468e5ccb..5f45a17f 100644 --- a/pos_product_category/__init__.py +++ b/pos_product_category/__init__.py @@ -20,3 +20,4 @@ ############################################################################## from . import product +from . import module diff --git a/pos_product_category/module.py b/pos_product_category/module.py new file mode 100644 index 00000000..bcabab40 --- /dev/null +++ b/pos_product_category/module.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2015-TODAY Akretion (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp import models + + +class Module(models.Model): + + _inherit = 'ir.module.module' + + def module_uninstall(self, cr, uid, ids, context=None): + + context = context or {} + + for module in self.browse(cr, uid, ids, context=context): + if module.name == 'pos_product_category': + + # As we have loose previous POS categs restore them + # in a sane empty state + + cr.execute('UPDATE product_template SET pos_categ_id=NULL') + + # And restore original constraint + cr.execute(''' + ALTER TABLE product_template + DROP CONSTRAINT IF EXISTS + product_template_pos_categ_id_fkey + ''') + + cr.execute(''' + ALTER TABLE product_template ADD CONSTRAINT + "product_template_pos_categ_id_fkey" + FOREIGN KEY (pos_categ_id) + REFERENCES pos_category(id) ON DELETE SET NULL; + ''') + + break + + return super(Module, self).module_uninstall( + cr, uid, ids, context=context + ) diff --git a/pos_product_category/product.py b/pos_product_category/product.py index f660d9e4..4e0cd4cb 100644 --- a/pos_product_category/product.py +++ b/pos_product_category/product.py @@ -19,6 +19,7 @@ # ############################################################################## +import sys from openerp import models, fields, api @@ -50,8 +51,10 @@ def _auto_end(self, cr, context=None): context = context or {} module = context['module'] foreign_keys = [] + patched = 'openerp.addons.pos_product_category' in sys.modules + for t, k, r, d in self._foreign_keys: - if (t, k) == ('product_template', 'pos_categ_id'): + if patched and (t, k) == ('product_template', 'pos_categ_id'): if module == 'pos_product_category': cr.execute(''' ALTER TABLE product_template @@ -62,6 +65,12 @@ def _auto_end(self, cr, context=None): UPDATE product_template SET pos_categ_id = categ_id; ''') + cr.execute(''' + ALTER TABLE product_template ADD CONSTRAINT + "product_template_pos_categ_id_fkey" + FOREIGN KEY (pos_categ_id) + REFERENCES product_category(id) ON DELETE SET NULL; + ''') continue foreign_keys.append((t, k, r, d)) self._foreign_keys = foreign_keys