From 21a215f7e989e01430c36cd7392df29c6a5f07c8 Mon Sep 17 00:00:00 2001 From: rahul-apphelix Date: Wed, 12 Aug 2026 14:46:38 +0530 Subject: [PATCH] fix: skip header row in retire_user CSV --- .../management/commands/retire_user.py | 2 ++ .../management/tests/test_retire_user.py | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/openedx/core/djangoapps/user_api/management/commands/retire_user.py b/openedx/core/djangoapps/user_api/management/commands/retire_user.py index e6577e1c5960..ec8e973ca9c5 100644 --- a/openedx/core/djangoapps/user_api/management/commands/retire_user.py +++ b/openedx/core/djangoapps/user_api/management/commands/retire_user.py @@ -70,6 +70,8 @@ def append_users_lists(self, file_handler, user_model): userdata = record.split(',') username = userdata[0].strip() user_email = userdata[1].strip() + if username.lower() == 'username' and user_email.lower() in ('email', 'user_email'): + continue try: users.append(User.objects.get(username=username, email=user_email)) except user_model.DoesNotExist: diff --git a/openedx/core/djangoapps/user_api/management/tests/test_retire_user.py b/openedx/core/djangoapps/user_api/management/tests/test_retire_user.py index 9eab190a0687..3451578d0601 100644 --- a/openedx/core/djangoapps/user_api/management/tests/test_retire_user.py +++ b/openedx/core/djangoapps/user_api/management/tests/test_retire_user.py @@ -95,6 +95,30 @@ def test_successful_retire_with_userfile(setup_retirement_states): # pylint: di remove_user_file() +@skip_unless_lms +def test_successful_retire_with_userfile_header( # pylint: disable=redefined-outer-name, unused-argument # noqa: F811 + setup_retirement_states +): + user = UserFactory.create(username='header-user', email="header-user@example.com") + username = user.username + user_email = user.email + with open(user_file, 'w', newline='') as file: + write = csv.writer(file) + write.writerow(['username', 'email']) + write.writerow([username, user_email]) + + try: + call_command('retire_user', user_file=user_file) + user = User.objects.get(username=username) + retired_user_status = UserRetirementStatus.objects.all()[0] + assert retired_user_status.original_username == username + assert retired_user_status.original_email == user_email + # Make sure that we have changed the email address linked to the original user + assert user.email != user_email + finally: + remove_user_file() + + @skip_unless_lms def test_retire_user_with_usename_email_mismatch(setup_retirement_states): # pylint: disable=redefined-outer-name, unused-argument # noqa: F811 create_user_file(True)