From c6690daeadaab46057d5408f4e0f30a56089e926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Thu, 25 Sep 2014 11:08:50 +0200 Subject: [PATCH 1/7] [IMP] refactor account_partner_required * extention points for policies * use constraints for readbility and robustness --- account_partner_required/account.py | 93 +++++++++++++++-------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/account_partner_required/account.py b/account_partner_required/account.py index 7d21b3fa3..9f9568768 100644 --- a/account_partner_required/account.py +++ b/account_partner_required/account.py @@ -27,12 +27,21 @@ from openerp.tools.translate import _ class account_account_type(orm.Model): _inherit = "account.account.type" + def _get_policies(self, cr, uid, context=None): + """This is the method to be inherited for adding policies""" + return [('optional', 'Optional'), + ('always', 'Always'), + ('never', 'Never')] + + def __get_policies(self, cr, uid, context=None): + """ Call method which can be inherited """ + return self._get_policies(cr, uid, context=context) + _columns = { 'partner_policy': fields.selection( - [('optional', 'Optional'), - ('always', 'Always'), - ('never', 'Never')], + __get_policies, 'Policy for partner field', + required=True, help="Set the policy for the partner field : if you select " "'Optional', the accountant is free to put a partner " "on an account move line with this type of account ; " @@ -50,47 +59,41 @@ class account_account_type(orm.Model): class account_move_line(orm.Model): _inherit = "account.move.line" - def check_partner_required(self, cr, uid, ids, vals, context=None): - if 'account_id' in vals or 'partner_id' in vals or \ - 'debit' in vals or 'credit' in vals: - if isinstance(ids, (int, long)): - ids = [ids] - for move_line in self.browse(cr, uid, ids, context): - if move_line.debit == 0 and move_line.credit == 0: - continue - policy = move_line.account_id.user_type.partner_policy - if policy == 'always' and not move_line.partner_id: - raise orm.except_orm(_('Error :'), - _("Partner policy is set to 'Always' " - "with account %s '%s' but the " - "partner is missing in the account " - "move line with label '%s'." % - (move_line.account_id.code, - move_line.account_id.name, - move_line.name))) - elif policy == 'never' and move_line.partner_id: - raise orm.except_orm(_('Error :'), - _("Partner policy is set to 'Never' " - "with account %s '%s' but the " - "account move line with label '%s' " - "has a partner '%s'." % - (move_line.account_id.code, - move_line.account_id.name, - move_line.name, - move_line.partner_id.name))) + def _get_partner_policy(self, cr, uid, account, context=None): + """ Extension point to obtain analytic policy for an account """ + return account.user_type.partner_policy - def create(self, cr, uid, vals, context=None, check=True): - line_id = super(account_move_line, self).create(cr, uid, vals, - context=context, - check=check) - self.check_partner_required(cr, uid, line_id, vals, context=context) - return line_id + def _check_partner_required_msg(self, cr, uid, ids, context=None): + for move_line in self.browse(cr, uid, ids, context): + if move_line.debit == 0 and move_line.credit == 0: + continue + policy = self._get_partner_policy(cr, uid, + move_line.account_id, + context=context) + if policy == 'always' and not move_line.partner_id: + return _("Partner policy is set to 'Always' " + "with account %s '%s' but the " + "partner is missing in the account " + "move line with label '%s'." % + (move_line.account_id.code, + move_line.account_id.name, + move_line.name)) + elif policy == 'never' and move_line.partner_id: + return _("Partner policy is set to 'Never' " + "with account %s '%s' but the " + "account move line with label '%s' " + "has a partner '%s'." % + (move_line.account_id.code, + move_line.account_id.name, + move_line.name, + move_line.partner_id.name)) - def write(self, cr, uid, ids, vals, context=None, check=True, - update_check=True): - res = super(account_move_line, self).write(cr, uid, ids, vals, - context=context, - check=check, - update_check=update_check) - self.check_partner_required(cr, uid, ids, vals, context=context) - return res + def _check_partner_required(self, cr, uid, ids, context=None): + return not self._check_partner_required_msg(cr, uid, ids, + context=context) + + _constraints = [ + (_check_partner_required, + _check_partner_required_msg, + ['partner_id']), + ] From f93c14a197ccc1ab3b1eb6940fcd3e076ed80c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Thu, 25 Sep 2014 11:17:07 +0200 Subject: [PATCH 2/7] [IMP] account_partner_required: make test use [ids] for write Some other modules such as account_constraints require it. --- .../tests/test_account_partner_required.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/account_partner_required/tests/test_account_partner_required.py b/account_partner_required/tests/test_account_partner_required.py index a9134537e..e66e7a68a 100644 --- a/account_partner_required/tests/test_account_partner_required.py +++ b/account_partner_required/tests/test_account_partner_required.py @@ -109,7 +109,7 @@ class test_account_partner_required(common.TransactionCase): self._set_partner_policy('always') line_id = self._create_move(with_partner=True) with self.assertRaises(orm.except_orm): - self.move_line_obj.write(self.cr, self.uid, line_id, + self.move_line_obj.write(self.cr, self.uid, [line_id], {'partner_id': False}) def test_change_account(self): @@ -117,13 +117,13 @@ class test_account_partner_required(common.TransactionCase): line_id = self._create_move(with_partner=False) # change account to a_pay with policy always but missing partner with self.assertRaises(orm.except_orm): - self.move_line_obj.write(self.cr, self.uid, line_id, + self.move_line_obj.write(self.cr, self.uid, [line_id], {'account_id': self.ref('account.a_pay')}) # change account to a_pay with policy always with partner -> ok self.move_line_obj.write( self.cr, self.uid, - line_id, + [line_id], { 'account_id': self.ref('account.a_pay'), 'partner_id': self.ref('base.res_partner_1') From 007c98bacd1f26e2bc31f4a0dc1028b4911e80ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Thu, 25 Sep 2014 11:23:38 +0200 Subject: [PATCH 3/7] [IMP] .travis.yml account_partner_required test now works around account_constraints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Therefore we can lighten the EXCLUDE/INCLUDE dance. Signed-off-by: Stéphane Bidoul --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9ae927a04..0d27c4680 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,14 +6,12 @@ python: - "2.7" env: - - VERSION="7.0" ODOO_REPO="odoo/odoo" EXCLUDE="account_constraints,account_partner_required,async_move_line_importer,account_move_validation_improvement,account_default_draft_move,account_move_batch_validate" + - VERSION="7.0" ODOO_REPO="odoo/odoo" EXCLUDE="account_constraints,async_move_line_importer,account_move_validation_improvement,account_default_draft_move,account_move_batch_validate" - VERSION="7.0" ODOO_REPO="odoo/odoo" INCLUDE="account_constraints,account_move_validation_improvement,account_default_draft_move,account_move_batch_validate" - - VERSION="7.0" ODOO_REPO="odoo/odoo" INCLUDE="account_partner_required" - VERSION="7.0" ODOO_REPO="odoo/odoo" INCLUDE="async_move_line_importer" - - VERSION="7.0" ODOO_REPO="OCA/OCB" EXCLUDE="account_constraints, account_partner_required,async_move_line_importer,account_move_validation_improvement,account_default_draft_move,account_move_batch_validate" + - VERSION="7.0" ODOO_REPO="OCA/OCB" EXCLUDE="account_constraints, async_move_line_importer,account_move_validation_improvement,account_default_draft_move,account_move_batch_validate" - VERSION="7.0" ODOO_REPO="OCA/OCB" INCLUDE="account_constraints,account_move_validation_improvement,account_default_draft_move,account_move_batch_validate" - - VERSION="7.0" ODOO_REPO="OCA/OCB" INCLUDE="account_partner_required" - VERSION="7.0" ODOO_REPO="OCA/OCB" INCLUDE="async_move_line_importer" virtualenv: From f024fdd5c6133bdbee79c5fd08c37ced7a2ce725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sat, 25 Oct 2014 17:09:44 +0200 Subject: [PATCH 4/7] [FIX] account_partner_required: constraint depends on account_id --- account_partner_required/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_partner_required/account.py b/account_partner_required/account.py index 9f9568768..d888ebbd6 100644 --- a/account_partner_required/account.py +++ b/account_partner_required/account.py @@ -95,5 +95,5 @@ class account_move_line(orm.Model): _constraints = [ (_check_partner_required, _check_partner_required_msg, - ['partner_id']), + ['partner_id', 'account_id']), ] From 95178c08c6a72a89fb6db85d7b12271a86e0e0fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sat, 25 Oct 2014 17:22:22 +0200 Subject: [PATCH 5/7] [FIX] pep8 --- account_partner_required/account.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/account_partner_required/account.py b/account_partner_required/account.py index d888ebbd6..941dbf505 100644 --- a/account_partner_required/account.py +++ b/account_partner_required/account.py @@ -75,18 +75,18 @@ class account_move_line(orm.Model): "with account %s '%s' but the " "partner is missing in the account " "move line with label '%s'." % - (move_line.account_id.code, - move_line.account_id.name, - move_line.name)) + (move_line.account_id.code, + move_line.account_id.name, + move_line.name)) elif policy == 'never' and move_line.partner_id: return _("Partner policy is set to 'Never' " "with account %s '%s' but the " "account move line with label '%s' " "has a partner '%s'." % - (move_line.account_id.code, - move_line.account_id.name, - move_line.name, - move_line.partner_id.name)) + (move_line.account_id.code, + move_line.account_id.name, + move_line.name, + move_line.partner_id.name)) def _check_partner_required(self, cr, uid, ids, context=None): return not self._check_partner_required_msg(cr, uid, ids, From 4b3fcfb3e23414eabc368fc80b209ab6a5fbcb9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sat, 25 Oct 2014 17:22:53 +0200 Subject: [PATCH 6/7] [FIX] account_partner_required: constraint also depends on debit and credit --- account_partner_required/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_partner_required/account.py b/account_partner_required/account.py index 941dbf505..d7f7aadbb 100644 --- a/account_partner_required/account.py +++ b/account_partner_required/account.py @@ -95,5 +95,5 @@ class account_move_line(orm.Model): _constraints = [ (_check_partner_required, _check_partner_required_msg, - ['partner_id', 'account_id']), + ['partner_id', 'account_id', 'debit', 'credit']), ] From 0ec932265484fa5d3d87aa8757ea0d9a818e1469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Wed, 29 Oct 2014 15:39:04 +0100 Subject: [PATCH 7/7] [FIX] account_partner_required: make policies translatable --- account_partner_required/account.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/account_partner_required/account.py b/account_partner_required/account.py index d7f7aadbb..92af74fa0 100644 --- a/account_partner_required/account.py +++ b/account_partner_required/account.py @@ -29,17 +29,13 @@ class account_account_type(orm.Model): def _get_policies(self, cr, uid, context=None): """This is the method to be inherited for adding policies""" - return [('optional', 'Optional'), - ('always', 'Always'), - ('never', 'Never')] - - def __get_policies(self, cr, uid, context=None): - """ Call method which can be inherited """ - return self._get_policies(cr, uid, context=context) + return [('optional', _('Optional')), + ('always', _('Always')), + ('never', _('Never'))] _columns = { 'partner_policy': fields.selection( - __get_policies, + lambda self, *args, **kwargs: self._get_policies(*args, **kwargs), 'Policy for partner field', required=True, help="Set the policy for the partner field : if you select "