[IMP] website_sale_signifyd: add tests and streamline setup (WIP)

This commit is contained in:
Jared Kipe
2021-04-26 08:34:28 -07:00
parent 9f31ca0df0
commit 2062edcb8c
9 changed files with 29 additions and 13 deletions

View File

@@ -1,14 +1,19 @@
from odoo.http import request, route
from odoo.addons.website_sale.controllers.main import WebsiteSale
import logging
_logger = logging.getLogger(__name__)
class WebsiteSale(WebsiteSale):
@route(['/shop/confirmation'], type='http', auth="public", website=True, sitemap=False)
def payment_confirmation(self, **post):
res = super(WebsiteSale, self).payment_confirmation()
order_session_id = request.session.session_token
# order_session_id = request.session.session_token
checkout_token = request.session.session_token
order_session_id = checkout_token # TODO what is the appropriate variable?
_logger.warn(str(request.session))
browser_ip_address = request.httprequest.environ['REMOTE_ADDR']
sale_order_id = request.session.get('sale_last_order_id')
if sale_order_id:
@@ -16,6 +21,7 @@ class WebsiteSale(WebsiteSale):
# Post completed order to Signifyd
signifyd = request.env.company.signifyd_connector_id
if signifyd:
order.sudo().post_signifyd_case(order_session_id, checkout_token, browser_ip_address)
# TODO should the signifyd variable be used?
order.post_signifyd_case(order_session_id, checkout_token, browser_ip_address)
return res

View File

@@ -18,9 +18,11 @@ class SignifydWebhooks(Controller):
if case.guarantee_requested and not case.guarantee_eligible:
# Only alert Signifyd to stop trying if we have at least tried once already
return Response({'response': 'success'}, status=200, mimetype='application/json')
# TODO what would the return case be here?
except:
# Signifyd API will try again up to 15 times if a non-2** code is returned
return Response({'response': 'failed'}, status=500, mimetype='application/json')
# TODO what would the return case be here?
@route(['/cases/update'], type='json', auth='public', methods=['POST'], csrf=False)
def case_update(self, *args, **post):
@@ -34,3 +36,4 @@ class SignifydWebhooks(Controller):
if case and outcome == 'DECLINED':
for user in request.env.company.signifyd_connector_id.notify_user_ids:
case.sudo().create_notification(user, outcome)
# TODO any return result?

View File

@@ -4,4 +4,5 @@ from odoo import fields, models
class ResCompany(models.Model):
_inherit = 'res.company'
# TODO move to website
signifyd_connector_id = fields.Many2one('signifyd.connector')

View File

@@ -5,13 +5,13 @@ class SaleOrder(models.Model):
_inherit = 'sale.order'
signifyd_case_id = fields.Many2one('signifyd.case', readonly=1)
singifyd_score = fields.Float(related='signifyd_case_id.score', readonly=1)
signifyd_disposition_status = fields.Selection(related='signifyd_case_id.guarantee_disposition', tracking=True)
singifyd_score = fields.Float(related='signifyd_case_id.score')
signifyd_disposition_status = fields.Selection(related='signifyd_case_id.guarantee_disposition')
def action_view_signifyd_case(self):
self.ensure_one()
form_id = self.env.ref('gcl_signifyd_connector.signifyd_case_form_view').id
context = {'create': False, 'delete': False, 'id': self.signifyd_case_id.id}
form_id = self.env.ref('website_sale_signifyd.signifyd_case_form_view').id
context = {'create': False, 'delete': False}
return {
'type': 'ir.actions.act_window',
'name': 'Signifyd Case',

View File

@@ -9,7 +9,7 @@ class SignifydCase(models.Model):
_name = 'signifyd.case'
_description = 'Stores Signifyd case information on orders.'
order_id = fields.Many2one('sale.order')
order_id = fields.Many2one('sale.order', required=True)
partner_id = fields.Many2one('res.partner')
case_id = fields.Char(string='Case ID')
uuid = fields.Char(string='Unique ID')
@@ -57,19 +57,22 @@ class SignifydCase(models.Model):
self.signifyd_url = ''
def write(self, vals):
original_disposition = {c: c.guarantee_disposition for c in self}
res = super(SignifydCase, self).write(vals)
disposition = vals.get('guarantee_disposition')
if disposition:
for case in self:
if case.order_id and original_disposition[case] != disposition:
self.order_id.message_post(body=_('Signifyd Updated Record to %s' % vals['guarantee_disposition']),
subtype='gcl_signifyd_connector.disposition_change')
subtype='website_sale_signifyd.disposition_change')
return res
@api.model
def post_case(self, values):
signifyd = self.env['signifyd.connector']
signifyd = self.env['signifyd.connector'] # TODO HOW, this shouldn't be a singleton
headers = signifyd.get_headers()
data = json.dumps(values, indent=4, sort_keys=True, default=str)
# TODO this should be in `signifyd.connector`
r = requests.post(
signifyd.API_URL + '/cases',
headers=headers,
@@ -79,6 +82,7 @@ class SignifydCase(models.Model):
@api.model
def get_case(self):
# TODO See above....
signifyd = self.env['signifyd.connector']
headers = signifyd.get_headers()
r = requests.get(
@@ -89,6 +93,7 @@ class SignifydCase(models.Model):
@api.model
def request_guarantee(self, *args):
# TODO See above....
signifyd = self.env['signifyd.connector']
headers = signifyd.get_headers()
values = json.dumps({"caseId": self.case_id})

View File

@@ -9,7 +9,7 @@ class StockPicking(models.Model):
def action_view_signifyd_case(self):
self.ensure_one()
form_id = self.env.ref('gcl_signifyd_connector.signifyd_case_form_view').id
form_id = self.env.ref('website_sale_signifyd.signifyd_case_form_view').id
context = {'create': False, 'delete': False, 'id': self.sale_id.signifyd_case_id.id}
return {
'type': 'ir.actions.act_window',

View File

@@ -0,0 +1 @@
from . import test_order_flow

View File

@@ -67,7 +67,7 @@
<field name="name">Signifyd Case Information</field>
<field name="res_model">signifyd.case</field>
<field name="view_mode">form</field>
<field name="view_id" ref="gcl_signifyd_connector.signifyd_case_form_view"/>
<field name="view_id" ref="website_sale_signifyd.signifyd_case_form_view"/>
</record>
<record id="signifyd_connector_form_view" model="ir.ui.view">