diff --git a/credentials/apps/api/v2/tests/test_views.py b/credentials/apps/api/v2/tests/test_views.py index a0c1b65cc..905ca97d8 100644 --- a/credentials/apps/api/v2/tests/test_views.py +++ b/credentials/apps/api/v2/tests/test_views.py @@ -691,3 +691,15 @@ def test_existing_and_non_existing_users(self): response = self.call_api(self.service_user, data) self.assertEqual(response.status_code, 200) self.assertEqual(response.data, expected_response) + + def test_clears_full_name_for_replaced_user(self): + """Verify username replacement also clears full_name for user retirement.""" + user = UserFactory(full_name="Jane Example") + new_username = f"{user.username}_retired" + + response = self.call_api(self.service_user, {"username_mappings": [{user.username: new_username}]}) + + self.assertEqual(response.status_code, 200) + user.refresh_from_db() + self.assertEqual(user.username, new_username) + self.assertEqual(user.full_name, "") diff --git a/credentials/apps/api/v2/views.py b/credentials/apps/api/v2/views.py index 00b0de9c4..c1d984444 100644 --- a/credentials/apps/api/v2/views.py +++ b/credentials/apps/api/v2/views.py @@ -263,9 +263,11 @@ def _replace_username_for_all_models(self, current_username, new_username, repla with transaction.atomic(): num_rows_changed = 0 for model, column in replacement_locations: - num_rows_changed += model.objects.filter(**{column: current_username}).update( - **{column: new_username} - ) + update_kwargs = {column: new_username} + # Clear full_name for user retirement anonymization + if model._meta.label_lower == "core.user" and column == "username": + update_kwargs["full_name"] = "" + num_rows_changed += model.objects.filter(**{column: current_username}).update(**update_kwargs) except Exception as exc: log.exception( "Unable to change username from %s to %s. Failed on table %s because %s",