Example #1
0
    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)
Example #2
0
 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")
Example #3
0
 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
Example #4
0
    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("~~~~~~~~~~")