def _delete_user_database_info( self, user: User, cleanup_lib: CleanupLib, delete_owned_workspaces: bool = False, force_delete_all_user_revisions: bool = False, anonymize_if_required: bool = False, anonymized_user_display_name: typing.Optional[str] = None, ): print('trying to delete user {}: "{}"\n'.format( user.user_id, user.email)) deleted_workspace_ids = [] deleted_user_id = user.user_id should_anonymize = self.should_anonymize( user, owned_workspaces_will_be_deleted=delete_owned_workspaces, cleanup_lib=cleanup_lib) force_delete_all_associated_data = (force_delete_all_user_revisions and delete_owned_workspaces) revision_conflict_for_deleting_user = ( should_anonymize.blocking_revisions and not force_delete_all_associated_data) workspace_conflict_for_deleting_user = ( should_anonymize.blocking_workspaces and not delete_owned_workspaces) if (revision_conflict_for_deleting_user or workspace_conflict_for_deleting_user ) and not anonymize_if_required: raise UserCannotBeDeleted( 'user "{}" has revisions or workspaces left, cannot delete it'. format(user.user_id)) if delete_owned_workspaces: deleted_workspace_ids = cleanup_lib.delete_user_owned_workspace( user) print('owned workspace for user "{}" deleted'.format(user.user_id)) if force_delete_all_user_revisions: cleanup_lib.delete_user_revisions(user) print('all user "{}" revisions deleted'.format(user.user_id)) if should_anonymize.need_anonymization and not force_delete_all_associated_data: cleanup_lib.delete_user_associated_data(user) cleanup_lib.anonymize_user( user, anonymized_user_display_name=anonymized_user_display_name) print('user {} anonymized to "{} <{}>".'.format( user.user_id, user.display_name, user.email)) else: print('delete user "{}"'.format(user.user_id)) cleanup_lib.delete_user_associated_data(user) cleanup_lib.safe_delete(user) print('user "{}" deleted'.format(user.user_id)) self._session.flush() return DeleteResultIds(deleted_user_id, deleted_workspace_ids)
def test_unit__anonymize_user__ok__explicit_name(self, session, app_config) -> None: api = UserApi(current_user=None, session=session, config=app_config) u = api.create_minimal_user("bob@bob") assert u.display_name == "bob" assert u.email == "bob@bob" cleanup_lib = CleanupLib(app_config=app_config, session=session) cleanup_lib.anonymize_user(u, anonymized_user_display_name="anonymous") assert u.display_name == "anonymous" assert u.email.endswith("@anonymous.local")
def test_unit__anonymize_user__ok__nominal_case(self, session, app_config) -> None: api = UserApi(current_user=None, session=session, config=app_config) u = api.create_minimal_user(email="bob@bob", username="******") assert u.display_name == "bob" assert u.username == "bob" assert u.email == "bob@bob" cleanup_lib = CleanupLib(app_config=app_config, session=session) cleanup_lib.anonymize_user(u) assert u.display_name == "Deleted user" assert u.email.endswith("@anonymous.local") assert u.username is None
def take_app_action(self, parsed_args: argparse.Namespace, app_context: AppEnvironment) -> None: self._session = app_context["request"].dbsession self._app_config = app_context["registry"].settings["CFG"] if parsed_args.dry_run_mode: print("(!) Running in dry-run mode, not change will be applied.") app_context["request"].tm.doom() with unprotected_content_revision(self._session) as session: uapi = UserApi( config=self._app_config, session=session, current_user=None, show_deleted=True, show_deactivated=True, ) user_list = [] # type: typing.List[User] for login in parsed_args.logins: try: user = uapi.get_one_by_login(login) user_list.append(user) except UserDoesNotExist as exc: print('ERROR: user with email "{}" does not exist'.format( login)) raise exc for user in user_list: print("~~~~~~~~~~") cleanup_lib = CleanupLib(session, self._app_config, dry_run_mode=parsed_args.dry_run_mode) print("anonymize user {}.".format(user.user_id)) cleanup_lib.anonymize_user( user, anonymized_user_display_name=parsed_args.anonymize_name) self._session.flush() print('user {} anonymized to "{} <{}/{}>".'.format( user.user_id, user.display_name, user.email, user.username)) print("~~~~~~~~~~")