Skip to content

Commit

Permalink
Merge 0043ab9 into ea9a510
Browse files Browse the repository at this point in the history
  • Loading branch information
daramousk committed Sep 16, 2019
2 parents ea9a510 + 0043ab9 commit 4fb82a3
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 11 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ addons:
packages:
- expect-dev # provides unbuffer utility
- python-lxml # because pip installation is slow
postgresql: "9.6"

env:
global:
Expand Down
16 changes: 7 additions & 9 deletions bi_sql_editor/models/bi_sql_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import logging
from datetime import datetime
from psycopg2 import ProgrammingError
from psycopg2.extensions import AsIs

from openerp import _, api, fields, models, SUPERUSER_ID
from openerp.exceptions import Warning as UserError
Expand Down Expand Up @@ -408,9 +409,7 @@ def _create_model_and_fields(self):
sql_view.rule_id = self.env['ir.rule'].create(
self._prepare_rule()).id
# Drop table, created by the ORM
req = "DROP TABLE %s" % (sql_view.view_name)\
# pylint: disable=sql-injection
self.env.cr.execute(req)
self.env.cr.execute('DROP TABLE %s', (AsIs(sql_view.view_name), ))

@api.multi
def _create_model_access(self):
Expand All @@ -427,6 +426,7 @@ def _drop_model_access(self):
@api.multi
def _drop_model_and_fields(self):
for sql_view in self:
sql_view.rule_id.unlink()
sql_view.model_id.unlink()

@api.multi
Expand All @@ -440,9 +440,8 @@ def _hook_executed_request(self):
WHERE attrelid = '%s'::regclass
AND NOT attisdropped
AND attnum > 0
ORDER BY attnum;""" % (
self.view_name) # pylint: disable=sql-injection
self.env.cr.execute(req)
ORDER BY attnum;"""
self.env.cr.execute(req, (AsIs(self.view_name), ))
return self.env.cr.fetchall()

@api.multi
Expand Down Expand Up @@ -526,7 +525,6 @@ def _refresh_materialized_view(self):
@api.multi
def _refresh_size(self):
for sql_view in self:
req = "SELECT pg_size_pretty(pg_total_relation_size('%s'));" % (
sql_view.view_name) # pylint: disable=sql-injection
self.env.cr.execute(req)
req = "SELECT pg_size_pretty(pg_total_relation_size('%s'));"
self.env.cr.execute(req, (AsIs(sql_view.view_name), ))
sql_view.size = self.env.cr.fetchone()[0]
2 changes: 0 additions & 2 deletions bi_sql_editor/models/bi_sql_view_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,6 @@ def _prepare_model_field(self):
'selection': self.ttype == 'selection' and self.selection or False,
'relation': self.ttype == 'many2one' and
self.many2one_model_id.model or False,
'tree_visibility': self.field_description and
'available' or 'unavailable',
}

@api.multi
Expand Down
3 changes: 3 additions & 0 deletions bi_sql_editor/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import test_bi_sql_view
69 changes: 69 additions & 0 deletions bi_sql_editor/tests/test_bi_sql_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Therp BV <https://therp.nl>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from openerp.tests.common import TransactionCase

QUERY = """
SELECT
name AS x_name, create_date AS x_create_date, parent_id AS x_parent_id
FROM
res_partner
"""


class TestBiSqlView(TransactionCase):

post_install = True
at_install = False

def setUp(self):
super(TestBiSqlView, self).setUp()
bi_sql_view_model = self.env['bi.sql.view']
res_partner_model = self.env['res.partner']
partner1 = res_partner_model.create({'name': 'partner1'})
res_partner_model.create({
'name': 'partner2',
'child_ids': [(6, 0, partner1.ids)],
})
self.view = bi_sql_view_model.create({
'name': 'test_view',
'technical_name': 'test_view',
'is_materialized': True,
'query': QUERY,
})

def test_materialized_view_creation(self):
self.view.button_validate_sql_expression()
self.view.button_create_sql_view_and_model()
self.assertIsNotNone(self.view.view_name)
self.assertIsNotNone(self.view.is_materialized)
self.assertIsNotNone(self.view.size)
self.assertIsNotNone(self.view.cron_id)
self.assertIsNotNone(self.view.bi_sql_view_field_ids)
for field in self.view.bi_sql_view_field_ids:
if field.name == 'x_id':
self.assertEquals(field.sql_type, 'integer')
self.assertEquals(field.ttype, 'integer')
elif field.name == 'x_name':
self.assertEquals(field.sql_type, 'character varying')
self.assertEquals(field.ttype, 'char')
elif field.name == 'x_parent_id':
self.assertEquals(field.sql_type, 'integer')
self.assertEquals(field.ttype, 'many2one')
elif field.name == 'x_create_date':
self.assertEquals(
field.sql_type,
'timestamp without time zone',
)
self.assertEquals(field.ttype, 'datetime')
self.env.cr.execute(
"SELECT count(*) from information_schema.tables WHERE "
"table_name = 'x_bi_sql_view_test_view'"
)
res = self.env.cr.fetchone()
self.assertTrue(res)
# ideally we should set the view to draft and then unlink it
# but ir_model.unlink() calls RegistryManager.new() which in turn
# reloads the modules which in turn re-runs this test and we get stuck
# in an infinite loop
# So we stop here.

0 comments on commit 4fb82a3

Please sign in to comment.