From a36f2748b151448b84c51b535d22e088dfe34c26 Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Thu, 30 May 2019 17:55:24 +0200 Subject: [PATCH 1/2] Check for validity of conversation object was done on approval, but not on fail, inquire nor skip. --- connect/resources/fulfillment_automation.py | 33 +++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/connect/resources/fulfillment_automation.py b/connect/resources/fulfillment_automation.py index 043e798..89dac8b 100644 --- a/connect/resources/fulfillment_automation.py +++ b/connect/resources/fulfillment_automation.py @@ -87,31 +87,34 @@ def dispatch(self, request): except InquireRequest as inquire: self.update_parameters(request.id, inquire.params) inquired = self.inquire(request.id) - try: - conversation.add_message(str(inquire)) - except TypeError as ex: - logger.error('Error updating conversation for request {}: {}' - .format(request.id, ex)) + if conversation: + try: + conversation.add_message(str(inquire)) + except TypeError as ex: + logger.error('Error updating conversation for request {}: {}' + .format(request.id, ex)) return inquired except FailRequest as fail: # PyCharm incorrectly detects unreachable code here, so disable # noinspection PyUnreachableCode failed = self.fail(request.id, reason=str(fail)) - try: - conversation.add_message(str(fail)) - except TypeError as ex: - logger.error('Error updating conversation for request {}: {}' - .format(request.id, ex)) + if conversation: + try: + conversation.add_message(str(fail)) + except TypeError as ex: + logger.error('Error updating conversation for request {}: {}' + .format(request.id, ex)) return failed except SkipRequest as skip: skipped = skip.code - try: - conversation.add_message(str(skip)) - except TypeError as ex: - logger.error('Error updating conversation for request {}: {}' - .format(request.id, ex)) + if conversation: + try: + conversation.add_message(str(skip)) + except TypeError as ex: + logger.error('Error updating conversation for request {}: {}' + .format(request.id, ex)) return skipped @deprecated(deprecated_in='16.0', details='Use ``TierConfig.get`` instead.') From b5e86273310dd193a6c2caa40c6d0f88004a8669 Mon Sep 17 00:00:00 2001 From: Javier San Juan Cervera Date: Fri, 31 May 2019 10:52:21 +0200 Subject: [PATCH 2/2] Refactored common code to a static method. --- connect/resources/fulfillment_automation.py | 44 ++++++++------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/connect/resources/fulfillment_automation.py b/connect/resources/fulfillment_automation.py index 89dac8b..ff59b58 100644 --- a/connect/resources/fulfillment_automation.py +++ b/connect/resources/fulfillment_automation.py @@ -6,11 +6,12 @@ from abc import ABCMeta from deprecation import deprecated +from typing import Optional from connect.exceptions import FailRequest, InquireRequest, SkipRequest from connect.logger import logger, function_log from connect.models import ActivationTemplateResponse, ActivationTileResponse, Param, \ - Fulfillment, TierConfigRequest + Fulfillment, TierConfigRequest, Conversation from .automation_engine import AutomationEngine @@ -76,46 +77,25 @@ def dispatch(self, request): message = '' approved = '' - if conversation: - try: - conversation.add_message(message) - except TypeError as ex: - logger.error('Error updating conversation for request {}: {}' - .format(request.id, ex)) + self._update_conversation_if_exists(conversation, request.id, message) return approved except InquireRequest as inquire: self.update_parameters(request.id, inquire.params) inquired = self.inquire(request.id) - if conversation: - try: - conversation.add_message(str(inquire)) - except TypeError as ex: - logger.error('Error updating conversation for request {}: {}' - .format(request.id, ex)) + self._update_conversation_if_exists(conversation, request.id, inquire) return inquired except FailRequest as fail: # PyCharm incorrectly detects unreachable code here, so disable # noinspection PyUnreachableCode failed = self.fail(request.id, reason=str(fail)) - if conversation: - try: - conversation.add_message(str(fail)) - except TypeError as ex: - logger.error('Error updating conversation for request {}: {}' - .format(request.id, ex)) + self._update_conversation_if_exists(conversation, request.id, fail) return failed except SkipRequest as skip: - skipped = skip.code - if conversation: - try: - conversation.add_message(str(skip)) - except TypeError as ex: - logger.error('Error updating conversation for request {}: {}' - .format(request.id, ex)) - return skipped + self._update_conversation_if_exists(conversation, request.id, skip) + return skip.code @deprecated(deprecated_in='16.0', details='Use ``TierConfig.get`` instead.') def get_tier_config(self, tier_id, product_id): @@ -161,3 +141,13 @@ def update_parameters(self, pk, params): path=pk, json={'asset': {'params': list_dict}}, )[0] + + @staticmethod + def _update_conversation_if_exists(conversation, request_id, obj): + # type: (Optional[Conversation], str, object) -> None + if conversation: + try: + conversation.add_message(str(obj)) + except TypeError as ex: + logger.error('Error updating conversation for request {}: {}' + .format(request_id, ex))