Repository URL to install this package:
|
Version:
0.4.139 ▾
|
from botocore.exceptions import ClientError
from lib_b2b.policy import Policy
from lib_b2b.errors import OrderStatusChangeError, VersionConflictError
from lib_b2b.change import ChangeRecord
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 OrderStatusChangeRequest(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='status_change_policy',
subject=Policy.SUBJECT_ALL,
predicates=[
SimpleOrderPredicate(
lambda o: o is not None,
'The order must exist in order to make an Administrative status change.')
]
)
def __init__(self, on_behalf_of: str, change_data_provider: OrderStatusChangeDataProvider):
super().__init__(on_behalf_of, OrderStatusChangeRequest._policy)
self.change_data_provider = change_data_provider
def will_change(self, order: Order) -> bool:
return order.status is not self.change_data_provider.new_status
def apply(self, order: Order):
try:
self.changeable_object = order
if super().permitted(order):
if self.will_change(order):
before_status = order.status
order.set_status(new_status=self.change_data_provider.new_status,
version=self.change_data_provider.version())
order.record(
ChangeRecord(before=before_status.value,
after=self.change_data_provider.new_status.value,
description=f"Administrative order status change from "
f"{before_status.value} to "
f"{self.change_data_provider.new_status.value}.",
when=datetime.now(),
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 complete administrative order status change due to client error. [{str(ce)}]")
raise OrderStatusChangeError("Unable to complete administrative order status") from ce