in order/utils/order_actions.py [0:0]
def fetch_and_ack_orders(store):
''' fetch orders, write orders, ack orders, update/delete orders, in that order.
params:
store: store to fetch and ack orders for
'''
# get page id and token
fb_meta = FacebookMetadata.objects.filter(store=store).first()
if fb_meta is None:
print("store [{}] doesnot have metadata, aborting order sync".format(store.name))
return None, None
page_id = fb_meta.fbe_page_id
token = fb_meta.token_info
if token is None:
print("store [{}] doesnot have token info, aborting order sync".format(store.name))
return None, None
# get and store orders that are CREATED (need acking) and IN_PROGRESS (acked)
# this way we sync up with any orders we may have missed during acking
data = list_orders(page_id, token, states=["CREATED", "IN_PROGRESS"])
fetched_orders = data.copy()
# write orders also updates data with merchant_order_reference = local order id.
write_orders(store, data)
# acknowledge orders
# parse out just the ext id and local id of orders that needs acknowledging ("CREATED")
orders_to_ack = [{'id':order['id'], 'merchant_order_reference':order['merchant_order_reference']} for order in data if order['order_status']['state'] == 'CREATED']
print("orders to acknowledge:", len(orders_to_ack))
acked_orders = []
try:
with transaction.atomic():
# loop through data 100 at a time due to limit.
while orders_to_ack:
batch = orders_to_ack[-100:]
acknowledge_orders(page_id, token, batch)
# only update orders after acknowledge_orders is successful
orders_to_ack[-100:] = []
acked_orders += batch
except Exception as e:
# only if something went wrong in the try block. "normal" failures,
# like if only some orders were successfully acked, are not handled here
[delete_order(order['id']) for order in orders_to_ack]
raise e
return fetched_orders, acked_orders