diff --git a/openedx/core/djangoapps/credit/models.py b/openedx/core/djangoapps/credit/models.py index 0b69f664e8..571b286ee8 100644 --- a/openedx/core/djangoapps/credit/models.py +++ b/openedx/core/djangoapps/credit/models.py @@ -681,6 +681,21 @@ class CreditRequest(TimeStampedModel): unique_together = ('username', 'course', 'provider') get_latest_by = 'created' + @classmethod + def retire_user(cls, original_username, retired_username): + """ + Obfuscates CreditRecord instances associated with `original_username`. + Empties the records' `parameters` field and replaces username with its + anonymized value, `retired_username`. + """ + num_updated_credit_requests = cls.objects.filter( + username=original_username + ).update( + username=retired_username, + parameters={}, + ) + return num_updated_credit_requests > 0 + @classmethod def credit_requests_for_user(cls, username): """ diff --git a/openedx/core/djangoapps/credit/tests/test_models.py b/openedx/core/djangoapps/credit/tests/test_models.py index 51deb517af..ed6bd7ae4d 100644 --- a/openedx/core/djangoapps/credit/tests/test_models.py +++ b/openedx/core/djangoapps/credit/tests/test_models.py @@ -10,6 +10,9 @@ from opaque_keys.edx.keys import CourseKey from openedx.core.djangoapps.credit.models import CreditCourse, CreditRequirement, CreditRequirementStatus from student.models import get_retired_username_by_username +from student.tests.factories import UserFactory + +from ..models import CreditRequest, CreditProvider, CreditCourse def add_credit_course(course_key): @@ -145,7 +148,9 @@ class CreditRequirementStatusTests(TestCase): retirement_succeeded = CreditRequirementStatus.retire_user(self.old_username) self.assertTrue(retirement_succeeded) - old_username_records_exist = CreditRequirementStatus.objects.filter(username=self.old_username).exists() + old_username_records_exist = CreditRequirementStatus.objects.filter( + username=self.old_username + ).exists() self.assertFalse(old_username_records_exist) new_username_records_exist = CreditRequirementStatus.objects.filter(username=self.retired_username).exists() @@ -154,3 +159,66 @@ class CreditRequirementStatusTests(TestCase): def test_retire_user_with_data(self): retirement_succeeded = CreditRequirementStatus.retire_user(self.retired_username) self.assertFalse(retirement_succeeded) + + +class CreditRequestTest(TestCase): + """ + The CreditRequest model's test suite. + """ + + def setUp(self): + super(CreditRequestTest, self).setUp() + self.user = UserFactory.create() + self.credit_course = CreditCourse.objects.create() + self.provider = CreditProvider.objects.create() + + def test_can_retire_user_from_credit_request(self): + test_parameters = {'hi': 'there'} + CreditRequest.objects.create( + username=self.user.username, + course=self.credit_course, + provider=self.provider, + parameters=test_parameters, + ) + + credit_request_before_retire = CreditRequest.objects.filter( + username=self.user.username + )[0] + + self.assertEqual(credit_request_before_retire.parameters, test_parameters) + + user_was_retired = CreditRequest.retire_user( + original_username=self.user.username, + retired_username=get_retired_username_by_username(self.user.username) + ) + credit_request_before_retire.refresh_from_db() + credit_requests_after_retire = CreditRequest.objects.filter( + username=self.user.username + ) + + self.assertTrue(user_was_retired) + self.assertEqual(credit_request_before_retire.parameters, {}) + self.assertFalse(credit_requests_after_retire.exists()) + + def test_cannot_retire_nonexistent_user(self): + test_parameters = {'hi': 'there'} + CreditRequest.objects.create( + username=self.user.username, + course=self.credit_course, + provider=self.provider, + parameters=test_parameters, + ) + another_user = UserFactory.create() + + credit_request_before_retire = CreditRequest.objects.filter( + username=self.user.username + )[0] + + was_retired = CreditRequest.retire_user( + original_username=another_user.username, + retired_username=get_retired_username_by_username(another_user.username) + ) + credit_request_before_retire.refresh_from_db() + + self.assertFalse(was_retired) + self.assertEqual(credit_request_before_retire.parameters, test_parameters)