diff --git a/bi_sql_editor/__init__.py b/bi_sql_editor/__init__.py index cde864ba..e4f76a9e 100644 --- a/bi_sql_editor/__init__.py +++ b/bi_sql_editor/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- from . import models +from .hooks import uninstall_hook diff --git a/bi_sql_editor/__openerp__.py b/bi_sql_editor/__openerp__.py index 8670ca6e..edd4bf5f 100644 --- a/bi_sql_editor/__openerp__.py +++ b/bi_sql_editor/__openerp__.py @@ -25,4 +25,5 @@ 'demo/bi_sql_view_demo.xml', ], 'installable': True, + 'uninstall_hook': 'uninstall_hook' } diff --git a/bi_sql_editor/demo/bi_sql_view_demo.xml b/bi_sql_editor/demo/bi_sql_view_demo.xml index 29e1b767..7758110b 100644 --- a/bi_sql_editor/demo/bi_sql_view_demo.xml +++ b/bi_sql_editor/demo/bi_sql_view_demo.xml @@ -5,48 +5,49 @@ Copyright (C) 2014 - Today GRAP (http://www.grap.coop) License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - - - - Draft Incorrect SQL View - incorrect_view - - - - - - Partners View - partners_view - - - - - - Modules by Authors - modules_view - - - - + + + + + Draft Incorrect SQL View + incorrect_view + + + + + + Partners View + partners_view + + + + + + Modules by Authors + modules_view + + + + @@ -54,4 +55,5 @@ FROM ir_module_module - + + diff --git a/bi_sql_editor/hooks.py b/bi_sql_editor/hooks.py new file mode 100644 index 00000000..ee78f707 --- /dev/null +++ b/bi_sql_editor/hooks.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2015-2017 Onestein () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openerp import SUPERUSER_ID +from openerp.api import Environment + + +def uninstall_hook(cr, registry): + env = Environment(cr, SUPERUSER_ID, {}) + recs = env['bi.sql.view'].search([]) + for rec in recs: + rec.button_set_draft() + rec.unlink() + + # delete dirty data that could cause problems + # while re-installing the module + # Drop materialized views + cr.execute(""" + select relname + from pg_class + where relname like 'x_bi_sql_view%' and relkind='m' + """) + for r in cr.fetchall(): + cr.execute(""" + DROP MATERIALIZED VIEW %s + """ % r) + + cr.execute(""" + select relname + from pg_class + where relname like 'x_bi_sql_view%' and relkind='r' + """) + for r in cr.fetchall(): + cr.execute(""" + DROP TABLE %s + """ % r) + cr.execute(""" + select table_name from INFORMATION_SCHEMA.views + where table_name like 'x_bi_sql%'""") + + # Drop not materialized views + for v in cr.fetchall(): + cr.execute(""" + DROP VIEW %s + """ % v) + + # Drop table if uninstalling went wrong + cr.execute(""" + delete from ir_model_fields where model like 'bi.sql.view%'; + delete from ir_model_fields where model like 'bi_sql_%'; + delete from ir_model where model like 'x_bi_sql_view.%'; + """) diff --git a/bi_sql_editor/models/bi_sql_view.py b/bi_sql_editor/models/bi_sql_view.py index 048c4d42..8b7ae9ff 100644 --- a/bi_sql_editor/models/bi_sql_view.py +++ b/bi_sql_editor/models/bi_sql_view.py @@ -208,13 +208,20 @@ class BiSQLView(models.Model): # Drop ORM sql_view._drop_model_and_fields() - sql_view.tree_view_id.unlink() - sql_view.graph_view_id.unlink() - sql_view.pivot_view_id.unlink() - sql_view.search_view_id.unlink() - sql_view.action_id.unlink() - sql_view.menu_id.unlink() - sql_view.rule_id.unlink() + if sql_view.tree_view_id: + sql_view.tree_view_id.unlink() + if sql_view.graph_view_id: + sql_view.graph_view_id.unlink() + if sql_view.pivot_view_id: + sql_view.pivot_view_id.unlink() + if sql_view.search_view_id: + sql_view.search_view_id.unlink() + if sql_view.action_id: + sql_view.action_id.unlink() + if sql_view.menu_id: + sql_view.menu_id.unlink() + if sql_view.rule_id: + sql_view.rule_id.unlink() if sql_view.cron_id: sql_view.cron_id.unlink() sql_view.write({'state': 'draft', 'has_group_changed': False}) @@ -409,9 +416,14 @@ class BiSQLView(models.Model): @api.multi def _drop_view(self): for sql_view in self: - self._log_execute( - "DROP %s VIEW IF EXISTS %s" % ( - sql_view.materialized_text, sql_view.view_name)) + try: + self._log_execute( + "DROP %s VIEW IF EXISTS %s" % ( + sql_view.materialized_text, sql_view.view_name)) + except ProgrammingError as e: + # If it is not a materialized view will raise an error, + # and we pass. + continue sql_view.size = False @api.multi @@ -464,7 +476,8 @@ class BiSQLView(models.Model): @api.multi def _drop_model_and_fields(self): for sql_view in self: - sql_view.model_id.unlink() + if sql_view.model_id: + sql_view.model_id.unlink() @api.multi def _hook_executed_request(self): @@ -547,7 +560,7 @@ class BiSQLView(models.Model): @api.multi def _refresh_materialized_view(self): - for sql_view in self: + for sql_view in self.filtered(lambda v: v.is_materialized == True): req = "REFRESH %s VIEW %s" % ( sql_view.materialized_text, sql_view.view_name) self._log_execute(req) diff --git a/bi_sql_editor/tests/__init__.py b/bi_sql_editor/tests/__init__.py deleted file mode 100644 index 7b4cf478..00000000 --- a/bi_sql_editor/tests/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from . import test_bi_sql_view diff --git a/bi_sql_editor/tests/test_bi_sql_view.py b/bi_sql_editor/tests/test_bi_sql_view.py deleted file mode 100644 index c555e635..00000000 --- a/bi_sql_editor/tests/test_bi_sql_view.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from openerp.tests.common import TransactionCase, at_install, post_install -from openerp.exceptions import Warning as UserError - - -@at_install(False) -@post_install(True) -class TestBiSqlViewEditor(TransactionCase): - - def setUp(self): - super(TestBiSqlViewEditor, self).setUp() - self.res_partner = self.env['res.partner'] - self.res_users = self.env['res.users'] - self.bi_sql_view = self.env['bi.sql.view'] - self.view = self.env.ref( - 'bi_sql_editor.partner_sql_view') - # deleting the existing views otherwise it fails - self.view.state = 'model_valid' - self.view.button_set_draft() - self.group_bi_user = self.env.ref( - 'sql_request_abstract.group_sql_request_user') - self.group_user = self.env.ref( - 'base.group_user') - self.company = self.env.ref('base.main_company') - - def test_process_view(self): - self.assertEqual(self.view.state, 'draft', 'state not draft') - self.view.button_validate_sql_expression() - self.assertEqual(self.view.state, 'sql_valid', 'state not sql_valid') - self.view._check_execution() - for field in self.view.bi_sql_view_field_ids: - field.graph_type = 'row' - self.view.button_create_sql_view_and_model() - self.assertEqual(self.view.state, 'model_valid', - 'state not model_valid') - self.view.button_create_ui() - self.assertEqual(self.view.state, 'ui_valid', 'state not ui_valid') - self.view.button_open_view() - self.view.button_set_draft() - - def test_copy(self): - self.assertEqual(self.view.mod, 'draft', 'state not draft') - copy_view = self.view.copy() - self.assertEqual(copy_view.name, 'Partners View (Copy)', 'Wrong name') - - def test_unlink(self): - self.assertEqual(self.view.state, 'draft', 'state not draft') - self.view.button_validate_sql_expression() - self.view.button_create_sql_view_and_model() - with self.assertRaises(UserError): - self.view.unlink() - self.view.button_set_draft() - self.view.unlink()