diff --git a/quality_control_oca/__manifest__.py b/quality_control_oca/__manifest__.py index 0e0d9376a..5a688f284 100644 --- a/quality_control_oca/__manifest__.py +++ b/quality_control_oca/__manifest__.py @@ -7,16 +7,13 @@ { "name": "Quality control", - "version": "12.0.1.2.0", + "version": "13.0.1.0.0", "category": "Quality control", "license": "AGPL-3", "summary": "Generic infrastructure for quality tests.", - "author": "OdooMRP team, " - "Odoo Community Association (OCA)", + "author": "OdooMRP team, " "Odoo Community Association (OCA)", "website": "https://github.com/OCA/manufacture/tree/12.0/quality_control", - "depends": [ - "product", - ], + "depends": ["product"], "data": [ "data/quality_control_data.xml", "security/quality_control_security.xml", @@ -30,8 +27,6 @@ "views/product_template_view.xml", "views/product_category_view.xml", ], - "demo": [ - "demo/quality_control_demo.xml", - ], + "demo": ["demo/quality_control_demo.xml"], "installable": True, } diff --git a/quality_control_oca/data/quality_control_data.xml b/quality_control_oca/data/quality_control_data.xml index d30137fcc..2313814b3 100644 --- a/quality_control_oca/data/quality_control_data.xml +++ b/quality_control_oca/data/quality_control_data.xml @@ -1,4 +1,4 @@ - + - Quality control - User - + - Manager - - - + + + - Quality control test multi-company - - - ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] + + + ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] - Quality control inspection multi-company - - - ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] + + + ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] - Quality control trigger multi-company - - - ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] + + + ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] - diff --git a/quality_control_oca/tests/test_quality_control.py b/quality_control_oca/tests/test_quality_control.py index 883484e7b..7f79d68d3 100644 --- a/quality_control_oca/tests/test_quality_control.py +++ b/quality_control_oca/tests/test_quality_control.py @@ -5,204 +5,220 @@ # Copyright 2017 Simone Rubino - Agile Business Group # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.tests.common import TransactionCase from odoo import exceptions -from ..models.qc_trigger_line import\ - _filter_trigger_lines +from odoo.tests.common import TransactionCase + +from ..models.qc_trigger_line import _filter_trigger_lines class TestQualityControl(TransactionCase): - def setUp(self): super(TestQualityControl, self).setUp() - self.inspection_model = self.env['qc.inspection'] - self.category_model = self.env['qc.test.category'] - self.question_model = self.env['qc.test.question'] - self.wizard_model = self.env['qc.inspection.set.test'] - self.qc_trigger = self.env['qc.trigger'].create({ - 'name': 'Test Trigger', - 'active': True, - }) - self.test = self.env.ref('quality_control.qc_test_1') - self.val_ok = self.env.ref('quality_control.qc_test_question_value_1') - self.val_ko = self.env.ref('quality_control.qc_test_question_value_2') - self.qn_question = self.env.ref('quality_control.qc_test_question_2') + self.inspection_model = self.env["qc.inspection"] + self.category_model = self.env["qc.test.category"] + self.question_model = self.env["qc.test.question"] + self.wizard_model = self.env["qc.inspection.set.test"] + self.qc_trigger = self.env["qc.trigger"].create( + {"name": "Test Trigger", "active": True} + ) + self.test = self.env.ref("quality_control.qc_test_1") + self.val_ok = self.env.ref("quality_control.qc_test_question_value_1") + self.val_ko = self.env.ref("quality_control.qc_test_question_value_2") + self.qn_question = self.env.ref("quality_control.qc_test_question_2") self.cat_generic = self.env.ref( - 'quality_control.qc_test_template_category_generic') - self.product = self.env.ref('product.product_product_11') - inspection_lines = ( - self.inspection_model._prepare_inspection_lines(self.test)) - self.inspection1 = self.inspection_model.create({ - 'name': 'Test Inspection', - 'inspection_lines': inspection_lines, - }) + "quality_control.qc_test_template_category_generic" + ) + self.product = self.env.ref("product.product_product_11") + inspection_lines = self.inspection_model._prepare_inspection_lines(self.test) + self.inspection1 = self.inspection_model.create( + {"name": "Test Inspection", "inspection_lines": inspection_lines} + ) self.wizard = self.wizard_model.with_context( - active_id=self.inspection1.id).create({ - 'test': self.test.id, - }) + active_id=self.inspection1.id + ).create({"test": self.test.id}) self.wizard.action_create_test() self.inspection1.action_todo() def test_inspection_correct(self): for line in self.inspection1.inspection_lines: - if line.question_type == 'qualitative': + if line.question_type == "qualitative": line.qualitative_value = self.val_ok - if line.question_type == 'quantitative': + if line.question_type == "quantitative": line.quantitative_value = 5.0 self.inspection1.action_confirm() for line in self.inspection1.inspection_lines: self.assertTrue( - line.success, - 'Incorrect state in inspection line %s' % line.name) + line.success, "Incorrect state in inspection line %s" % line.name + ) self.assertTrue( self.inspection1.success, - 'Incorrect state in inspection %s' % self.inspection1.name) - self.assertEqual(self.inspection1.state, 'success') + "Incorrect state in inspection %s" % self.inspection1.name, + ) + self.assertEqual(self.inspection1.state, "success") self.inspection1.action_approve() - self.assertEqual(self.inspection1.state, 'success') + self.assertEqual(self.inspection1.state, "success") def test_inspection_incorrect(self): for line in self.inspection1.inspection_lines: - if line.question_type == 'qualitative': + if line.question_type == "qualitative": line.qualitative_value = self.val_ko - if line.question_type == 'quantitative': + if line.question_type == "quantitative": line.quantitative_value = 15.0 self.inspection1.action_confirm() for line in self.inspection1.inspection_lines: self.assertFalse( - line.success, - 'Incorrect state in inspection line %s' % line.name) + line.success, "Incorrect state in inspection line %s" % line.name + ) self.assertFalse( self.inspection1.success, - 'Incorrect state in inspection %s' % self.inspection1.name) - self.assertEqual(self.inspection1.state, 'waiting') + "Incorrect state in inspection %s" % self.inspection1.name, + ) + self.assertEqual(self.inspection1.state, "waiting") self.inspection1.action_approve() - self.assertEqual(self.inspection1.state, 'failed') + self.assertEqual(self.inspection1.state, "failed") def test_actions_errors(self): inspection2 = self.inspection1.copy() inspection2.action_draft() - inspection2.write({'test': False}) + inspection2.write({"test": False}) with self.assertRaises(exceptions.UserError): inspection2.action_todo() inspection3 = self.inspection1.copy() - inspection3.write({ - 'inspection_lines': - self.inspection_model._prepare_inspection_lines(inspection3.test) - }) + inspection3.write( + { + "inspection_lines": self.inspection_model._prepare_inspection_lines( + inspection3.test + ) + } + ) for line in inspection3.inspection_lines: - if line.question_type == 'quantitative': + if line.question_type == "quantitative": line.quantitative_value = 15.0 with self.assertRaises(exceptions.UserError): inspection3.action_confirm() inspection4 = self.inspection1.copy() - inspection4.write({ - 'inspection_lines': - self.inspection_model._prepare_inspection_lines(inspection4.test) - }) + inspection4.write( + { + "inspection_lines": self.inspection_model._prepare_inspection_lines( + inspection4.test + ) + } + ) for line in inspection4.inspection_lines: - if line.question_type == 'quantitative': - line.write({ - 'uom_id': False, - 'quantitative_value': 15.0, - }) - elif line.question_type == 'qualitative': + if line.question_type == "quantitative": + line.write({"uom_id": False, "quantitative_value": 15.0}) + elif line.question_type == "qualitative": line.qualitative_value = self.val_ok with self.assertRaises(exceptions.UserError): inspection4.action_confirm() def test_categories(self): - category1 = self.category_model.create({ - 'name': 'Category ONE', - }) - category2 = self.category_model.create({ - 'name': 'Category TWO', - 'parent_id': category1.id, - }) + category1 = self.category_model.create({"name": "Category ONE"}) + category2 = self.category_model.create( + {"name": "Category TWO", "parent_id": category1.id} + ) self.assertEqual( category2.complete_name, - '%s / %s' % (category1.name, category2.name), - 'Something went wrong when computing complete name') + "{} / {}".format(category1.name, category2.name), + "Something went wrong when computing complete name", + ) with self.assertRaises(exceptions.ValidationError): category1.parent_id = category2.id def test_get_qc_trigger_product(self): - self.test.write({ - 'fill_correct_values': True, - }) + self.test.write({"fill_correct_values": True}) trigger_lines = set() - self.product.write({ - 'qc_triggers': [(0, 0, {'trigger': self.qc_trigger.id, - 'test': self.test.id})], - }) - self.product.product_tmpl_id.write({ - 'qc_triggers': [(0, 0, {'trigger': self.qc_trigger.id, - 'test': self.test.id})], - }) - self.product.categ_id.write({ - 'qc_triggers': [(0, 0, {'trigger': self.qc_trigger.id, - 'test': self.test.id})], - }) - for model in ['qc.trigger.product_category_line', - 'qc.trigger.product_template_line', - 'qc.trigger.product_line']: + self.product.write( + { + "qc_triggers": [ + (0, 0, {"trigger": self.qc_trigger.id, "test": self.test.id}) + ], + } + ) + self.product.product_tmpl_id.write( + { + "qc_triggers": [ + (0, 0, {"trigger": self.qc_trigger.id, "test": self.test.id}) + ], + } + ) + self.product.categ_id.write( + { + "qc_triggers": [ + (0, 0, {"trigger": self.qc_trigger.id, "test": self.test.id}) + ], + } + ) + for model in [ + "qc.trigger.product_category_line", + "qc.trigger.product_template_line", + "qc.trigger.product_line", + ]: trigger_lines = trigger_lines.union( self.env[model].get_trigger_line_for_product( - self.qc_trigger, self.product)) + self.qc_trigger, self.product + ) + ) self.assertEqual(len(trigger_lines), 3) filtered_trigger_lines = _filter_trigger_lines(trigger_lines) self.assertEqual(len(filtered_trigger_lines), 1) for trigger_line in filtered_trigger_lines: inspection = self.inspection_model._make_inspection( - self.product, trigger_line) - self.assertEqual(inspection.state, 'ready') + self.product, trigger_line + ) + self.assertEqual(inspection.state, "ready") self.assertTrue(inspection.auto_generated) self.assertEqual(inspection.test, self.test) for line in inspection.inspection_lines: - if line.question_type == 'qualitative': + if line.question_type == "qualitative": self.assertEqual(line.qualitative_value, self.val_ok) - elif line.question_type == 'quantitative': + elif line.question_type == "quantitative": self.assertAlmostEqual( - round(line.quantitative_value, 2), round(( - self.qn_question.min_value + - self.qn_question.max_value) * 0.5, 2)) + round(line.quantitative_value, 2), + round( + (self.qn_question.min_value + self.qn_question.max_value) + * 0.5, + 2, + ), + ) def test_qc_inspection_not_draft_unlink(self): with self.assertRaises(exceptions.UserError): self.inspection1.unlink() inspection2 = self.inspection1.copy() inspection2.action_cancel() - self.assertEqual(inspection2.state, 'canceled') + self.assertEqual(inspection2.state, "canceled") inspection2.action_draft() - self.assertEqual(inspection2.state, 'draft') + self.assertEqual(inspection2.state, "draft") inspection2.unlink() def test_qc_inspection_auto_generate_unlink(self): inspection2 = self.inspection1.copy() - inspection2.write({ - 'auto_generated': True, - }) + inspection2.write({"auto_generated": True}) with self.assertRaises(exceptions.UserError): inspection2.unlink() def test_qc_inspection_product(self): - self.inspection1.write({ - 'object_id': '%s,%d' % (self.product._name, self.product.id), - }) + self.inspection1.write( + {"object_id": "%s,%d" % (self.product._name, self.product.id)} + ) self.assertEqual(self.inspection1.product_id, self.product) def test_qc_test_question_constraints(self): with self.assertRaises(exceptions.ValidationError): - self.question_model.create({ - 'name': 'Quantitative Question', - 'type': 'quantitative', - 'min_value': 1.0, - 'max_value': 0.0, - }) + self.question_model.create( + { + "name": "Quantitative Question", + "type": "quantitative", + "min_value": 1.0, + "max_value": 0.0, + } + ) with self.assertRaises(exceptions.ValidationError): - self.question_model.create({ - 'name': 'Qualitative Question', - 'type': 'qualitative', - 'ql_values': [(0, 0, {'name': 'Qualitative answer', - 'ok': False})], - }) + self.question_model.create( + { + "name": "Qualitative Question", + "type": "qualitative", + "ql_values": [(0, 0, {"name": "Qualitative answer", "ok": False})], + } + ) diff --git a/quality_control_oca/views/product_category_view.xml b/quality_control_oca/views/product_category_view.xml index 3942c317a..a06b3dbd3 100644 --- a/quality_control_oca/views/product_category_view.xml +++ b/quality_control_oca/views/product_category_view.xml @@ -1,4 +1,4 @@ - + - product.category.qc product.category - + - + @@ -26,5 +28,4 @@ - diff --git a/quality_control_oca/views/product_template_view.xml b/quality_control_oca/views/product_template_view.xml index 721d79f63..7b2803af1 100644 --- a/quality_control_oca/views/product_template_view.xml +++ b/quality_control_oca/views/product_template_view.xml @@ -1,4 +1,4 @@ - + - product.template.qc product.template - - + + - - + + @@ -27,5 +32,4 @@ - diff --git a/quality_control_oca/views/qc_inspection_view.xml b/quality_control_oca/views/qc_inspection_view.xml index 5c9451405..37f18aa60 100644 --- a/quality_control_oca/views/qc_inspection_view.xml +++ b/quality_control_oca/views/qc_inspection_view.xml @@ -1,4 +1,4 @@ - + - qc.inspection.form qc.inspection
-
-

-

@@ -74,45 +87,57 @@ - + - - - - - - + + + + + + - - + + - - + +
- - + +
- qc.inspection.tree qc.inspection @@ -128,7 +153,6 @@ - qc.inspection.search qc.inspection @@ -142,83 +166,110 @@ - - + + - - - - - - - + + + + + + + - Inspections qc.inspection form tree,form - - - + qc.inspection.line.tree qc.inspection.line - + - - - - + + + + - qc.inspection.line.search qc.inspection.line @@ -231,46 +282,56 @@ - - + + - - - - + + + + - Inspection lines qc.inspection.line form tree - - - +
- diff --git a/quality_control_oca/views/qc_menus.xml b/quality_control_oca/views/qc_menus.xml index f506122ed..042a255db 100644 --- a/quality_control_oca/views/qc_menus.xml +++ b/quality_control_oca/views/qc_menus.xml @@ -1,4 +1,4 @@ - + - - + + + - - - - - - - diff --git a/quality_control_oca/views/qc_test_category_view.xml b/quality_control_oca/views/qc_test_category_view.xml index e6255b7cc..f185a8911 100644 --- a/quality_control_oca/views/qc_test_category_view.xml +++ b/quality_control_oca/views/qc_test_category_view.xml @@ -1,4 +1,4 @@ - + - qc.test.category.tree qc.test.category - - - - + + + + - Test categories qc.test.category form tree,form - - - + diff --git a/quality_control_oca/views/qc_test_view.xml b/quality_control_oca/views/qc_test_view.xml index 2e636fb7b..f8e8ff23a 100644 --- a/quality_control_oca/views/qc_test_view.xml +++ b/quality_control_oca/views/qc_test_view.xml @@ -1,4 +1,4 @@ - + - qc.test.form qc.test
-
- qc.test.tree qc.test @@ -55,18 +58,16 @@ - + - Tests qc.test form tree,form - qc.test.question.form qc.test.question @@ -80,39 +81,51 @@ - - + + -
+

- - + + - - + - - + +

@@ -120,12 +133,12 @@ - - - + diff --git a/quality_control_oca/views/qc_trigger_view.xml b/quality_control_oca/views/qc_trigger_view.xml index 19b604220..41f17d5d6 100644 --- a/quality_control_oca/views/qc_trigger_view.xml +++ b/quality_control_oca/views/qc_trigger_view.xml @@ -1,4 +1,4 @@ - + - qc.trigger.form qc.trigger
- - - - - - - - + + + + + + + +
- qc.trigger.tree qc.trigger - + -
- diff --git a/quality_control_oca/wizard/qc_test_wizard.py b/quality_control_oca/wizard/qc_test_wizard.py index 2332e9e40..3b60b37e6 100644 --- a/quality_control_oca/wizard/qc_test_wizard.py +++ b/quality_control_oca/wizard/qc_test_wizard.py @@ -14,17 +14,16 @@ class QcInspectionSetTest(models.TransientModel): also fill in all lines of the inspection with the corresponding lines of the template. """ - _name = 'qc.inspection.set.test' - _description = 'Set test for inspection' - test = fields.Many2one(comodel_name='qc.test', string='Test') + _name = "qc.inspection.set.test" + _description = "Set test for inspection" + + test = fields.Many2one(comodel_name="qc.test", string="Test") @api.multi def action_create_test(self): - inspection = self.env['qc.inspection'].browse( - self.env.context['active_id']) + inspection = self.env["qc.inspection"].browse(self.env.context["active_id"]) inspection.test = self.test inspection.inspection_lines.unlink() - inspection.inspection_lines = inspection._prepare_inspection_lines( - self.test) + inspection.inspection_lines = inspection._prepare_inspection_lines(self.test) return True diff --git a/quality_control_oca/wizard/qc_test_wizard_view.xml b/quality_control_oca/wizard/qc_test_wizard_view.xml index a88467011..52d495858 100644 --- a/quality_control_oca/wizard/qc_test_wizard_view.xml +++ b/quality_control_oca/wizard/qc_test_wizard_view.xml @@ -1,4 +1,4 @@ - + - qc.inspection.set.test.form qc.inspection.set.test @@ -16,19 +15,18 @@
-
- Select test ir.actions.act_window @@ -37,5 +35,4 @@ form new -