def cancel_order(self, orderid, request_ip_address): """ Cancels an order, and all scenes contained within it :return: """ order = Order.where({'id': orderid}) if len(order) != 1: raise OrderingProviderException('Order not found') else: order = order.pop() logger.info('Received request to cancel {} from {}'.format( orderid, request_ip_address)) killable_scene_states = ('submitted', 'oncache', 'onorder', 'queued', 'retry', 'error', 'unavailable', 'complete') scenes = order.scenes(sql_dict={'status': killable_scene_states}) if len(scenes) > 0: Scene.bulk_update([s.id for s in scenes], Scene.cancel_opts()) else: logger.info('No scenes to cancel for order {}'.format( orderid, request_ip_address)) order.status = 'cancelled' order.save() logger.info('Request to cancel {} from {} successful.'.format( orderid, request_ip_address)) return order