def _notify(updated_object, object_type, object_id):
    semaphore = '%s-id-%s' % (object_type, object_id)
    utility.notify(semaphore)

    # TODO: Generalize the block of code with a TODO below here.
#    if updated_object is not None and object_type in related_notifications:
#        for field, entity in related_notifications[object_type].iteritems():
#            if field in updated_object and updated_object[field] is not None:
#                semaphore = '%s-id-%s' % (entity, updated_object[field])
#                utility.notify(semaphore)

    # TODO (wilk or rpedde): Use specific notifications for inheritance
    if object_type not in ('attrs', 'facts', 'nodes'):
        return
    try:
        node_id = updated_object['node_id']
        node = None
    except __HOLE__:
        node_id = updated_object['id']
        node = updated_object
    if object_type != "attrs":
        api = api_from_models()
        # We're just going to notify every child when containers are updated
        if node is None:
            try:
                node = api._model_get_by_id('nodes', node_id)
            except (exceptions.IdNotFound):
                return

        if 'container' in node['facts'].get('backends', []):
            children = utility.get_direct_children(node, api)
            for child in children:
                semaphore = 'nodes-id-%s' % child['id']
                utility.notify(semaphore)
        # Update transaction for node and children
        id_list = utility.fully_expand_nodelist([node], api)
        # TODO(shep): this needs to be better abstracted
    # Need a codepath to update transaction for attr modifications
    else:
        # TODO(shep): this needs to be better abstracted
        id_list = [node_id]
    _update_transaction_id('nodes', id_list)
dataset/ETHPy150Open rcbops/opencenter/opencenter/webapp/generic.py/_notify