diff --git a/addons/payment_ogone/controllers/main.py b/addons/payment_ogone/controllers/main.py index 3137f619d2d..b17198cfe40 100644 --- a/addons/payment_ogone/controllers/main.py +++ b/addons/payment_ogone/controllers/main.py @@ -3,9 +3,9 @@ import logging import pprint import werkzeug -from openerp import http, SUPERUSER_ID -from openerp.http import request -from openerp.addons.payment.models.payment_acquirer import ValidationError +from odoo import http +from odoo.http import request +from odoo.addons.payment.models.payment_acquirer import ValidationError _logger = logging.getLogger(__name__) @@ -25,33 +25,24 @@ class OgoneController(http.Controller): def ogone_form_feedback(self, **post): """ Ogone contacts using GET, at least for accept """ _logger.info('Ogone: entering form_feedback with post data %s', pprint.pformat(post)) # debug - cr, uid, context = request.cr, SUPERUSER_ID, request.context - request.registry['payment.transaction'].form_feedback(cr, uid, post, 'ogone', context=context) + request.env['payment.transaction'].sudo().form_feedback(post, 'ogone') return werkzeug.utils.redirect(post.pop('return_url', '/')) @http.route(['/payment/ogone/s2s/create_json'], type='json', auth='public', csrf=False) def ogone_s2s_create_json(self, **kwargs): - data = kwargs - acquirer_id = int(data.get('acquirer_id')) - acquirer = request.env['payment.acquirer'].browse(acquirer_id) - new_id = acquirer.s2s_process(data) + new_id = request.env['payment.acquirer'].browse(int(kwargs.get('acquirer_id'))).s2s_process(kwargs) return new_id @http.route(['/payment/ogone/s2s/create'], type='http', auth='public', methods=["POST"], csrf=False) def ogone_s2s_create(self, **post): - acquirer_id = int(post.get('acquirer_id')) - acquirer = request.env['payment.acquirer'].browse(acquirer_id) - acquirer.s2s_process(post) + request.env['payment.acquirer'].browse(int(post.get('acquirer_id'))).s2s_process(post) return werkzeug.utils.redirect(post.get('return_url', '/')) @http.route(['/payment/ogone/s2s/feedback'], auth='none', csrf=False) def feedback(self, **kwargs): - cr, uid, context = request.cr, SUPERUSER_ID, request.context - payment = request.registry.get('payment.transaction') try: - tx = payment._ogone_form_get_tx_from_data(cr, uid, kwargs, context=context) - payment._ogone_s2s_validate(tx) + tx = request.env['payment.transaction']._ogone_form_get_tx_from_data(kwargs) + tx._ogone_s2s_validate() except ValidationError: return 'ko' - return 'ok' diff --git a/addons/payment_ogone/data/payment_acquirer_data.xml b/addons/payment_ogone/data/payment_acquirer_data.xml index 308d13e70b9..a78ea78107a 100644 --- a/addons/payment_ogone/data/payment_acquirer_data.xml +++ b/addons/payment_ogone/data/payment_acquirer_data.xml @@ -1,5 +1,5 @@ - + @@ -20,4 +20,4 @@ - + diff --git a/addons/payment_ogone/models/payment.py b/addons/payment_ogone/models/payment.py index 54aee7f7f70..7e37479b5e6 100644 --- a/addons/payment_ogone/models/payment.py +++ b/addons/payment_ogone/models/payment.py @@ -1,39 +1,45 @@ # coding: utf-8 -import datetime from hashlib import sha1 -import logging from lxml import etree, objectify -from openerp.tools.translate import _ from pprint import pformat -import time from unicodedata import normalize from urllib import urlencode + +import datetime +import logging +import time import urllib2 import urlparse -from openerp import SUPERUSER_ID -from openerp.addons.payment.models.payment_acquirer import ValidationError -from openerp.addons.payment_ogone.controllers.main import OgoneController -from openerp.addons.payment_ogone.data import ogone -from openerp.osv import osv, fields -from openerp.tools import float_round, DEFAULT_SERVER_DATE_FORMAT -from openerp.tools.float_utils import float_compare, float_repr -from openerp.tools.safe_eval import safe_eval +from odoo import api, fields, models, _ +from odoo.addons.payment.models.payment_acquirer import ValidationError +from odoo.addons.payment_ogone.controllers.main import OgoneController +from odoo.addons.payment_ogone.data import ogone +from odoo.tools import float_round, DEFAULT_SERVER_DATE_FORMAT +from odoo.tools.float_utils import float_compare, float_repr +from odoo.tools.safe_eval import safe_eval _logger = logging.getLogger(__name__) -class PaymentAcquirerOgone(osv.Model): +class PaymentAcquirerOgone(models.Model): _inherit = 'payment.acquirer' - def _get_ogone_urls(self, cr, uid, environment, context=None): + provider = fields.Selection(selection_add=[('ogone', 'Ogone')]) + ogone_pspid = fields.Char('PSPID', required_if_provider='ogone') + ogone_userid = fields.Char('API User ID', required_if_provider='ogone') + ogone_password = fields.Char('API User Password', required_if_provider='ogone') + ogone_shakey_in = fields.Char('SHA Key IN', size=32, required_if_provider='ogone') + ogone_shakey_out = fields.Char('SHA Key OUT', size=32, required_if_provider='ogone') + ogone_alias_usage = fields.Char('Alias Usage', help="""If you want to use Ogone Aliases, + this default Alias Usage will be presented to + the customer as the reason you want to + keep his payment data""") + + def _get_ogone_urls(self, environment): """ Ogone URLS: - - - standard order: POST address for form-based - - @TDETODO: complete me - """ + - standard order: POST address for form-based """ return { 'ogone_standard_order_url': 'https://secure.ogone.com/ncol/%s/orderstandard_utf8.asp' % (environment,), 'ogone_direct_order_url': 'https://secure.ogone.com/ncol/%s/orderdirect_utf8.asp' % (environment,), @@ -41,38 +47,19 @@ class PaymentAcquirerOgone(osv.Model): 'ogone_afu_agree_url': 'https://secure.ogone.com/ncol/%s/AFU_agree.asp' % (environment,), } - def _get_providers(self, cr, uid, context=None): - providers = super(PaymentAcquirerOgone, self)._get_providers(cr, uid, context=context) - providers.append(['ogone', 'Ogone']) - return providers - - _columns = { - 'ogone_pspid': fields.char('PSPID', required_if_provider='ogone'), - 'ogone_userid': fields.char('API User ID', required_if_provider='ogone'), - 'ogone_password': fields.char('API User Password', required_if_provider='ogone'), - 'ogone_shakey_in': fields.char('SHA Key IN', size=32, required_if_provider='ogone'), - 'ogone_shakey_out': fields.char('SHA Key OUT', size=32, required_if_provider='ogone'), - 'ogone_alias_usage': fields.char('Alias Usage', help="""If you want to use Ogone Aliases, - this default Alias Usage will be presented to - the customer as the reason you want to - keep his payment data""") - } - - def _ogone_generate_shasign(self, acquirer, inout, values): + def _ogone_generate_shasign(self, inout, values): """ Generate the shasign for incoming or outgoing communications. - :param browse acquirer: the payment.acquirer browse record. It should - have a shakey in shaky out - :param string inout: 'in' (openerp contacting ogone) or 'out' (ogone - contacting openerp). In this last case only some + :param string inout: 'in' (odoo contacting ogone) or 'out' (ogone + contacting odoo). In this last case only some fields should be contained (see e-Commerce basic) :param dict values: transaction values :return string: shasign """ assert inout in ('in', 'out') - assert acquirer.provider == 'ogone' - key = getattr(acquirer, 'ogone_shakey_' + inout) + assert self.provider == 'ogone' + key = getattr(self, 'ogone_shakey_' + inout) def filter_key(key): if inout == 'in': @@ -147,12 +134,11 @@ class PaymentAcquirerOgone(osv.Model): shasign = sha1(sign).hexdigest() return shasign - def ogone_form_generate_values(self, cr, uid, ids, values, context=None): - base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url') - acquirer = self.browse(cr, uid, ids, context=context)[0] + def ogone_form_generate_values(self, values): + base_url = self.env['ir.config_parameter'].get_param('web.base.url') ogone_tx_values = dict(values) temp_ogone_tx_values = { - 'PSPID': acquirer.ogone_pspid, + 'PSPID': self.ogone_pspid, 'ORDERID': values['reference'], 'AMOUNT': float_repr(float_round(values['amount'], 2) * 100, 0), 'CURRENCY': values['currency'] and values['currency'].name or '', @@ -173,20 +159,18 @@ class PaymentAcquirerOgone(osv.Model): if values.get('type') == 'form_save': temp_ogone_tx_values.update({ 'ALIAS': 'ODOO-NEW-ALIAS-%s' % time.time(), # something unique, - 'ALIASUSAGE': values.get('alias_usage') or acquirer.ogone_alias_usage, + 'ALIASUSAGE': values.get('alias_usage') or self.ogone_alias_usage, }) - shasign = self._ogone_generate_shasign(acquirer, 'in', temp_ogone_tx_values) + shasign = self._ogone_generate_shasign('in', temp_ogone_tx_values) temp_ogone_tx_values['SHASIGN'] = shasign ogone_tx_values.update(temp_ogone_tx_values) return ogone_tx_values - def ogone_get_form_action_url(self, cr, uid, ids, context=None): - acquirer = self.browse(cr, uid, ids, context=context)[0] - return self._get_ogone_urls(cr, uid, acquirer.environment, context=context)['ogone_standard_order_url'] + def ogone_get_form_action_url(self): + return self._get_ogone_urls(self.environment)['ogone_standard_order_url'] - def ogone_s2s_form_validate(self, cr, uid, ids, data, context=None): + def ogone_s2s_form_validate(self, data): error = dict() - error_message = [] mandatory_fields = ["cc_number", "cc_cvc", "cc_holder_name", "cc_expiry", "cc_brand"] # Validation @@ -196,7 +180,7 @@ class PaymentAcquirerOgone(osv.Model): return False if error else True - def ogone_s2s_form_process(self, cr, uid, data, context=None): + def ogone_s2s_form_process(self, data): values = { 'cc_number': data.get('cc_number'), 'cc_cvc': int(data.get('cc_cvc')), @@ -206,11 +190,11 @@ class PaymentAcquirerOgone(osv.Model): 'acquirer_id': int(data.get('acquirer_id')), 'partner_id': int(data.get('partner_id')) } - pm_id = self.pool['payment.token'].create(cr, SUPERUSER_ID, values, context=context) + pm_id = self.env['payment.token'].sudo().create(values) return pm_id -class PaymentTxOgone(osv.Model): +class PaymentTxOgone(models.Model): _inherit = 'payment.transaction' # ogone status _ogone_valid_tx_status = [5, 9] @@ -222,7 +206,8 @@ class PaymentTxOgone(osv.Model): # FORM RELATED METHODS # -------------------------------------------------- - def _ogone_form_get_tx_from_data(self, cr, uid, data, context=None): + @api.model + def _ogone_form_get_tx_from_data(self, data): """ Given a data dict coming from ogone, verify it and find the related transaction record. Create a payment token if an alias is returned.""" reference, pay_id, shasign, alias = data.get('orderID'), data.get('PAYID'), data.get('SHASIGN'), data.get('ALIAS') @@ -232,19 +217,18 @@ class PaymentTxOgone(osv.Model): raise ValidationError(error_msg) # find tx -> @TDENOTE use paytid ? - tx_ids = self.search(cr, uid, [('reference', '=', reference)], context=context) - if not tx_ids or len(tx_ids) > 1: + tx = self.search([('reference', '=', reference)]) + if not tx or len(tx) > 1: error_msg = _('Ogone: received data for reference %s') % (reference) - if not tx_ids: + if not tx: error_msg += _('; no order found') else: error_msg += _('; multiple order found') _logger.info(error_msg) raise ValidationError(error_msg) - tx = self.pool['payment.transaction'].browse(cr, uid, tx_ids[0], context=context) # verify shasign - shasign_check = self.pool['payment.acquirer']._ogone_generate_shasign(tx.acquirer_id, 'out', data) + shasign_check = tx.acquirer_id._ogone_generate_shasign('out', data) if shasign_check.upper() != shasign.upper(): error_msg = _('Ogone: invalid shasign, received %s, computed %s, for data %s') % (shasign, shasign_check, data) _logger.info(error_msg) @@ -255,39 +239,36 @@ class PaymentTxOgone(osv.Model): # alias was created on ogone server, store it if alias: - method_obj = self.pool['payment.token'] + Method = self.env['payment.token'] domain = [('acquirer_ref', '=', alias)] cardholder = data.get('CN') - if not method_obj.search_count(cr, uid, domain, context=context): + if not Method.search_count(domain): _logger.info('Ogone: saving alias %s for partner %s' % (data.get('CARDNO'), tx.partner_id)) - ref = method_obj.create(cr, uid, {'name': data.get('CARDNO') + (' - ' + cardholder if cardholder else ''), - 'partner_id': tx.partner_id.id, - 'acquirer_id': tx.acquirer_id.id, - 'acquirer_ref': alias - }) + ref = Method.create({'name': data.get('CARDNO') + (' - ' + cardholder if cardholder else ''), + 'partner_id': tx.partner_id.id, + 'acquirer_id': tx.acquirer_id.id, + 'acquirer_ref': alias}) tx.write({'payment_token_id': ref}) return tx - def _ogone_form_get_invalid_parameters(self, cr, uid, ids, data, context=None): - tx = self.browse(cr, uid, ids, context=context)[0] + def _ogone_form_get_invalid_parameters(self, data): invalid_parameters = [] # TODO: txn_id: should be false at draft, set afterwards, and verified with txn details - if tx.acquirer_reference and data.get('PAYID') != tx.acquirer_reference: - invalid_parameters.append(('PAYID', data.get('PAYID'), tx.acquirer_reference)) + if self.acquirer_reference and data.get('PAYID') != self.acquirer_reference: + invalid_parameters.append(('PAYID', data.get('PAYID'), self.acquirer_reference)) # check what is bought - 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)) + if float_compare(float(data.get('amount', '0.0')), self.amount, 2) != 0: + invalid_parameters.append(('amount', data.get('amount'), '%.2f' % self.amount)) + if data.get('currency') != self.currency_id.name: + invalid_parameters.append(('currency', data.get('currency'), self.currency_id.name)) return invalid_parameters - def _ogone_form_validate(self, cr, uid, ids, data, context=None): - tx = self.browse(cr, uid, ids, context=context)[0] - if tx.state == 'done': - _logger.info('Ogone: trying to validate an already validated tx (ref %s)', tx.reference) + def _ogone_form_validate(self, data): + if self.state == 'done': + _logger.info('Ogone: trying to validate an already validated tx (ref %s)', self.reference) return True status = int(data.get('STATUS', '0')) @@ -297,25 +278,25 @@ class PaymentTxOgone(osv.Model): 'date_validate': datetime.datetime.strptime(data['TRXDATE'], '%m/%d/%y').strftime(DEFAULT_SERVER_DATE_FORMAT), 'acquirer_reference': data['PAYID'], } - if data.get('ALIAS') and tx.partner_id and tx.type == 'form_save' and not tx.payment_token_id: - pm_id = self.pool['payment.token'].create(cr, uid, { - 'partner_id': tx.partner_id.id, - 'acquirer_id': tx.acquirer_id.id, + if data.get('ALIAS') and self.partner_id and self.type == 'form_save' and not self.payment_token_id: + pm = self.env['payment.token'].create({ + 'partner_id': self.partner_id.id, + 'acquirer_id': self.acquirer_id.id, 'acquirer_ref': data.get('ALIAS'), 'name': '%s - %s' % (data.get('CARDNO'), data.get('CN')) - }, context=context) - vals.update(payment_token_id=pm_id) - tx.write(vals) - if tx.callback_eval: - safe_eval(tx.callback_eval, {'self': tx}) + }) + vals.update(payment_token_id=pm.id) + self.write(vals) + if self.callback_eval: + safe_eval(self.callback_eval, {'self': self}) return True elif status in self._ogone_cancel_tx_status: - tx.write({ + self.write({ 'state': 'cancel', 'acquirer_reference': data.get('PAYID'), }) elif status in self._ogone_pending_tx_status or status in self._ogone_wait_tx_status: - tx.write({ + self.write({ 'state': 'pending', 'acquirer_reference': data.get('PAYID'), }) @@ -326,7 +307,7 @@ class PaymentTxOgone(osv.Model): 'error_msg': ogone.OGONE_ERROR_MAP.get(data.get('NCERROR')), } _logger.info(error) - tx.write({ + self.write({ 'state': 'error', 'state_message': error, 'acquirer_reference': data.get('PAYID'), @@ -336,29 +317,29 @@ class PaymentTxOgone(osv.Model): # -------------------------------------------------- # S2S RELATED METHODS # -------------------------------------------------- - def ogone_s2s_do_transaction(self, cr, uid, ids, context=None, **kwargs): + + def ogone_s2s_do_transaction(self, **kwargs): # TODO: create tx with s2s type - tx = self.browse(cr, uid, ids, context=context)[0] - account = tx.acquirer_id - reference = tx.reference or "ODOO-%s-%s" % (datetime.datetime.now().strftime('%y%m%d_%H%M%S'), tx.partner_id.id) + account = self.acquirer_id + reference = self.reference or "ODOO-%s-%s" % (datetime.datetime.now().strftime('%y%m%d_%H%M%S'), self.partner_id.id) data = { 'PSPID': account.ogone_pspid, 'USERID': account.ogone_userid, 'PSWD': account.ogone_password, 'ORDERID': reference, - 'AMOUNT': long(tx.amount * 100), - 'CURRENCY': tx.currency_id.name, + 'AMOUNT': long(self.amount * 100), + 'CURRENCY': self.currency_id.name, 'OPERATION': 'SAL', 'ECI': 2, # Recurring (from MOTO) - 'ALIAS': tx.payment_token_id.acquirer_ref, + 'ALIAS': self.payment_token_id.acquirer_ref, 'RTIMEOUT': 30, } if kwargs.get('3d_secure'): data.update({ 'FLAG3D': 'Y', - 'LANGUAGE': tx.partner_id.lang or 'en_US', + 'LANGUAGE': self.partner_id.lang or 'en_US', }) for url in 'accept decline exception'.split(): @@ -368,9 +349,9 @@ class PaymentTxOgone(osv.Model): key = '{0}URL'.format(url).upper() data[key] = val - data['SHASIGN'] = self.pool['payment.acquirer']._ogone_generate_shasign(tx.acquirer_id, 'in', data) + data['SHASIGN'] = self.acquirer_id._ogone_generate_shasign('in', data) - direct_order_url = 'https://secure.ogone.com/ncol/%s/orderdirect.asp' % (tx.acquirer_id.environment) + direct_order_url = 'https://secure.ogone.com/ncol/%s/orderdirect.asp' % (self.acquirer_id.environment) _logger.debug("Ogone data %s", pformat(data)) request = urllib2.Request(direct_order_url, urlencode(data)) @@ -384,53 +365,51 @@ class PaymentTxOgone(osv.Model): _logger.exception('Invalid xml response from ogone') raise - return self._ogone_s2s_validate_tree(tx, tree) + return self._ogone_s2s_validate_tree(tree) - def _ogone_s2s_validate(self, cr, uid, ids, context=None): - tx = self.browse(cr, uid, ids, context=context)[0] - tree = self._ogone_s2s_get_tx_status(tx) - return self._ogone_s2s_validate_tree(tx, tree) + def _ogone_s2s_validate(self): + tree = self._ogone_s2s_get_tx_status() + return self._ogone_s2s_validate_tree(tree) - def _ogone_s2s_validate_tree(self, cr, uid, ids, tree, tries=2, context=None): - tx = self.browse(cr, uid, ids, context=context)[0] - if tx.state not in ('draft', 'pending'): - _logger.info('Ogone: trying to validate an already validated tx (ref %s)', tx.reference) + def _ogone_s2s_validate_tree(self, tree, tries=2): + if self.state not in ('draft', 'pending'): + _logger.info('Ogone: trying to validate an already validated tx (ref %s)', self.reference) return True status = int(tree.get('STATUS') or 0) if status in self._ogone_valid_tx_status: - tx.write({ + self.write({ 'state': 'done', 'date_validate': datetime.date.today().strftime(DEFAULT_SERVER_DATE_FORMAT), 'acquirer_reference': tree.get('PAYID'), }) - if tree.get('ALIAS') and tx.partner_id and tx.type == 'form_save' and not tx.payment_token_id: - pm = tx.env['payment.token'].create({ - 'partner_id': tx.partner_id.id, - 'acquirer_id': tx.acquirer_id.id, + if tree.get('ALIAS') and self.partner_id and self.type == 'form_save' and not self.payment_token_id: + pm = self.env['payment.token'].create({ + 'partner_id': self.partner_id.id, + 'acquirer_id': self.acquirer_id.id, 'acquirer_ref': tree.get('ALIAS'), 'name': tree.get('CARDNO'), }) - tx.write({'payment_token_id': pm.id}) - if tx.callback_eval: - safe_eval(tx.callback_eval, {'self': tx}) + self.write({'payment_token_id': pm.id}) + if self.callback_eval: + safe_eval(self.callback_eval, {'self': self}) return True elif status in self._ogone_cancel_tx_status: - tx.write({ + self.write({ 'state': 'cancel', 'acquirer_reference': tree.get('PAYID'), }) elif status in self._ogone_pending_tx_status: - tx.write({ + self.write({ 'state': 'pending', 'acquirer_reference': tree.get('PAYID'), 'html_3ds': str(tree.HTML_ANSWER).decode('base64') }) elif (not status or status in self._ogone_wait_tx_status) and tries > 0: time.sleep(500) - tx.write({'acquirer_reference': tree.get('PAYID')}) - tree = self._ogone_s2s_get_tx_status(tx) - return self._ogone_s2s_validate_tree(tx, tree, tries - 1) + self.write({'acquirer_reference': tree.get('PAYID')}) + tree = self._ogone_s2s_get_tx_status(self) + return self._ogone_s2s_validate_tree(self, tree, tries - 1) else: error = 'Ogone: feedback error: %(error_str)s\n\n%(error_code)s: %(error_msg)s' % { 'error_str': tree.get('NCERRORPLUS'), @@ -438,26 +417,25 @@ class PaymentTxOgone(osv.Model): 'error_msg': ogone.OGONE_ERROR_MAP.get(tree.get('NCERROR')), } _logger.info(error) - tx.write({ + self.write({ 'state': 'error', 'state_message': error, 'acquirer_reference': tree.get('PAYID'), }) return False - def _ogone_s2s_get_tx_status(self, cr, uid, ids, context=None): - tx = self.browse(cr, uid, ids, context=context)[0] - account = tx.acquirer_id + def _ogone_s2s_get_tx_status(self): + account = self.acquirer_id #reference = tx.reference or "ODOO-%s-%s" % (datetime.datetime.now().strftime('%Y%m%d_%H%M%S'), tx.partner_id.id) data = { - 'PAYID': tx.acquirer_reference, + 'PAYID': self.acquirer_reference, 'PSPID': account.ogone_pspid, 'USERID': account.ogone_userid, 'PSWD': account.ogone_password, } - query_direct_url = 'https://secure.ogone.com/ncol/%s/querydirect.asp' % (tx.acquirer_id.environment) + query_direct_url = 'https://secure.ogone.com/ncol/%s/querydirect.asp' % (self.acquirer_id.environment) _logger.debug("Ogone data %s", pformat(data)) request = urllib2.Request(query_direct_url, urlencode(data)) @@ -474,14 +452,14 @@ class PaymentTxOgone(osv.Model): return tree -class PaymentToken(osv.Model): +class PaymentToken(models.Model): _inherit = 'payment.token' - def ogone_create(self, cr, uid, values, context=None): + def ogone_create(self, values): if values.get('cc_number'): # create a alias via batch values['cc_number'] = values['cc_number'].replace(' ', '') - acquirer = self.pool['payment.acquirer'].browse(cr, uid, values['acquirer_id']) + acquirer = self.env['payment.acquirer'].browse(values['acquirer_id']) alias = 'ODOO-NEW-ALIAS-%s' % time.time() expiry = str(values['cc_expiry'][:2]) + str(values['cc_expiry'][-2:]) diff --git a/addons/payment_ogone/tests/test_ogone.py b/addons/payment_ogone/tests/test_ogone.py index 81f09873fa4..2651b00fefe 100644 --- a/addons/payment_ogone/tests/test_ogone.py +++ b/addons/payment_ogone/tests/test_ogone.py @@ -4,27 +4,23 @@ from lxml import objectify import time import urlparse -from openerp.addons.payment.models.payment_acquirer import ValidationError -from openerp.addons.payment.tests.common import PaymentAcquirerCommon -from openerp.addons.payment_ogone.controllers.main import OgoneController -from openerp.tools import mute_logger +from odoo.addons.payment.models.payment_acquirer import ValidationError +from odoo.addons.payment.tests.common import PaymentAcquirerCommon +from odoo.addons.payment_ogone.controllers.main import OgoneController +from odoo.tools import mute_logger class OgonePayment(PaymentAcquirerCommon): def setUp(self): super(OgonePayment, self).setUp() - cr, uid = self.cr, self.uid - self.base_url = self.registry('ir.config_parameter').get_param(cr, uid, 'web.base.url') - # get the adyen account - model, self.ogone_id = self.registry('ir.model.data').get_object_reference(cr, uid, 'payment', 'payment_acquirer_ogone') + self.ogone = self.env.ref('payment.payment_acquirer_ogone') def test_10_ogone_form_render(self): - cr, uid, context = self.cr, self.uid, {} + base_url = self.env['ir.config_parameter'].get_param('web.base.url') # be sure not to do stupid thing - ogone = self.payment_acquirer.browse(self.cr, self.uid, self.ogone_id, None) - self.assertEqual(ogone.environment, 'test', 'test without test environment') + self.assertEqual(self.ogone.environment, 'test', 'test without test environment') # ---------------------------------------- # Test: button direct rendering + shasign @@ -44,19 +40,17 @@ class OgonePayment(PaymentAcquirerCommon): 'OWNERTOWN': 'Sin City', 'OWNERTELNO': '0032 12 34 56 78', 'SHASIGN': '815f67b8ff70d234ffcf437c13a9fa7f807044cc', - 'ACCEPTURL': '%s' % urlparse.urljoin(self.base_url, OgoneController._accept_url), - 'DECLINEURL': '%s' % urlparse.urljoin(self.base_url, OgoneController._decline_url), - 'EXCEPTIONURL': '%s' % urlparse.urljoin(self.base_url, OgoneController._exception_url), - 'CANCELURL': '%s' % urlparse.urljoin(self.base_url, OgoneController._cancel_url), + 'ACCEPTURL': '%s' % urlparse.urljoin(base_url, OgoneController._accept_url), + 'DECLINEURL': '%s' % urlparse.urljoin(base_url, OgoneController._decline_url), + 'EXCEPTIONURL': '%s' % urlparse.urljoin(base_url, OgoneController._exception_url), + 'CANCELURL': '%s' % urlparse.urljoin(base_url, OgoneController._cancel_url), } # render the button - res = self.payment_acquirer.render( - cr, uid, self.ogone_id, - 'test_ref0', 0.01, self.currency_euro_id, + res = self.ogone.render( + 'test_ref0', 0.01, self.currency_euro.id, partner_id=None, - partner_values=self.buyer_values, - context=context) + partner_values=self.buyer_values) # check form result tree = objectify.fromstring(res) @@ -75,23 +69,18 @@ class OgonePayment(PaymentAcquirerCommon): # ---------------------------------------- # create a new draft tx - tx_id = self.payment_transaction.create( - cr, uid, { - 'amount': 0.01, - 'acquirer_id': self.ogone_id, - 'currency_id': self.currency_euro_id, - 'reference': 'test_ref0', - 'partner_id': self.buyer_id, - }, context=context - ) + tx = self.env['payment.transaction'].create({ + 'amount': 0.01, + 'acquirer_id': self.ogone.id, + 'currency_id': self.currency_euro.id, + 'reference': 'test_ref0', + 'partner_id': self.buyer_id}) # render the button - res = self.payment_acquirer.render( - cr, uid, self.ogone_id, + res = self.ogone.render( 'should_be_erased', 0.01, self.currency_euro, - tx_id=tx_id, + tx_id=tx.id, partner_id=None, - partner_values=self.buyer_values, - context=context) + partner_values=self.buyer_values) # check form result tree = objectify.fromstring(res) @@ -105,12 +94,10 @@ class OgonePayment(PaymentAcquirerCommon): 'ogone: wrong value for form input %s: received %s instead of %s' % (form_input.get('name'), form_input.get('value'), form_values[form_input.get('name')]) ) - @mute_logger('openerp.addons.payment_ogone.models.ogone', 'ValidationError') + @mute_logger('openerp.addons.payment_ogone.models.payment', 'ValidationError') def test_20_ogone_form_management(self): - cr, uid, context = self.cr, self.uid, {} # be sure not to do stupid thing - ogone = self.payment_acquirer.browse(self.cr, self.uid, self.ogone_id, None) - self.assertEqual(ogone.environment, 'test', 'test without test environment') + self.assertEqual(self.ogone.environment, 'test', 'test without test environment') # typical data posted by ogone after client has successfully paid ogone_post_data = { @@ -133,23 +120,19 @@ class OgonePayment(PaymentAcquirerCommon): # should raise error about unknown tx with self.assertRaises(ValidationError): - self.payment_transaction.ogone_form_feedback(cr, uid, ogone_post_data, context=context) + self.env['payment.transaction'].form_feedback(ogone_post_data) # create tx - tx_id = self.payment_transaction.create( - cr, uid, { - 'amount': 1.95, - 'acquirer_id': self.ogone_id, - 'currency_id': self.currency_euro_id, - 'reference': 'test_ref_2', - 'partner_name': 'Norbert Buyer', - 'partner_country_id': self.country_france_id, - }, context=context - ) + tx = self.env['payment.transaction'].create({ + 'amount': 1.95, + 'acquirer_id': self.ogone.id, + 'currency_id': self.currency_euro.id, + 'reference': 'test_ref_2', + 'partner_name': 'Norbert Buyer', + 'partner_country_id': self.country_france.id}) # validate it - self.payment_transaction.ogone_form_feedback(cr, uid, ogone_post_data, context=context) + tx.form_feedback(ogone_post_data) # check state - tx = self.payment_transaction.browse(cr, uid, tx_id, context=context) self.assertEqual(tx.state, 'done', 'ogone: validation did not put tx into done state') self.assertEqual(tx.ogone_payid, ogone_post_data.get('PAYID'), 'ogone: validation did not update tx payid') @@ -159,67 +142,39 @@ class OgonePayment(PaymentAcquirerCommon): # now ogone post is ok: try to modify the SHASIGN ogone_post_data['SHASIGN'] = 'a4c16bae286317b82edb49188d3399249a784691' with self.assertRaises(ValidationError): - self.payment_transaction.ogone_form_feedback(cr, uid, ogone_post_data, context=context) + tx.form_feedback(ogone_post_data) # simulate an error ogone_post_data['STATUS'] = 2 ogone_post_data['SHASIGN'] = 'a4c16bae286317b82edb49188d3399249a784691' - self.payment_transaction.ogone_form_feedback(cr, uid, ogone_post_data, context=context) + tx.form_feedback(ogone_post_data) # check state - tx = self.payment_transaction.browse(cr, uid, tx_id, context=context) self.assertEqual(tx.state, 'error', 'ogone: erroneous validation did not put tx into error state') def test_30_ogone_s2s(self): test_ref = 'test_ref_%.15f' % time.time() - cr, uid, context = self.cr, self.uid, {} # be sure not to do stupid thing - ogone = self.payment_acquirer.browse(self.cr, self.uid, self.ogone_id, None) - self.assertEqual(ogone.environment, 'test', 'test without test environment') + self.assertEqual(self.ogone.environment, 'test', 'test without test environment') # create a new draft tx - tx_id = self.payment_transaction.create( - cr, uid, { - 'amount': 0.01, - 'acquirer_id': self.ogone_id, - 'currency_id': self.currency_euro_id, - 'reference': test_ref, - 'partner_id': self.buyer_id, - 'type': 'server2server', - }, context=context - ) + tx = self.env['payment.transaction'].create({ + 'amount': 0.01, + 'acquirer_id': self.ogone.id, + 'currency_id': self.currency_euro.id, + 'reference': test_ref, + 'partner_id': self.buyer_id, + 'type': 'server2server', + }) # create an alias - res = self.payment_transaction.ogone_s2s_create_alias( - cr, uid, tx_id, { - 'expiry_date_mm': '01', - 'expiry_date_yy': '2015', - 'holder_name': 'Norbert Poilu', - 'number': '4000000000000002', - 'brand': 'VISA', - }, context=context) + res = tx.ogone_s2s_create_alias({ + 'expiry_date_mm': '01', + 'expiry_date_yy': '2015', + 'holder_name': 'Norbert Poilu', + 'number': '4000000000000002', + 'brand': 'VISA'}) # check an alias is set, containing at least OPENERP - tx = self.payment_transaction.browse(cr, uid, tx_id, context=context) self.assertIn('OPENERP', tx.partner_reference, 'ogone: wrong partner reference after creating an alias') - res = self.payment_transaction.ogone_s2s_execute(cr, uid, tx_id, {}, context=context) - # print res - - -# { -# 'orderID': u'reference', -# 'STATUS': u'9', -# 'CARDNO': u'XXXXXXXXXXXX0002', -# 'PAYID': u'24998692', -# 'CN': u'Norbert Poilu', -# 'NCERROR': u'0', -# 'TRXDATE': u'11/05/13', -# 'IP': u'85.201.233.72', -# 'BRAND': u'VISA', -# 'ACCEPTANCE': u'test123', -# 'currency': u'EUR', -# 'amount': u'1.95', -# 'SHASIGN': u'EFDC56879EF7DE72CCF4B397076B5C9A844CB0FA', -# 'ED': u'0314', -# 'PM': u'CreditCard' -# } + res = tx.ogone_s2s_execute({}) diff --git a/addons/payment_ogone/views/payment_ogone_templates.xml b/addons/payment_ogone/views/payment_ogone_templates.xml index 69ebe0d7e5f..8e9dd72c103 100644 --- a/addons/payment_ogone/views/payment_ogone_templates.xml +++ b/addons/payment_ogone/views/payment_ogone_templates.xml @@ -1,5 +1,5 @@ - + - + diff --git a/addons/payment_ogone/views/payment_views.xml b/addons/payment_ogone/views/payment_views.xml index 8efde9b908c..bffca767fbd 100644 --- a/addons/payment_ogone/views/payment_views.xml +++ b/addons/payment_ogone/views/payment_views.xml @@ -1,5 +1,5 @@ - + @@ -22,4 +22,4 @@ - +