diff --git a/contract/models/contract_line.py b/contract/models/contract_line.py index 482cd3272..011cdc4bd 100644 --- a/contract/models/contract_line.py +++ b/contract/models/contract_line.py @@ -251,6 +251,8 @@ class ContractLine(models.Model): ] if state == 'canceled': return [('is_canceled', '=', True)] + if not state: + return [('display_type', '!=', False)] @api.model def _search_state(self, operator, value): @@ -261,11 +263,8 @@ class ContractLine(models.Model): 'upcoming-close', 'closed', 'canceled', + False, ] - if operator == '!=' and not value: - return [] - if operator == '=' and not value: - return [('id', '=', False)] if operator == '=': return self._get_state_domain(value) if operator == '!=': @@ -278,8 +277,6 @@ class ContractLine(models.Model): return domain if operator == 'in': domain = [] - if not value: - return [('id', '=', False)] for state in value: if domain: domain.insert(0, '|') @@ -287,6 +284,8 @@ class ContractLine(models.Model): return domain if operator == 'not in': + if set(value) == set(states): + return [('id', '=', False)] return self._search_state( 'in', [state for state in states if state not in value] ) diff --git a/contract/tests/test_contract.py b/contract/tests/test_contract.py index 53daf7180..e4b9c7d77 100644 --- a/contract/tests/test_contract.py +++ b/contract/tests/test_contract.py @@ -42,9 +42,16 @@ class TestContractBase(common.SavepointCase): 'recurring_rule_type': 'yearly', 'recurring_interval': 1, } + cls.section_template_vals = { + 'display_type': 'line_section', + 'name': 'Test section', + } cls.template_vals = { 'name': 'Test Contract Template', - 'contract_line_ids': [(0, 0, cls.line_template_vals)], + 'contract_line_ids': [ + (0, 0, cls.section_template_vals), + (0, 0, cls.line_template_vals), + ], } cls.template = cls.env['contract.template'].create( cls.template_vals @@ -403,6 +410,14 @@ class TestContract(TestContractBase): self.contract._onchange_contract_template_id() res = { 'contract_line_ids': [ + ( + 0, + 0, + { + 'display_type': 'line_section', + 'name': 'Test section', + } + ), ( 0, 0, @@ -434,15 +449,19 @@ class TestContract(TestContractBase): ) self.contract.contract_template_id = self.template self.contract._onchange_contract_template_id() - self.assertEqual(len(self.contract.contract_line_ids), 1) - - for key, value in self.line_template_vals.items(): - test_value = self.contract.contract_line_ids[0][key] - try: - test_value = test_value.id - except AttributeError: - pass - self.assertEqual(test_value, value) + self.assertEqual(len(self.contract.contract_line_ids), 2) + for index, vals in [ + (0, self.section_template_vals), + (1, self.line_template_vals) + ]: + contract_line = self.contract.contract_line_ids[index] + for key, value in vals.items(): + test_value = contract_line[key] + try: + test_value = test_value.id + except AttributeError: + pass + self.assertEqual(test_value, value) def test_send_mail_contract(self): result = self.contract.action_contract_send() @@ -2098,6 +2117,12 @@ class TestContract(TestContractBase): 'is_canceled': True, } ) + # section + lines |= self.env['contract.line'].create({ + "contract_id": self.contract.id, + "display_type": "line_section", + "name": "Test section", + }) states = [ 'upcoming', 'in-progress', @@ -2105,48 +2130,29 @@ class TestContract(TestContractBase): 'upcoming-close', 'closed', 'canceled', + False, ] self.assertEqual(set(lines.mapped('state')), set(states)) + # Test search method for state in states: - lines = self.env['contract.line'].search( - [('state', '=', state)] - ) - self.assertEqual(len(set(lines.mapped('state'))), 1, state) - self.assertEqual(lines.mapped('state')[0], state, state) - - for state in states: - lines = self.env['contract.line'].search( - [('state', '!=', state)] - ) - self.assertFalse(state in lines.mapped('state')) - - lines = self.env['contract.line'].search( - [('state', 'in', states)] - ) + lines = self.env['contract.line'].search([('state', '=', state)]) + self.assertTrue(lines, state) + self.assertTrue(state in lines.mapped('state'), state) + lines = self.env['contract.line'].search([('state', '!=', state)]) + self.assertFalse(state in lines.mapped('state'), state) + lines = self.env['contract.line'].search([('state', 'in', states)]) self.assertEqual(set(lines.mapped('state')), set(states)) - lines = self.env['contract.line'].search( - [('state', 'in', [])] - ) + lines = self.env['contract.line'].search([('state', 'in', [])]) self.assertFalse(lines.mapped('state')) with self.assertRaises(TypeError): - self.env['contract.line'].search( - [('state', 'in', 'upcoming')] - ) - lines = self.env['contract.line'].search( - [('state', 'not in', [])] - ) + self.env['contract.line'].search([('state', 'in', 'upcoming')]) + lines = self.env['contract.line'].search([('state', 'not in', [])]) self.assertEqual(set(lines.mapped('state')), set(states)) - lines = self.env['contract.line'].search( - [('state', 'not in', states)] - ) + lines = self.env['contract.line'].search([('state', 'not in', states)]) self.assertFalse(lines.mapped('state')) - lines = self.env['contract.line'].search( - [('state', 'not in', ['upcoming', 'in-progress'])] - ) - self.assertEqual( - set(lines.mapped('state')), - set(['to-renew', 'upcoming-close', 'closed', 'canceled']), - ) + state2 = ['upcoming', 'in-progress'] + lines = self.env['contract.line'].search([('state', 'not in', state2)]) + self.assertEqual(set(lines.mapped('state')), set(states) - set(state2)) def test_check_auto_renew_contract_line_with_successor(self): """ @@ -2331,6 +2337,12 @@ class TestContract(TestContractBase): ) self.assertFalse(self.acct_line.create_invoice_visibility) self.assertFalse(self.contract.create_invoice_visibility) + section = self.env['contract.line'].create({ + "contract_id": self.contract.id, + "display_type": "line_section", + "name": "Test section", + }) + self.assertFalse(section.create_invoice_visibility) def test_invoice_contract_without_lines(self): self.contract.contract_line_ids.cancel()