Repository URL to install this package:
|
Version:
0.4.184 ▾
|
import abc
from botocore.exceptions import ClientError
from lib_b2b.order_status import OrderStatus
from lib_b2b.policy import Policy
from lib_b2b.errors import OrderStatusChangeError, VersionConflictError
from lib_b2b.change import ChangeRecord, ChangeDataProvider
from lib_b2b.order_change import OrderChangeRequest, SimpleOrderPredicate, OrderStatusChangeDataProvider
from lib_b2b.order import Order
from datetime import datetime
import logging
logger = logging.getLogger(__name__)
class OrderClearErrorsChangeDataProvider(ChangeDataProvider, metaclass=abc.ABCMeta):
@property
@abc.abstractmethod
def clear_errors(self) -> bool:
raise NotImplementedError
class OrderClearErrorsChangeRequest(OrderChangeRequest):
"""
*** This should be an admin only change request and not part of the integration ***
"""
# TODO: - Move these policies to be data driven
_policy = Policy(
name='clear_errors_change_policy',
subject=Policy.SUBJECT_ALL,
predicates=[
SimpleOrderPredicate(
lambda o: o.status < OrderStatus.SHIPPED,
'The errors can only be cleared until the order has shipped.')
]
)
def __init__(self, on_behalf_of: str, change_data_provider: OrderClearErrorsChangeDataProvider):
super().__init__(on_behalf_of, OrderClearErrorsChangeRequest._policy)
self.change_data_provider = change_data_provider
def will_change(self, order: Order) -> bool:
_errors = order.get('errors', [])
_warnings = order.get('warnings', [])
return len(_errors) > 0 or len(_warnings) > 0
def apply(self, order: Order):
try:
self.changeable_object = order
if super().permitted(order):
if self.will_change(order):
_before = {
'errors': order.get('errors', []),
'warnings': order.get('warnings', [])
}
order._clear_errors_and_warnings()
_after = {
'errors': order.get('errors', []),
'warnings': order.get('warnings', [])
}
order.record(
ChangeRecord(before=_before,
after=_after,
description=f"Errors and warnings were cleared on the order.",
when=datetime.now().astimezone(UTC),
who=self.on_behalf_of)
)
except ValueError as ve:
raise VersionConflictError(str(ve))
except ClientError as ce:
# order.error(ErrorRecord(code="ORDER-11",
# msg=f"Order accept failed due to client error. [{str(ce)}]"))
logger.error(f"Unable to clear errors and warnings order due to client error. [{str(ce)}]")
raise OrderStatusChangeError("Unable to lear errors and warnings on the order.") from ce