"""Module for ows_conflict_manager.action table.""" from oto import response from conflict_manager.connectors import snowflake from conflict_manager.utils import model_utils @snowflake.db_session_wrap def create(actions_data, session=None): """Save actions data to DB. action_date is expected to be in this format '2013-04-05 01:02:03'. Args: actions_data (list): list of Action dicts prepared to save in DB session (sqlalchemy.orm.session.Session): database session (optional) Returns: response.Response: dict of created action or errors """ ids = [a['conflict_id'] for a in actions_data] existing = get_ids_to_update(ids, session) to_insert = [a for a in actions_data if a['conflict_id'] not in existing] to_update = [a for a in actions_data if a['conflict_id'] in existing] insert_results = [] if to_insert: insert_results = insert(to_insert, session) update_results = [] if to_update: update_results = update(to_update, session) return response.Response(insert_results + update_results) def get_ids_to_update(actions_ids, session): """Check which of given ids exists in the DB. Args: actions_ids (list): list of conflict ids to check session (sqlalchemy.orm.session.Session): database session Returns: list: ids that exist in DB """ sql = 'SELECT CONFLICT_ID from {action_table} WHERE CONFLICT_ID in (:ids);' query_results = model_utils.run_query( session=session, sql=sql, params={'ids': actions_ids}) return [row[0] for row in query_results] def update(actions_data, session): """Update existing actions data in DB. action_date is expected to be in this format '2013-04-05 01:02:03'. Args: actions_data (list): list of Action dicts prepared to save in DB session (sqlalchemy.orm.session.Session): database session Returns: list: list of update results """ sql = """ UPDATE {action_table} SET conflict_id = :conflict_id, action = :action, action_date = TO_TIMESTAMP_NTZ(:action_date), reason = :reason, additional_information = :additional_information, account_id = :account_id, account_type = :account_type WHERE conflict_id = :conflict_id; """ query_results = model_utils.run_query( session=session, sql=sql, params=actions_data) return model_utils.query_results_to_dict(query_results) def insert(actions_data, session): """Insert new actions data to DB. action_date is expected to be in this format '2013-04-05 01:02:03'. Args: actions_data (list): list of Action dicts prepared to save in DB session (sqlalchemy.orm.session.Session): database session Returns: list: list of insert results """ sql = """ INSERT INTO {action_table}( conflict_id, action, action_date, reason, additional_information, account_id, account_type) VALUES( :conflict_id, :action, TO_TIMESTAMP_NTZ(:action_date), :reason, :additional_information, :account_id, :account_type); """ query_results = model_utils.run_query( session=session, sql=sql, params=actions_data) return model_utils.query_results_to_dict(query_results)