def _add_operation_data()

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)