From 9bca2bbaac656edf4ebee8e5bc9c4d7c4154367b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 20 Nov 2013 15:01:19 +0100 Subject: [PATCH] [IMP] payment_acquirer, payment_acquirer_transfer - payment_acquirer: added base method for form-based validation calling various model-dependant methods. [FIX] payment_acquirer: fixed tx values not given to form to render when having no custom method for a specific acquirer - payment_acquirer_transfer: added form validation, using the new acquirer method. Updated controllers. Updated generated form to include tx details. Fixed method for form_action_url taht was missing. bzr revid: tde@openerp.com-20131120140119-8zuvm2ypr5arvf5y --- .../models/payment_acquirer.py | 35 ++++++++++++++++- .../controllers/main.py | 4 +- .../models/payment_acquirer.py | 38 ++++++++++++++++++- .../views/transfer.xml | 22 +++++------ 4 files changed, 83 insertions(+), 16 deletions(-) diff --git a/addons/payment_acquirer/models/payment_acquirer.py b/addons/payment_acquirer/models/payment_acquirer.py index e488a53f8a5..3bbab95afe2 100644 --- a/addons/payment_acquirer/models/payment_acquirer.py +++ b/addons/payment_acquirer/models/payment_acquirer.py @@ -110,13 +110,14 @@ class PaymentAcquirer(osv.Model): acquirer = self.browse(cr, uid, id, context=context) method_name = '%s_form_generate_values' % (acquirer.name) - tx_values = {} if tx_id and hasattr(self.pool['payment.transaction'], method_name): method = getattr(self.pool['payment.transaction'], method_name) tx_values = method(cr, uid, tx_id, tx_custom_values, context=context) elif hasattr(self, method_name): method = getattr(self, method_name) tx_values = method(cr, uid, id, reference, amount, currency, partner_id, partner_values, tx_custom_values, context=context) + else: + tx_values = tx_custom_values qweb_context = { 'acquirer': acquirer, @@ -259,6 +260,38 @@ class PaymentTransaction(osv.Model): } return {'values': values} + # -------------------------------------------------- + # FORM RELATED METHODS + # -------------------------------------------------- + + def form_feedback(self, cr, uid, data, acquirer_name, context=None): + invalid_parameters, tx = None, None + + tx_find_method_name = '_%s_form_get_tx_from_data' % acquirer_name + if hasattr(self, tx_find_method_name): + tx = getattr(self, tx_find_method_name)(cr, uid, data, context=context) + + invalid_param_method_name = '_%s_form_get_invalid_parameters' % acquirer_name + if hasattr(self, invalid_param_method_name): + invalid_parameters = getattr(self, invalid_param_method_name)(cr, uid, tx, data, context=context) + + if invalid_parameters: + _error_message = '%s: incorrect tx data:\n' % (acquirer_name) + for item in invalid_parameters: + _error_message += '\t%s: received %s instead of %s\n' % (item[0], item[1], item[2]) + _logger.error(_error_message) + return False + + feedback_method_name = '_%s_form_validate' % acquirer_name + if hasattr(self, feedback_method_name): + return getattr(self, feedback_method_name)(cr, uid, tx, data, context=context) + + return True + + # -------------------------------------------------- + # SERVER2SERVER RELATED METHODS + # -------------------------------------------------- + def create_s2s(self, cr, uid, tx_values, cc_values, context=None): tx_id = self.create(cr, uid, tx_values, context=context) return tx_id diff --git a/addons/payment_acquirer_transfer/controllers/main.py b/addons/payment_acquirer_transfer/controllers/main.py index 711dcec8de2..7903084b1ab 100644 --- a/addons/payment_acquirer_transfer/controllers/main.py +++ b/addons/payment_acquirer_transfer/controllers/main.py @@ -16,7 +16,7 @@ class OgoneController(http.Controller): '/payment/transfer/feedback', ], type='http', auth='admin') def transfer_form_feedback(self, **post): - _logger.info('Transfer: entering form_feedback with post data %s', pprint.pformat(post)) # debug + _logger.info('entering form_feedback with post data %s', pprint.pformat(post)) # debug cr, uid, context = request.cr, request.uid, request.context - request.registry['payment.transaction'].transfer_form_feedback(cr, uid, post, context) + request.registry['payment.transaction'].form_feedback(cr, uid, post, 'transfer', context) return request.redirect(post.pop('return_url', '/')) diff --git a/addons/payment_acquirer_transfer/models/payment_acquirer.py b/addons/payment_acquirer_transfer/models/payment_acquirer.py index cbcded835b5..41a093b0203 100644 --- a/addons/payment_acquirer_transfer/models/payment_acquirer.py +++ b/addons/payment_acquirer_transfer/models/payment_acquirer.py @@ -1,8 +1,11 @@ # -*- coding: utf-'8' "-*-" +from openerp.addons.payment_acquirer.models.payment_acquirer import ValidationError from openerp.osv import osv +from openerp.tools.float_utils import float_compare import logging +import pprint _logger = logging.getLogger(__name__) @@ -10,9 +13,40 @@ _logger = logging.getLogger(__name__) class TransferPaymentAcquirer(osv.Model): _inherit = 'payment.acquirer' + def transfer_get_form_action_url(self, cr, uid, id, context=None): + return '/payment/transfer/feedback' + class TransferPaymentTransaction(osv.Model): _inherit = 'payment.transaction' - def transfer_form_feedback(self, cr, uid, data, context=None): - return True + def _transfer_form_get_tx_from_data(self, cr, uid, data, context=None): + reference, amount, currency_name = data.get('reference'), data.get('amount'), data.get('currency_name') + tx_ids = self.search( + cr, uid, [ + ('reference', '=', reference), + ], context=context) + + if not tx_ids or len(tx_ids) > 1: + error_msg = 'received data for reference %s' % (pprint.pformat(reference)) + if not tx_ids: + error_msg += '; no order found' + else: + error_msg += '; multiple order found' + _logger.error(error_msg) + raise ValidationError(error_msg) + + return self.browse(cr, uid, tx_ids[0], context=context) + + def _transfer_form_get_invalid_parameters(self, cr, uid, tx, data, context=None): + invalid_parameters = [] + + if float_compare(float(data.get('amount', '0.0')), tx.amount, 2) != 0: + invalid_parameters.append(('amount', data.get('amount'), '%.2f' % tx.amount)) + if data.get('currency') != tx.currency_id.name: + invalid_parameters.append(('currency', data.get('currency'), tx.currency_id.name)) + + return invalid_parameters + + def _transfer_form_validate(self, cr, uid, tx, data, context=None): + return tx.write({'state': 'pending'}) diff --git a/addons/payment_acquirer_transfer/views/transfer.xml b/addons/payment_acquirer_transfer/views/transfer.xml index 31cf85ee5a8..af5c6fcef0f 100644 --- a/addons/payment_acquirer_transfer/views/transfer.xml +++ b/addons/payment_acquirer_transfer/views/transfer.xml @@ -1,19 +1,19 @@ - + -