in backend/bms_app/restore/services.py [0:0]
def _add_operation_data(cls, data, unique_db_ids):
"""Add data about last operation.
Get map of 'last operation' -> ['source db',...]
Retrieve data about all 'last operation'
Assign operation data to all source dbs involved in the operation
"""
# get list of last operation id and corresponding db_id
db_operation_data = db.session.query(Mapping, OperationDetails) \
.with_entities(func.max(OperationDetails.operation_id),
Mapping.db_id) \
.join(OperationDetails,
Mapping.id == OperationDetails.mapping_id) \
.filter(Mapping.db_id.in_(unique_db_ids)) \
.group_by(Mapping.db_id) \
.all()
# create a map operation_id -> [db_id] map
# in order to track which db was involved in the specific operation
operation_id_db_id_map = defaultdict(list)
for op_id, db_id in db_operation_data:
operation_id_db_id_map[op_id].append(db_id)
# retrieve data about all last operations
all_operation_ids = operation_id_db_id_map.keys()
operations_data_qs = db.session.query(
Operation, OperationDetails, BMSServer
) \
.join(OperationDetails) \
.join(Mapping) \
.join(BMSServer, Mapping.bms_id == BMSServer.id) \
.filter(Operation.id.in_(all_operation_ids))
# extend 'data' with required info
errors = defaultdict(set) # collect unique errors per db
for operation, op_details, bms_server in operations_data_qs:
# add operation type/status to databases involved in the operation
for db_id in operation_id_db_id_map[operation.id]:
item = next((x for x in data.values() if x['id'] == db_id))
cls._add_operation_info(item, operation)
cls._add_logs_url(item, operation, op_details, bms_server)
errors[db_id].update({x.message for x in op_details.errors})
cls._add_errors(data, errors)