def pre_delete_user(user_id): """Prepare user for the full deletion. 1. Mark all the activities that are private and solely owned by the user being deleted as deleted. 2. Disable all the email preferences. 3. Mark the user as to be deleted. 4. Create PendingDeletionRequestModel for the user. Args: user_id: str. The id of the user to be deleted. If the user_id corresponds to a profile user then only that profile is deleted. For a full user, all of its associated profile users are deleted too. """ pending_deletion_requests = [] user_settings = user_services.get_user_settings(user_id, strict=True) linked_profile_user_ids = [ user.user_id for user in user_services.get_all_profiles_auth_details_by_parent_user_id(user_id) ] profile_users_settings_list = user_services.get_users_settings( linked_profile_user_ids) for profile_user_settings in profile_users_settings_list: profile_id = profile_user_settings.user_id user_services.mark_user_for_deletion(profile_id) pending_deletion_requests.append( wipeout_domain.PendingDeletionRequest.create_default( profile_id, profile_user_settings.email, profile_user_settings.role)) if user_settings.role != feconf.ROLE_ID_LEARNER: taskqueue_services.defer( taskqueue_services.FUNCTION_ID_REMOVE_USER_FROM_RIGHTS_MODELS, taskqueue_services.QUEUE_NAME_ONE_OFF_JOBS, user_id, ) # Set all the user's email preferences to False in order to disable all # ordinary emails that could be sent to the users. user_services.update_email_preferences(user_id, False, False, False, False) date_now = datetime.datetime.utcnow() date_before_which_username_should_be_saved = ( date_now - PERIOD_AFTER_WHICH_USERNAME_CANNOT_BE_REUSED) user_services.mark_user_for_deletion(user_id) normalized_long_term_username = ( user_settings.normalized_username if user_settings.created_on < date_before_which_username_should_be_saved else None) pending_deletion_requests.append( wipeout_domain.PendingDeletionRequest.create_default( user_id, user_settings.email, user_settings.role, normalized_long_term_username=normalized_long_term_username)) save_pending_deletion_requests(pending_deletion_requests)
def test_get_human_readable_contributors_summary_with_deleted_user(self): contributors_summary = {self.albert_id: 10} user_services.mark_user_for_deletion(self.albert_id) self.assertEqual( {'[User being deleted]': {'num_commits': 10}}, summary_services.get_human_readable_contributors_summary( contributors_summary ) )
def test_get_human_readable_user_ids_with_nonexistent_id_non_strict_passes( self): user_id = user_services.create_new_user('auth_id', '*****@*****.**').user_id user_services.set_username(user_id, 'username') user_services.mark_user_for_deletion(user_id) human_readable_user_ids = user_services.get_human_readable_user_ids( [user_id], strict=False) self.assertEqual(human_readable_user_ids, [user_services.LABEL_FOR_USER_BEING_DELETED])
def pre_delete_user(user_id): """Prepare user for the full deletion. 1. Mark all the activities that are private and solely owned by the user being deleted as deleted. 2. Disable all the email preferences. 3. Mark the user as to be deleted. 4. Create PendingDeletionRequestModel for the user. Args: user_id: str. The id of the user to be deleted. If the user_id corresponds to a profile user then only that profile is deleted. For a full user, all of its associated profile users are deleted too. """ pending_deletion_requests = [] user_settings = user_services.get_user_settings(user_id, strict=True) linked_profile_user_ids = [ user.user_id for user in user_services.get_all_profiles_auth_details_by_parent_user_id(user_id) ] profile_users_settings_list = user_services.get_users_settings( linked_profile_user_ids) for profile_user_settings in profile_users_settings_list: profile_id = profile_user_settings.user_id user_services.mark_user_for_deletion(profile_id) pending_deletion_requests.append( wipeout_domain.PendingDeletionRequest.create_default( profile_id, profile_user_settings.email, profile_user_settings.role)) if user_settings.role != feconf.ROLE_ID_LEARNER: _remove_user_from_activities_with_associated_rights_models( user_id, True) # Set all the user's email preferences to False in order to disable all # ordinary emails that could be sent to the users. user_services.update_email_preferences(user_id, False, False, False, False) user_services.mark_user_for_deletion(user_id) pending_deletion_requests.append( wipeout_domain.PendingDeletionRequest.create_default( user_id, user_settings.email, user_settings.role)) save_pending_deletion_requests(pending_deletion_requests)
def pre_delete_user(user_id): """Prepare user for the full deletion. 1. Mark all the activities that are private and solely owned by the user being deleted as deleted. 2. Disable all the email preferences. 3. Mark the user as to be deleted. 4. Create PendingDeletionRequestModel for the user. Args: user_id: str. The id of the user to be deleted. """ subscribed_exploration_summaries = ( exp_fetchers.get_exploration_summaries_subscribed_to(user_id)) explorations_to_be_deleted_ids = [ exp_summary.id for exp_summary in subscribed_exploration_summaries if exp_summary.is_private() and exp_summary.is_solely_owned_by_user(user_id)] exp_services.delete_explorations(user_id, explorations_to_be_deleted_ids) subscribed_collection_summaries = ( collection_services.get_collection_summaries_subscribed_to(user_id)) collections_to_be_deleted_ids = [ col_summary.id for col_summary in subscribed_collection_summaries if col_summary.is_private() and col_summary.is_solely_owned_by_user(user_id)] collection_services.delete_collections( user_id, collections_to_be_deleted_ids) # Set all the user's email preferences to False in order to disable all # ordinary emails that could be sent to the users. user_services.update_email_preferences(user_id, False, False, False, False) email = user_services.get_user_settings(user_id, strict=True).email user_services.mark_user_for_deletion(user_id) save_pending_deletion_request( wipeout_domain.PendingDeletionRequest.create_default( user_id, email, explorations_to_be_deleted_ids, collections_to_be_deleted_ids ) )
def pre_delete_user(user_id): """Prepare user for the full deletion. 1. Mark all the activities that are private and solely owned by the user being deleted as deleted. 2. Disable all the email preferences. 3. Mark the user as to be deleted. 4. Create PendingDeletionRequestModel for the user. Args: user_id: str. The id of the user to be deleted. """ subscribed_exploration_summaries = ( exp_fetchers.get_exploration_summaries_subscribed_to(user_id)) explorations_to_be_deleted_ids = [ exp_summary.id for exp_summary in subscribed_exploration_summaries if exp_summary.is_private() and exp_summary.is_solely_owned_by_user(user_id) ] # TODO(#8301): Implement delete_explorations to make this efficient. for exp_id in explorations_to_be_deleted_ids: exp_services.delete_exploration(user_id, exp_id) subscribed_collection_summaries = ( collection_services.get_collection_summaries_subscribed_to(user_id)) collections_to_be_deleted_ids = [ col_summary.id for col_summary in subscribed_collection_summaries if col_summary.is_private() and col_summary.is_solely_owned_by_user(user_id) ] # TODO(#8301): Implement delete_collections to make this efficient. for col_id in collections_to_be_deleted_ids: collection_services.delete_collection(user_id, col_id) # Set all the user's email preferences to False in order to disable all # ordinary emails that could be sent to the users. user_services.update_email_preferences(user_id, False, False, False, False) user_services.mark_user_for_deletion( user_id, explorations_to_be_deleted_ids, collections_to_be_deleted_ids, )
def pre_delete_user(user_id): """Prepare user for the full deletion. 1. Mark all the activities that are private and solely owned by the user being deleted as deleted. 2. Disable all the email preferences. 3. Mark the user as to be deleted. 4. Create PendingDeletionRequestModel for the user. Args: user_id: str. The id of the user to be deleted. If the user_id corresponds to a profile user then only that profile is deleted. For a full user, all of its associated profile users are deleted too. """ pending_deletion_requests = [] user_settings = user_services.get_user_settings(user_id, strict=True) linked_profile_user_ids = [ user.user_id for user in user_services.get_all_profiles_auth_details_by_parent_user_id(user_id) ] profile_users_settings_list = user_services.get_users_settings( linked_profile_user_ids) for profile_user_settings in profile_users_settings_list: profile_id = profile_user_settings.user_id user_services.mark_user_for_deletion(profile_id) pending_deletion_requests.append( wipeout_domain.PendingDeletionRequest.create_default( profile_id, profile_user_settings.email, profile_user_settings.role, [], [])) explorations_to_be_deleted_ids = [] collections_to_be_deleted_ids = [] if user_settings.role != feconf.ROLE_ID_LEARNER: subscribed_exploration_summaries = ( exp_fetchers.get_exploration_summaries_subscribed_to(user_id)) explorations_to_be_deleted_ids = [ exp_summary.id for exp_summary in subscribed_exploration_summaries if exp_summary.is_private() and exp_summary.is_solely_owned_by_user(user_id) ] exp_services.delete_explorations(user_id, explorations_to_be_deleted_ids) # Release ownership of explorations that are public and are solely owned # by the to-be-deleted user. explorations_to_release_ownership_ids = [ exp_summary.id for exp_summary in subscribed_exploration_summaries if not exp_summary.is_private() and exp_summary.is_solely_owned_by_user(user_id) ] for exp_id in explorations_to_release_ownership_ids: rights_manager.release_ownership_of_exploration( user_services.get_system_user(), exp_id) explorations_to_remove_user_from_ids = [ exp_summary.id for exp_summary in subscribed_exploration_summaries if not exp_summary.is_solely_owned_by_user(user_id) ] for exp_id in explorations_to_remove_user_from_ids: rights_manager.deassign_role_for_exploration( user_services.get_system_user(), exp_id, user_id) subscribed_collection_summaries = ( collection_services.get_collection_summaries_subscribed_to(user_id) ) collections_to_be_deleted_ids = [ col_summary.id for col_summary in subscribed_collection_summaries if col_summary.is_private() and col_summary.is_solely_owned_by_user(user_id) ] collection_services.delete_collections(user_id, collections_to_be_deleted_ids) # Release ownership of collections that are public and are solely owned # by the to-be-deleted user. collections_to_release_ownership_ids = [ col_summary.id for col_summary in subscribed_collection_summaries if not col_summary.is_private() and col_summary.is_solely_owned_by_user(user_id) ] for col_id in collections_to_release_ownership_ids: rights_manager.release_ownership_of_collection( user_services.get_system_user(), col_id) collections_to_remove_user_from_ids = [ col_summary.id for col_summary in subscribed_collection_summaries if not col_summary.is_solely_owned_by_user(user_id) ] for col_id in collections_to_remove_user_from_ids: rights_manager.deassign_role_for_collection( user_services.get_system_user(), col_id, user_id) topic_services.deassign_user_from_all_topics( user_services.get_system_user(), user_id) # Set all the user's email preferences to False in order to disable all # ordinary emails that could be sent to the users. user_services.update_email_preferences(user_id, False, False, False, False) user_services.mark_user_for_deletion(user_id) pending_deletion_requests.append( wipeout_domain.PendingDeletionRequest.create_default( user_id, user_settings.email, user_settings.role, explorations_to_be_deleted_ids, collections_to_be_deleted_ids)) save_pending_deletion_requests(pending_deletion_requests)