From da08af927afbcaa58442c5bfb9b5916d07d007b9 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Fri, 18 Jul 2014 11:05:29 +0200 Subject: [PATCH 1/5] The history does not store the reconciled entries Because the new reconciliations are committed in a different transaction than the one used to create the history. Move the new cursor initialization to the outer method 'run_reconcile()' so everything is enclosed in the same transaction. --- account_advanced_reconcile/__init__.py | 1 - account_advanced_reconcile/__openerp__.py | 2 +- .../base_advanced_reconciliation.py | 32 +------- account_easy_reconcile/__init__.py | 1 + account_easy_reconcile/__openerp__.py | 4 +- account_easy_reconcile/easy_reconcile.py | 78 ++++++++++++------- .../res_config.py | 0 .../res_config_view.xml | 0 8 files changed, 58 insertions(+), 60 deletions(-) rename {account_advanced_reconcile => account_easy_reconcile}/res_config.py (100%) rename {account_advanced_reconcile => account_easy_reconcile}/res_config_view.xml (100%) diff --git a/account_advanced_reconcile/__init__.py b/account_advanced_reconcile/__init__.py index af0e2c47..5ee0093a 100644 --- a/account_advanced_reconcile/__init__.py +++ b/account_advanced_reconcile/__init__.py @@ -23,4 +23,3 @@ import easy_reconcile import base_advanced_reconciliation import advanced_reconciliation -import res_config # noqa diff --git a/account_advanced_reconcile/__openerp__.py b/account_advanced_reconcile/__openerp__.py index 5c45353c..6d448319 100644 --- a/account_advanced_reconcile/__openerp__.py +++ b/account_advanced_reconcile/__openerp__.py @@ -75,7 +75,7 @@ many offices. """, 'website': 'http://www.camptocamp.com', 'data': ['easy_reconcile_view.xml', - 'res_config_view.xml'], + ], 'test': [], 'images': [], 'installable': True, diff --git a/account_advanced_reconcile/base_advanced_reconciliation.py b/account_advanced_reconcile/base_advanced_reconciliation.py index e6f8ced9..50a8b3d6 100644 --- a/account_advanced_reconcile/base_advanced_reconciliation.py +++ b/account_advanced_reconcile/base_advanced_reconciliation.py @@ -23,11 +23,6 @@ import logging from itertools import product from openerp.osv import orm -from openerp import pooler -from openerp.tools.translate import _ - - -_logger = logging.getLogger(__name__) class easy_reconcile_advanced(orm.AbstractModel): @@ -222,29 +217,10 @@ class easy_reconcile_advanced(orm.AbstractModel): cr, uid, rec, move_line, op, matchers, context=context)] def _action_rec(self, cr, uid, rec, context=None): - # we use a new cursor to be able to commit the reconciliation - # often. We have to create it here and not later to avoid problems - # where the new cursor sees the lines as reconciles but the old one - # does not. - if context is None: - context = {} - ctx = context.copy() - ctx['commit_every'] = ( - rec.journal_id.company_id.reconciliation_commit_every - ) - if ctx['commit_every']: - new_cr = pooler.get_db(cr.dbname).cursor() - else: - new_cr = cr - try: - credit_lines = self._query_credit(new_cr, uid, rec, context=ctx) - debit_lines = self._query_debit(new_cr, uid, rec, context=ctx) - result = self._rec_auto_lines_advanced( - new_cr, uid, rec, credit_lines, debit_lines, context=ctx) - finally: - if ctx['commit_every']: - new_cr.commit() - new_cr.close() + credit_lines = self._query_credit(cr, uid, rec, context=context) + debit_lines = self._query_debit(cr, uid, rec, context=context) + result = self._rec_auto_lines_advanced( + cr, uid, rec, credit_lines, debit_lines, context=context) return result def _skip_line(self, cr, uid, rec, move_line, context=None): diff --git a/account_easy_reconcile/__init__.py b/account_easy_reconcile/__init__.py index b648751f..2b9e5980 100755 --- a/account_easy_reconcile/__init__.py +++ b/account_easy_reconcile/__init__.py @@ -23,3 +23,4 @@ import easy_reconcile import base_reconciliation import simple_reconciliation import easy_reconcile_history +import res_config # noqa diff --git a/account_easy_reconcile/__openerp__.py b/account_easy_reconcile/__openerp__.py index a53662c5..198fcf30 100755 --- a/account_easy_reconcile/__openerp__.py +++ b/account_easy_reconcile/__openerp__.py @@ -58,7 +58,9 @@ allows multiple lines and partial. "data": ["easy_reconcile.xml", "easy_reconcile_history_view.xml", "security/ir_rule.xml", - "security/ir.model.access.csv"], + "security/ir.model.access.csv", + "res_config_view.xml", + ], 'license': 'AGPL-3', "auto_install": False, "installable": True, diff --git a/account_easy_reconcile/easy_reconcile.py b/account_easy_reconcile/easy_reconcile.py index 99ed960f..b7570e55 100644 --- a/account_easy_reconcile/easy_reconcile.py +++ b/account_easy_reconcile/easy_reconcile.py @@ -21,6 +21,7 @@ from openerp.osv import fields, orm from openerp.tools.translate import _ +from openerp import pooler class EasyReconcileOptions(orm.AbstractModel): @@ -208,7 +209,7 @@ class AccountEasyReconcile(orm.Model): 'filter': rec_method.filter} def run_reconcile(self, cr, uid, ids, context=None): - def find_reconcile_ids(fieldname, move_line_ids): + def find_reconcile_ids(cr, fieldname, move_line_ids): if not move_line_ids: return [] sql = ("SELECT DISTINCT " + fieldname + @@ -219,37 +220,56 @@ class AccountEasyReconcile(orm.Model): res = cr.fetchall() return [row[0] for row in res] + # we use a new cursor to be able to commit the reconciliation + # often. We have to create it here and not later to avoid problems + # where the new cursor sees the lines as reconciles but the old one + # does not. + if context is None: + context = {} + for rec in self.browse(cr, uid, ids, context=context): - all_ml_rec_ids = [] - all_ml_partial_ids = [] + ctx = context.copy() + ctx['commit_every'] = ( + rec.account.company_id.reconciliation_commit_every + ) + if ctx['commit_every']: + new_cr = pooler.get_db(cr.dbname).cursor() + else: + new_cr = cr + try: + all_ml_rec_ids = [] + all_ml_partial_ids = [] - for method in rec.reconcile_method: - rec_model = self.pool.get(method.name) - auto_rec_id = rec_model.create( - cr, uid, - self._prepare_run_transient( - cr, uid, method, context=context), + for method in rec.reconcile_method: + rec_model = self.pool.get(method.name) + auto_rec_id = rec_model.create( + new_cr, uid, + self._prepare_run_transient( + new_cr, uid, method, context=context), + context=context) + + ml_rec_ids, ml_partial_ids = rec_model.automatic_reconcile( + new_cr, uid, auto_rec_id, context=ctx) + + all_ml_rec_ids += ml_rec_ids + all_ml_partial_ids += ml_partial_ids + + reconcile_ids = find_reconcile_ids( + new_cr, 'reconcile_id', all_ml_rec_ids) + partial_ids = find_reconcile_ids( + new_cr, 'reconcile_partial_id', all_ml_partial_ids) + + self.pool.get('easy.reconcile.history').create( + new_cr, uid, + {'easy_reconcile_id': rec.id, + 'date': fields.datetime.now(), + 'reconcile_ids': [(4, rid) for rid in reconcile_ids], + 'reconcile_partial_ids': [(4, rid) for rid in partial_ids]}, context=context) - - ml_rec_ids, ml_partial_ids = rec_model.automatic_reconcile( - cr, uid, auto_rec_id, context=context) - - all_ml_rec_ids += ml_rec_ids - all_ml_partial_ids += ml_partial_ids - - reconcile_ids = find_reconcile_ids( - 'reconcile_id', all_ml_rec_ids) - partial_ids = find_reconcile_ids( - 'reconcile_partial_id', all_ml_partial_ids) - - self.pool.get('easy.reconcile.history').create( - cr, - uid, - {'easy_reconcile_id': rec.id, - 'date': fields.datetime.now(), - 'reconcile_ids': [(4, rid) for rid in reconcile_ids], - 'reconcile_partial_ids': [(4, rid) for rid in partial_ids]}, - context=context) + finally: + if ctx['commit_every']: + new_cr.commit() + new_cr.close() return True def _no_history(self, cr, uid, rec, context=None): diff --git a/account_advanced_reconcile/res_config.py b/account_easy_reconcile/res_config.py similarity index 100% rename from account_advanced_reconcile/res_config.py rename to account_easy_reconcile/res_config.py diff --git a/account_advanced_reconcile/res_config_view.xml b/account_easy_reconcile/res_config_view.xml similarity index 100% rename from account_advanced_reconcile/res_config_view.xml rename to account_easy_reconcile/res_config_view.xml From e2c05c68512d6efcfcb8050fd98a668284a8ed3f Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Thu, 31 Jul 2014 13:14:34 +0200 Subject: [PATCH 2/5] remove useless noqa --- account_easy_reconcile/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_easy_reconcile/__init__.py b/account_easy_reconcile/__init__.py index 2b9e5980..87ea0fc3 100755 --- a/account_easy_reconcile/__init__.py +++ b/account_easy_reconcile/__init__.py @@ -23,4 +23,4 @@ import easy_reconcile import base_reconciliation import simple_reconciliation import easy_reconcile_history -import res_config # noqa +import res_config From 9c543fc06f7174808bdf78a1ee8514d0c17274b3 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Fri, 22 Aug 2014 16:41:06 +0200 Subject: [PATCH 3/5] Missing declaration of _logger and _ --- account_advanced_reconcile/base_advanced_reconciliation.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/account_advanced_reconcile/base_advanced_reconciliation.py b/account_advanced_reconcile/base_advanced_reconciliation.py index 50a8b3d6..46d3fa6f 100644 --- a/account_advanced_reconcile/base_advanced_reconciliation.py +++ b/account_advanced_reconcile/base_advanced_reconciliation.py @@ -23,6 +23,9 @@ import logging from itertools import product from openerp.osv import orm +from openerp.tools.translate import _ + +_logger = logging.getLogger(__name__) class easy_reconcile_advanced(orm.AbstractModel): From f8322fda1e7733fe2910c6f3ebf745f305732b6a Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Fri, 22 Aug 2014 16:57:19 +0200 Subject: [PATCH 4/5] Long line --- account_easy_reconcile/easy_reconcile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/account_easy_reconcile/easy_reconcile.py b/account_easy_reconcile/easy_reconcile.py index b7570e55..327b0bb5 100644 --- a/account_easy_reconcile/easy_reconcile.py +++ b/account_easy_reconcile/easy_reconcile.py @@ -264,7 +264,8 @@ class AccountEasyReconcile(orm.Model): {'easy_reconcile_id': rec.id, 'date': fields.datetime.now(), 'reconcile_ids': [(4, rid) for rid in reconcile_ids], - 'reconcile_partial_ids': [(4, rid) for rid in partial_ids]}, + 'reconcile_partial_ids': [(4, rid) for rid in partial_ids], + }, context=context) finally: if ctx['commit_every']: From 3ac15d6fb28c2cda15ab61d3eb2e967ff9289414 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Mon, 25 Aug 2014 10:23:44 +0200 Subject: [PATCH 5/5] pep8: E124 closing bracket does not match visual indentation --- account_easy_reconcile/easy_reconcile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_easy_reconcile/easy_reconcile.py b/account_easy_reconcile/easy_reconcile.py index 327b0bb5..78f7977b 100644 --- a/account_easy_reconcile/easy_reconcile.py +++ b/account_easy_reconcile/easy_reconcile.py @@ -265,7 +265,7 @@ class AccountEasyReconcile(orm.Model): 'date': fields.datetime.now(), 'reconcile_ids': [(4, rid) for rid in reconcile_ids], 'reconcile_partial_ids': [(4, rid) for rid in partial_ids], - }, + }, context=context) finally: if ctx['commit_every']: