def create(cls, params): """ Place a new order into the system :param params: dict of required parameters to be used params = {'product_opts': {dictionary object of the order received} 'orderid': id generated from generate_order_id 'user_id': EE user id 'order_type': typically 'level2_ondemand' 'status': 'ordered' 'note': user notes 'ee_order_id': earth explorer order id, or '' 'order_source': 'espa' or 'ee' 'order_date': date time string 'priority': legacy item, should be 'normal' 'email': user's contact email 'product_options': legacy column} :return: order object """ opts = params['product_opts'] params['product_opts'] = json.dumps(params['product_opts']) sql = ('INSERT INTO ordering_order ' '(orderid, user_id, order_type, status, note, ' 'product_opts, ee_order_id, order_source, order_date, ' 'priority, email, product_options) ' 'VALUES (%(orderid)s, %(user_id)s, %(order_type)s, ' '%(status)s, %(note)s, %(product_opts)s, ' '%(ee_order_id)s, %(order_source)s, %(order_date)s, ' '%(priority)s, %(email)s, %(product_options)s)') logger.info('Order creation parameters: {}'.format(params)) log_sql = '' try: with db_instance() as db: log_sql = db.cursor.mogrify(sql, params) logger.info('New order complete SQL: {}'.format(log_sql)) db.execute(sql, params) db.commit() except DBConnectException as e: logger.debug('Error creating new order: {}\n' 'sql: {}'.format(e.message, log_sql)) raise OrderException(e) order = Order.find(params['orderid']) # Let the load_ee_order method handle the scene injection # as there is special logic for interacting with LTA if params['ee_order_id']: return order sensor_keys = sensor.SensorCONST.instances.keys() bulk_ls = [] for key in opts: if key in sensor_keys: sensor_type = '' item1 = opts[key]['inputs'][0] if isinstance(sensor.instance(item1), sensor.Landsat): sensor_type = 'landsat' elif isinstance(sensor.instance(item1), sensor.Modis): sensor_type = 'modis' for s in opts[key]['inputs']: scene_dict = { 'name': s, 'sensor_type': sensor_type, 'order_id': order.id, 'status': 'submitted', 'ee_unit_id': None } bulk_ls.append(scene_dict) if 'plot_statistics' in opts and opts['plot_statistics']: scene_dict = { 'name': 'plot', 'sensor_type': 'plot', 'order_id': order.id, 'status': 'submitted', 'ee_unit_id': None } bulk_ls.append(scene_dict) try: Scene.create(bulk_ls) except SceneException as e: logger.debug('Order creation failed on scene injection, ' 'order: {}\nexception: {}'.format( order.orderid, e.message)) with db_instance() as db: db.execute('delete ordering_order where id = %s', order.id) db.commit() raise OrderException(e) return order
def create(cls, params): """ Place a new order into the system :param params: dict of required parameters to be used params = {'product_opts': {dictionary object of the order received} 'orderid': id generated from generate_order_id 'user_id': EE user id 'order_type': typically 'level2_ondemand' 'status': 'ordered' 'note': user notes 'ee_order_id': earth explorer order id, or '' 'order_source': 'espa' or 'ee' 'order_date': date time string 'priority': legacy item, should be 'normal' 'email': user's contact email 'product_options': legacy column} :return: order object """ opts = params['product_opts'] params['product_opts'] = json.dumps(params['product_opts']) sql = ('INSERT INTO ordering_order ' '(orderid, user_id, order_type, status, note, ' 'product_opts, ee_order_id, order_source, order_date, ' 'priority, email, product_options) ' 'VALUES (%(orderid)s, %(user_id)s, %(order_type)s, ' '%(status)s, %(note)s, %(product_opts)s, ' '%(ee_order_id)s, %(order_source)s, %(order_date)s, ' '%(priority)s, %(email)s, %(product_options)s)') logger.info('Order creation parameters: {}'.format(params)) log_sql = '' try: with db_instance() as db: log_sql = db.cursor.mogrify(sql, params) logger.info('New order complete SQL: {}' .format(log_sql)) db.execute(sql, params) db.commit() except DBConnectException as e: logger.debug('Error creating new order: {}\n' 'sql: {}'.format(e.message, log_sql)) raise OrderException(e) order = Order.find(params['orderid']) # Let the load_ee_order method handle the scene injection # as there is special logic for interacting with LTA if params['ee_order_id']: return order sensor_keys = sensor.SensorCONST.instances.keys() bulk_ls = [] for key in opts: if key in sensor_keys: sensor_type = '' item1 = opts[key]['inputs'][0] if isinstance(sensor.instance(item1), sensor.Landsat): sensor_type = 'landsat' elif isinstance(sensor.instance(item1), sensor.Modis): sensor_type = 'modis' for s in opts[key]['inputs']: scene_dict = {'name': s, 'sensor_type': sensor_type, 'order_id': order.id, 'status': 'submitted', 'ee_unit_id': None} bulk_ls.append(scene_dict) if 'plot_statistics' in opts and opts['plot_statistics']: scene_dict = {'name': 'plot', 'sensor_type': 'plot', 'order_id': order.id, 'status': 'submitted', 'ee_unit_id': None} bulk_ls.append(scene_dict) try: Scene.create(bulk_ls) except SceneException as e: logger.debug('Order creation failed on scene injection, ' 'order: {}\nexception: {}' .format(order.orderid, e.message)) with db_instance() as db: db.execute('delete ordering_order where id = %s', order.id) db.commit() raise OrderException(e) return order