From 2062edcb8c3815ca41666a1d6f6ce7a38251f46a Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Mon, 26 Apr 2021 08:34:28 -0700 Subject: [PATCH] [IMP] website_sale_signifyd: add tests and streamline setup (WIP) --- website_sale_signifyd/controllers/main.py | 10 ++++++++-- website_sale_signifyd/controllers/signifyd.py | 3 +++ website_sale_signifyd/models/company.py | 1 + website_sale_signifyd/models/sale_order.py | 8 ++++---- website_sale_signifyd/models/signifyd.py | 15 ++++++++++----- website_sale_signifyd/models/stock.py | 2 +- website_sale_signifyd/tests/__init__.py | 1 + website_sale_signifyd/tests/test_order_flow.py | 0 website_sale_signifyd/views/signifyd_views.xml | 2 +- 9 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 website_sale_signifyd/tests/__init__.py create mode 100644 website_sale_signifyd/tests/test_order_flow.py diff --git a/website_sale_signifyd/controllers/main.py b/website_sale_signifyd/controllers/main.py index 2482f87f..85d9c3be 100644 --- a/website_sale_signifyd/controllers/main.py +++ b/website_sale_signifyd/controllers/main.py @@ -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 diff --git a/website_sale_signifyd/controllers/signifyd.py b/website_sale_signifyd/controllers/signifyd.py index e8ff5bae..30b6fd16 100644 --- a/website_sale_signifyd/controllers/signifyd.py +++ b/website_sale_signifyd/controllers/signifyd.py @@ -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? diff --git a/website_sale_signifyd/models/company.py b/website_sale_signifyd/models/company.py index 3507b679..b51a6748 100644 --- a/website_sale_signifyd/models/company.py +++ b/website_sale_signifyd/models/company.py @@ -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') diff --git a/website_sale_signifyd/models/sale_order.py b/website_sale_signifyd/models/sale_order.py index 02d29538..e5412c11 100644 --- a/website_sale_signifyd/models/sale_order.py +++ b/website_sale_signifyd/models/sale_order.py @@ -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', diff --git a/website_sale_signifyd/models/signifyd.py b/website_sale_signifyd/models/signifyd.py index 16dce1fa..46ddadec 100644 --- a/website_sale_signifyd/models/signifyd.py +++ b/website_sale_signifyd/models/signifyd.py @@ -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: - self.order_id.message_post(body=_('Signifyd Updated Record to %s' % vals['guarantee_disposition']), - subtype='gcl_signifyd_connector.disposition_change') + 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='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}) diff --git a/website_sale_signifyd/models/stock.py b/website_sale_signifyd/models/stock.py index 58aab0d6..a2cae1e8 100644 --- a/website_sale_signifyd/models/stock.py +++ b/website_sale_signifyd/models/stock.py @@ -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', diff --git a/website_sale_signifyd/tests/__init__.py b/website_sale_signifyd/tests/__init__.py new file mode 100644 index 00000000..177d87f1 --- /dev/null +++ b/website_sale_signifyd/tests/__init__.py @@ -0,0 +1 @@ +from . import test_order_flow diff --git a/website_sale_signifyd/tests/test_order_flow.py b/website_sale_signifyd/tests/test_order_flow.py new file mode 100644 index 00000000..e69de29b diff --git a/website_sale_signifyd/views/signifyd_views.xml b/website_sale_signifyd/views/signifyd_views.xml index 442cac17..7f445457 100644 --- a/website_sale_signifyd/views/signifyd_views.xml +++ b/website_sale_signifyd/views/signifyd_views.xml @@ -67,7 +67,7 @@ Signifyd Case Information signifyd.case form - +