From b868382d657ee90ca094fcc0ecfcb0a80116bca4 Mon Sep 17 00:00:00 2001 From: rahul-apphelix Date: Tue, 11 Aug 2026 17:13:46 +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 af58a06b2672..7eac22bb1d98 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 6279d885b2ba..b3fb0a17f6a8 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): # lint-amnes remove_user_file() +@skip_unless_lms +def test_successful_retire_with_userfile_header( + setup_retirement_states +): # lint-amnesty, pylint: disable=redefined-outer-name, unused-argument + 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): # lint-amnesty, pylint: disable=redefined-outer-name, unused-argument create_user_file(True)