summaryrefslogtreecommitdiff
path: root/addons/payment_adyen/models
diff options
context:
space:
mode:
authorThibault Delavallée <tde@openerp.com>2016-07-05 12:40:23 +0200
committerThibault Delavallée <tde@openerp.com>2016-07-06 15:10:45 +0200
commite05f4612ebbd758088bc31fd42d4b0ed2094d4fd (patch)
tree1a062110c3f2747d7294752d9f874f40f9ae6035 /addons/payment_adyen/models
parent622d0ae3fda460033943bcbb19df90079bc2f325 (diff)
[MIG] payment_adyen: new API
No functional change.
Diffstat (limited to 'addons/payment_adyen/models')
-rw-r--r--addons/payment_adyen/models/payment.py124
1 files changed, 55 insertions, 69 deletions
diff --git a/addons/payment_adyen/models/payment.py b/addons/payment_adyen/models/payment.py
index c06ae797b0b..edf19953bab 100644
--- a/addons/payment_adyen/models/payment.py
+++ b/addons/payment_adyen/models/payment.py
@@ -9,46 +9,35 @@ import hmac
import logging
import urlparse
-from openerp.addons.payment.models.payment_acquirer import ValidationError
-from openerp.addons.payment_adyen.controllers.main import AdyenController
-from openerp.osv import osv, fields
-from openerp.tools import float_round
-from openerp.tools.translate import _
+from odoo import api, fields, models, tools, _
+from odoo.addons.payment.models.payment_acquirer import ValidationError
+from odoo.addons.payment_adyen.controllers.main import AdyenController
_logger = logging.getLogger(__name__)
-class AcquirerAdyen(osv.Model):
+class AcquirerAdyen(models.Model):
_inherit = 'payment.acquirer'
- def _get_adyen_urls(self, cr, uid, environment, context=None):
- """ Adyen URLs
+ provider = fields.Selection(selection_add=[('adyen', 'Adyen')])
+ adyen_merchant_account = fields.Char('Merchant Account', required_if_provider='adyen')
+ adyen_skin_code = fields.Char('Skin Code', required_if_provider='adyen')
+ adyen_skin_hmac_key = fields.Char('Skin HMAC Key', required_if_provider='adyen')
- - yhpp: hosted payment page: pay.shtml for single, select.shtml for multiple
- """
+ @api.model
+ def _get_adyen_urls(self, environment):
+ """ Adyen URLs: yhpp: hosted payment page: pay.shtml for single, select.shtml for multiple """
return {
'adyen_form_url': 'https://%s.adyen.com/hpp/pay.shtml' % ('live' if environment == 'prod' else environment),
}
- def _get_providers(self, cr, uid, context=None):
- providers = super(AcquirerAdyen, self)._get_providers(cr, uid, context=context)
- providers.append(['adyen', 'Adyen'])
- return providers
-
- _columns = {
- 'adyen_merchant_account': fields.char('Merchant Account', required_if_provider='adyen'),
- 'adyen_skin_code': fields.char('Skin Code', required_if_provider='adyen'),
- 'adyen_skin_hmac_key': fields.char('Skin HMAC Key', required_if_provider='adyen'),
- }
-
- def _adyen_generate_merchant_sig_sha256(self, acquirer, inout, values):
+ @api.multi
+ def _adyen_generate_merchant_sig_sha256(self, inout, values):
""" Generate the shasign for incoming or outgoing communications., when using the SHA-256
signature.
- :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' (adyen
- contacting openerp). In this last case only some
+ :param string inout: 'in' (odoo contacting ogone) or 'out' (adyen
+ contacting odoo). In this last case only some
fields should be contained (see e-Commerce basic)
:param dict values: transaction values
:return string: shasign
@@ -62,7 +51,7 @@ class AcquirerAdyen(osv.Model):
return base64.b64encode(hm.digest())
assert inout in ('in', 'out')
- assert acquirer.provider == 'adyen'
+ assert self.provider == 'adyen'
if inout == 'in':
# All the fields sent to Adyen must be included in the signature. ALL the fucking
@@ -83,27 +72,26 @@ class AcquirerAdyen(osv.Model):
'pspReference', 'shopperLocale', 'skinCode',
]
- hmac_key = binascii.a2b_hex(acquirer.adyen_skin_hmac_key.encode('ascii'))
+ hmac_key = binascii.a2b_hex(self.adyen_skin_hmac_key.encode('ascii'))
raw_values = {k: values.get(k.encode('ascii'), '') for k in keys if k in values}
raw_values_ordered = OrderedDict(sorted(raw_values.items(), key=lambda t: t[0]))
return signParams(raw_values_ordered)
- def _adyen_generate_merchant_sig(self, acquirer, inout, values):
+ @api.multi
+ def _adyen_generate_merchant_sig(self, inout, values):
""" Generate the shasign for incoming or outgoing communications, when using the SHA-1
signature (deprecated by Adyen).
- :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' (adyen
- contacting openerp). In this last case only some
+ :param string inout: 'in' (odoo contacting ogone) or 'out' (adyen
+ 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 == 'adyen'
+ assert self.provider == 'adyen'
if inout == 'in':
keys = "paymentAmount currencyCode shipBeforeDate merchantReference skinCode merchantAccount sessionValidity shopperEmail shopperReference recurringContract allowedMethods blockedMethods shopperStatement merchantReturnData billingAddressType deliveryAddressType offset".split()
@@ -116,66 +104,67 @@ class AcquirerAdyen(osv.Model):
return ''
sign = ''.join('%s' % get_value(k) for k in keys).encode('ascii')
- key = acquirer.adyen_skin_hmac_key.encode('ascii')
+ key = self.adyen_skin_hmac_key.encode('ascii')
return base64.b64encode(hmac.new(key, sign, hashlib.sha1).digest())
- def adyen_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]
+ @api.multi
+ def adyen_form_generate_values(self, values):
+ base_url = self.env['ir.config_parameter'].get_param('web.base.url')
# tmp
import datetime
from dateutil import relativedelta
- if acquirer.provider == 'adyen' and len(acquirer.adyen_skin_hmac_key) == 64:
+ if self.provider == 'adyen' and len(self.adyen_skin_hmac_key) == 64:
tmp_date = datetime.datetime.today() + relativedelta.relativedelta(days=1)
values.update({
'merchantReference': values['reference'],
- 'paymentAmount': '%d' % int(float_round(values['amount'], 2) * 100),
+ 'paymentAmount': '%d' % int(tools.float_round(values['amount'], 2) * 100),
'currencyCode': values['currency'] and values['currency'].name or '',
'shipBeforeDate': tmp_date.strftime('%Y-%m-%d'),
- 'skinCode': acquirer.adyen_skin_code,
- 'merchantAccount': acquirer.adyen_merchant_account,
+ 'skinCode': self.adyen_skin_code,
+ 'merchantAccount': self.adyen_merchant_account,
'shopperLocale': values.get('partner_lang', ''),
'sessionValidity': tmp_date.isoformat('T')[:19] + "Z",
'resURL': '%s' % urlparse.urljoin(base_url, AdyenController._return_url),
'merchantReturnData': json.dumps({'return_url': '%s' % values.pop('return_url')}) if values.get('return_url', '') else False,
'shopperEmail': values.get('partner_email', ''),
})
- values['merchantSig'] = self._adyen_generate_merchant_sig_sha256(acquirer, 'in', values)
+ values['merchantSig'] = self._adyen_generate_merchant_sig_sha256('in', values)
else:
tmp_date = datetime.date.today() + relativedelta.relativedelta(days=1)
values.update({
'merchantReference': values['reference'],
- 'paymentAmount': '%d' % int(float_round(values['amount'], 2) * 100),
+ 'paymentAmount': '%d' % int(tools.float_round(values['amount'], 2) * 100),
'currencyCode': values['currency'] and values['currency'].name or '',
'shipBeforeDate': tmp_date,
- 'skinCode': acquirer.adyen_skin_code,
- 'merchantAccount': acquirer.adyen_merchant_account,
+ 'skinCode': self.adyen_skin_code,
+ 'merchantAccount': self.adyen_merchant_account,
'shopperLocale': values.get('partner_lang'),
'sessionValidity': tmp_date,
'resURL': '%s' % urlparse.urljoin(base_url, AdyenController._return_url),
'merchantReturnData': json.dumps({'return_url': '%s' % values.pop('return_url')}) if values.get('return_url') else False,
- 'merchantSig': self._adyen_generate_merchant_sig(acquirer, 'in', values),
+ 'merchantSig': self._adyen_generate_merchant_sig('in', values),
})
return values
- def adyen_get_form_action_url(self, cr, uid, ids, context=None):
- acquirer = self.browse(cr, uid, ids, context=context)[0]
- return self._get_adyen_urls(cr, uid, acquirer.environment, context=context)['adyen_form_url']
+ @api.multi
+ def adyen_get_form_action_url(self):
+ return self._get_adyen_urls(self.environment)['adyen_form_url']
-class TxAdyen(osv.Model):
+class TxAdyen(models.Model):
_inherit = 'payment.transaction'
# --------------------------------------------------
# FORM RELATED METHODS
# --------------------------------------------------
- def _adyen_form_get_tx_from_data(self, cr, uid, data, context=None):
+ @api.model
+ def _adyen_form_get_tx_from_data(self, data):
reference, pspReference = data.get('merchantReference'), data.get('pspReference')
if not reference or not pspReference:
error_msg = _('Adyen: received data with missing reference (%s) or missing pspReference (%s)') % (reference, pspReference)
@@ -183,22 +172,21 @@ class TxAdyen(osv.Model):
raise ValidationError(error_msg)
# find tx -> @TDENOTE use pspReference ?
- tx_ids = self.pool['payment.transaction'].search(cr, uid, [('reference', '=', reference)], context=context)
- if not tx_ids or len(tx_ids) > 1:
+ tx = self.env['payment.transaction'].search([('reference', '=', reference)])
+ if not tx or len(tx) > 1:
error_msg = _('Adyen: 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
if len(tx.acquirer_id.adyen_skin_hmac_key) == 64:
- shasign_check = self.pool['payment.acquirer']._adyen_generate_merchant_sig_sha256(tx.acquirer_id, 'out', data)
+ shasign_check = tx.acquirer_id._adyen_generate_merchant_sig_sha256('out', data)
else:
- shasign_check = self.pool['payment.acquirer']._adyen_generate_merchant_sig(tx.acquirer_id, 'out', data)
+ shasign_check = tx.acquirer_id._adyen_generate_merchant_sig('out', data)
if shasign_check != data.get('merchantSig'):
error_msg = _('Adyen: invalid merchantSig, received %s, computed %s') % (data.get('merchantSig'), shasign_check)
_logger.warning(error_msg)
@@ -206,27 +194,25 @@ class TxAdyen(osv.Model):
return tx
- def _adyen_form_get_invalid_parameters(self, cr, uid, ids, data, context=None):
- tx = self.browse(cr, uid, ids, context=context)[0]
+ def _adyen_form_get_invalid_parameters(self, data):
invalid_parameters = []
# reference at acquirer: pspReference
- if tx.acquirer_reference and data.get('pspReference') != tx.acquirer_reference:
- invalid_parameters.append(('pspReference', data.get('pspReference'), tx.acquirer_reference))
+ if self.acquirer_reference and data.get('pspReference') != self.acquirer_reference:
+ invalid_parameters.append(('pspReference', data.get('pspReference'), self.acquirer_reference))
# seller
- if data.get('skinCode') != tx.acquirer_id.adyen_skin_code:
- invalid_parameters.append(('skinCode', data.get('skinCode'), tx.acquirer_id.adyen_skin_code))
+ if data.get('skinCode') != self.acquirer_id.adyen_skin_code:
+ invalid_parameters.append(('skinCode', data.get('skinCode'), self.acquirer_id.adyen_skin_code))
# result
if not data.get('authResult'):
invalid_parameters.append(('authResult', data.get('authResult'), 'something'))
return invalid_parameters
- def _adyen_form_validate(self, cr, uid, ids, data, context=None):
- tx = self.browse(cr, uid, ids, context=context)[0]
+ def _adyen_form_validate(self, data):
status = data.get('authResult', 'PENDING')
if status == 'AUTHORISED':
- tx.write({
+ self.write({
'state': 'done',
'acquirer_reference': data.get('pspReference'),
# 'date_validate': data.get('payment_date', fields.datetime.now()),
@@ -234,7 +220,7 @@ class TxAdyen(osv.Model):
})
return True
elif status == 'PENDING':
- tx.write({
+ self.write({
'state': 'pending',
'acquirer_reference': data.get('pspReference'),
})
@@ -242,7 +228,7 @@ class TxAdyen(osv.Model):
else:
error = _('Adyen: feedback error')
_logger.info(error)
- tx.write({
+ self.write({
'state': 'error',
'state_message': error
})