def get_configured_projects(user):
    configured_project_ids = set()
    user_subscriptions = get_all_user_subscriptions(user)

    for subscription in user_subscriptions:
        if subscription is None:
            continue
        # If the user has opted out of emails skip
        node = subscription.owner

        if not isinstance(node, Node) or (user in subscription.none and not node.parent_id):
            continue

        while node.parent_id and not node.is_deleted:
            node = Node.load(node.parent_id)

        if not node.is_deleted:
            configured_project_ids.add(node._id)

    return list(configured_project_ids)
L{NewsBuilder.build} updates a NEWS file with new features based on the
dataset/ETHPy150Open CenterForOpenScience/osf.io/website/notifications/utils.py/get_configured_projects--crossover with--dataset/ETHPy150Open twisted/twisted/twisted/python/test/test_release.py/NewsBuilderMixin.test_build