Skip to content

Commit a7cdaa6

Browse files
fix: redacting user retirement data in lms
1 parent 4834cce commit a7cdaa6

2 files changed

Lines changed: 8 additions & 12 deletions

File tree

openedx/core/djangoapps/user_api/accounts/tests/test_retirement_views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,7 @@ def test_simple_success(self):
10841084
retirements = UserRetirementStatus.objects.all()
10851085
assert retirements.count() == len(self.usernames)
10861086
for retirement in retirements:
1087+
# All three fields should have the same redacted value
10871088
assert retirement.original_username == 'redacted'
10881089
assert retirement.original_email == 'redacted'
10891090
assert retirement.original_name == 'redacted'

openedx/core/djangoapps/user_api/accounts/views.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,20 +1025,15 @@ def cleanup(self, request):
10251025
```
10261026
{
10271027
'usernames': ['user1', 'user2', ...],
1028-
'redacted_username': 'Value to store in original_username',
1029-
'redacted_email': 'Value to store in original_email',
1030-
'redacted_name': 'Value to store in original_name'
1028+
'redacted_value': 'Value to store in PII'
10311029
}
10321030
```
10331031
1034-
Deletes a batch of retirement requests by username.
1032+
Redacts a batch of retirement requests by redacting PII fields and username.
10351033
"""
10361034
try:
10371035
usernames = request.data["usernames"]
1038-
# Caller-provided redacted values; default to a safe constant if omitted
1039-
redacted_username = request.data.get("redacted_username", "redacted")
1040-
redacted_email = request.data.get("redacted_email", "redacted")
1041-
redacted_name = request.data.get("redacted_name", "redacted")
1036+
redacted_value = request.data.get("redacted_value", "redacted")
10421037

10431038
if not isinstance(usernames, list):
10441039
raise TypeError("Usernames should be an array.")
@@ -1053,11 +1048,11 @@ def cleanup(self, request):
10531048
raise UserRetirementStatus.DoesNotExist("Not all usernames exist in the COMPLETE state.")
10541049

10551050
# Redact PII fields instead of deleting records to prevent ETL tools
1056-
# from creating soft deletes with visible PII in downstream data warehouses.
1051+
# from creating soft deletes with visible PII in downstream data warehouses
10571052
for retirement in retirements:
1058-
retirement.original_username = redacted_username
1059-
retirement.original_email = redacted_email
1060-
retirement.original_name = redacted_name
1053+
retirement.original_username = redacted_value
1054+
retirement.original_email = redacted_value
1055+
retirement.original_name = redacted_value
10611056
retirement.save()
10621057

10631058
return Response(status=status.HTTP_204_NO_CONTENT)

0 commit comments

Comments
 (0)