def fetch_and_ack_orders()

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