Repository URL to install this package:
|
Version:
0.4.139 ▾
|
import logging
from datetime import datetime
from boto3.dynamodb.conditions import Attr, And
from lib_b2b.change import ChangeRecord
from lib_b2b.errors import VersionConflictError
from lib_b2b.order import Order
from lib_b2b.order_change import OrderChangeRequest, SimpleOrderPredicate, OrderStatusChangeDataProvider
from lib_b2b.order_status import OrderStatus
from lib_b2b.policy import Policy
logger = logging.getLogger(__name__)
class OrderReprocessChangeRequest(OrderChangeRequest):
# TODO: - Move these policies to be data driven
_policy = Policy(
name='reprocess_change_policy',
subject=Policy.SUBJECT_ALL,
predicates=[
SimpleOrderPredicate(
lambda o: o.status is OrderStatus.REJECTED,
'Cannot reprocess unless the order is Rejected.')
]
)
def __init__(self, on_behalf_of: str, change_data_provider: OrderStatusChangeDataProvider):
super().__init__(on_behalf_of, OrderReprocessChangeRequest._policy)
self.change_data_provider = change_data_provider
def will_change(self, order: Order) -> bool:
return self.change_data_provider.new_status is not order.status and self.change_data_provider.new_status is OrderStatus.RECEIVED
def apply(self, order: Order):
try:
self.changeable_object = order
if super().permitted(order):
if self.will_change(order):
before_status = order.status
expressions1 = [
Attr('order_status').ne(OrderStatus.RECEIVED.value),
Attr('order_status').ne(OrderStatus.SHIPPED.value)
]
conditions1 = And(*expressions1)
expressions2 = [
Attr('order_status').ne(OrderStatus.PARTIALLY_SHIPPED.value),
Attr('order_status').ne(OrderStatus.CANCELLED.value)
]
conditions2 = And(*expressions2)
conditions3 = And(*[conditions1, conditions2])
order.set_status(self.change_data_provider.new_status,
conditions3,
version=self.change_data_provider.version())
order.record(
ChangeRecord(before=before_status.value, after=self.change_data_provider.new_status.value,
description="Order was reprocessed", when=datetime.now(), who=self.on_behalf_of)
)
except ValueError as ve:
raise VersionConflictError(str(ve))