[IMP]add uninstall hook. Add checks when deleting records.
parent
0c7af74654
commit
ac623419eb
|
@ -1,3 +1,4 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from . import models
|
from . import models
|
||||||
|
from .hooks import uninstall_hook
|
||||||
|
|
|
@ -25,4 +25,5 @@
|
||||||
'demo/bi_sql_view_demo.xml',
|
'demo/bi_sql_view_demo.xml',
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
'uninstall_hook': 'uninstall_hook'
|
||||||
}
|
}
|
||||||
|
|
|
@ -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).
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<openerp><data noupdate="1">
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
|
||||||
<record id="incorrect_sql_view" model="bi.sql.view">
|
<record id="incorrect_sql_view" model="bi.sql.view">
|
||||||
<field name="name">Draft Incorrect SQL View</field>
|
<field name="name">Draft Incorrect SQL View</field>
|
||||||
<field name="technical_name">incorrect_view</field>
|
<field name="technical_name">incorrect_view</field>
|
||||||
<field name="query"><![CDATA[
|
<field name="query"><![CDATA[
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM unexisting_table
|
FROM unexisting_table
|
||||||
ORDER BY unexisting_field
|
ORDER BY unexisting_field
|
||||||
]]>
|
]]>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="partner_sql_view" model="bi.sql.view">
|
<record id="partner_sql_view" model="bi.sql.view">
|
||||||
<field name="name">Partners View</field>
|
<field name="name">Partners View</field>
|
||||||
<field name="technical_name">partners_view</field>
|
<field name="technical_name">partners_view</field>
|
||||||
<field name="query"><![CDATA[
|
<field name="query"><![CDATA[
|
||||||
SELECT
|
SELECT
|
||||||
name as x_name,
|
name as x_name,
|
||||||
street as x_street,
|
street as x_street,
|
||||||
company_id as x_company_id
|
company_id as x_company_id
|
||||||
FROM res_partner
|
FROM res_partner
|
||||||
ORDER BY name
|
ORDER BY name
|
||||||
]]>
|
]]>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="module_sql_view" model="bi.sql.view">
|
<record id="module_sql_view" model="bi.sql.view">
|
||||||
<field name="name">Modules by Authors</field>
|
<field name="name">Modules by Authors</field>
|
||||||
<field name="technical_name">modules_view</field>
|
<field name="technical_name">modules_view</field>
|
||||||
<field name="is_materialized" eval="0" />
|
<field name="is_materialized" eval="0" />
|
||||||
<field name="query"><![CDATA[
|
<field name="query"><![CDATA[
|
||||||
SELECT
|
SELECT
|
||||||
name as x_name,
|
name as x_name,
|
||||||
case
|
case
|
||||||
when author ilike '%OpenERP SA%' THEN 'Odoo SA'
|
when author ilike '%OpenERP SA%' THEN 'Odoo SA'
|
||||||
when author ilike '%Odoo Community Association (OCA)%' THEN 'OCA'
|
when author ilike '%Odoo Community Association (OCA)%' THEN 'OCA'
|
||||||
else 'Undefined Author' END as x_author_type
|
else 'Undefined Author' END as x_author_type
|
||||||
FROM ir_module_module
|
FROM ir_module_module
|
||||||
]]>
|
]]>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<function model="bi.sql.view" name="button_validate_sql_expression" eval="([ref('module_sql_view')])"/>
|
<function model="bi.sql.view" name="button_validate_sql_expression" eval="([ref('module_sql_view')])"/>
|
||||||
|
|
||||||
|
@ -54,4 +55,5 @@ FROM ir_module_module
|
||||||
|
|
||||||
<function model="bi.sql.view" name="button_create_ui" eval="([ref('module_sql_view')])"/>
|
<function model="bi.sql.view" name="button_create_ui" eval="([ref('module_sql_view')])"/>
|
||||||
|
|
||||||
</data></openerp>
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2015-2017 Onestein (<http://www.onestein.eu>)
|
||||||
|
# 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.%';
|
||||||
|
""")
|
|
@ -208,13 +208,20 @@ class BiSQLView(models.Model):
|
||||||
# Drop ORM
|
# Drop ORM
|
||||||
sql_view._drop_model_and_fields()
|
sql_view._drop_model_and_fields()
|
||||||
|
|
||||||
sql_view.tree_view_id.unlink()
|
if sql_view.tree_view_id:
|
||||||
sql_view.graph_view_id.unlink()
|
sql_view.tree_view_id.unlink()
|
||||||
sql_view.pivot_view_id.unlink()
|
if sql_view.graph_view_id:
|
||||||
sql_view.search_view_id.unlink()
|
sql_view.graph_view_id.unlink()
|
||||||
sql_view.action_id.unlink()
|
if sql_view.pivot_view_id:
|
||||||
sql_view.menu_id.unlink()
|
sql_view.pivot_view_id.unlink()
|
||||||
sql_view.rule_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:
|
if sql_view.cron_id:
|
||||||
sql_view.cron_id.unlink()
|
sql_view.cron_id.unlink()
|
||||||
sql_view.write({'state': 'draft', 'has_group_changed': False})
|
sql_view.write({'state': 'draft', 'has_group_changed': False})
|
||||||
|
@ -409,9 +416,14 @@ class BiSQLView(models.Model):
|
||||||
@api.multi
|
@api.multi
|
||||||
def _drop_view(self):
|
def _drop_view(self):
|
||||||
for sql_view in self:
|
for sql_view in self:
|
||||||
self._log_execute(
|
try:
|
||||||
"DROP %s VIEW IF EXISTS %s" % (
|
self._log_execute(
|
||||||
sql_view.materialized_text, sql_view.view_name))
|
"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
|
sql_view.size = False
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
|
@ -464,7 +476,8 @@ class BiSQLView(models.Model):
|
||||||
@api.multi
|
@api.multi
|
||||||
def _drop_model_and_fields(self):
|
def _drop_model_and_fields(self):
|
||||||
for sql_view in self:
|
for sql_view in self:
|
||||||
sql_view.model_id.unlink()
|
if sql_view.model_id:
|
||||||
|
sql_view.model_id.unlink()
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def _hook_executed_request(self):
|
def _hook_executed_request(self):
|
||||||
|
@ -547,7 +560,7 @@ class BiSQLView(models.Model):
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def _refresh_materialized_view(self):
|
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" % (
|
req = "REFRESH %s VIEW %s" % (
|
||||||
sql_view.materialized_text, sql_view.view_name)
|
sql_view.materialized_text, sql_view.view_name)
|
||||||
self._log_execute(req)
|
self._log_execute(req)
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2017 Onestein (<http://www.onestein.eu>)
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
||||||
|
|
||||||
from . import test_bi_sql_view
|
|
|
@ -1,56 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2017 Onestein (<http://www.onestein.eu>)
|
|
||||||
# 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()
|
|
Loading…
Reference in New Issue