From 1974b9a44952750e0f0110f9457d9f1094ec1beb Mon Sep 17 00:00:00 2001 From: Alex Dusenbery <adusenbery@edx.org> Date: Thu, 19 Apr 2018 15:35:39 -0400 Subject: [PATCH] EDUCATOR-2693 | Delete PendingEmailChanges for retired users. --- common/djangoapps/student/models.py | 6 +++- .../djangoapps/student/tests/test_models.py | 31 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/common/djangoapps/student/models.py b/common/djangoapps/student/models.py index 77bcd5abd1f..e24b76750d1 100644 --- a/common/djangoapps/student/models.py +++ b/common/djangoapps/student/models.py @@ -64,6 +64,7 @@ from openedx.core.djangoapps.content.course_overviews.models import CourseOvervi from openedx.core.djangoapps.request_cache import clear_cache, get_cache from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.xmodule_django.models import NoneToEmptyManager +from openedx.core.djangolib.model_mixins import DeletableByUserValue from track import contexts from util.milestones_helpers import is_entrance_exams_enabled from util.model_utils import emit_field_changed_events, get_changed_fields_dict @@ -676,7 +677,10 @@ class PendingNameChange(models.Model): rationale = models.CharField(blank=True, max_length=1024) -class PendingEmailChange(models.Model): +class PendingEmailChange(DeletableByUserValue, models.Model): + """ + This model keeps track of pending requested changes to a user's email address. + """ user = models.OneToOneField(User, unique=True, db_index=True) new_email = models.CharField(blank=True, max_length=255, db_index=True) activation_key = models.CharField(('activation key'), max_length=32, unique=True, db_index=True) diff --git a/common/djangoapps/student/tests/test_models.py b/common/djangoapps/student/tests/test_models.py index 8829518fd3e..ba5fc47db21 100644 --- a/common/djangoapps/student/tests/test_models.py +++ b/common/djangoapps/student/tests/test_models.py @@ -18,7 +18,7 @@ from openedx.core.djangoapps.content.course_overviews.models import CourseOvervi from openedx.core.djangoapps.schedules.models import Schedule from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory from openedx.core.djangolib.testing.utils import skip_unless_lms -from student.models import CourseEnrollment +from student.models import CourseEnrollment, PendingEmailChange from student.tests.factories import CourseEnrollmentFactory, UserFactory from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory @@ -197,3 +197,32 @@ class CourseEnrollmentTests(SharedModuleStoreTestCase): ScheduleFactory(enrollment=enrollment) self.assertIsNotNone(enrollment.schedule) self.assertIsNone(enrollment.upgrade_deadline) + + +class PendingEmailChangeTests(SharedModuleStoreTestCase): + """ + Tests the deletion of PendingEmailChange records. + """ + @classmethod + def setUpClass(cls): + super(PendingEmailChangeTests, cls).setUpClass() + cls.course = CourseFactory() + cls.user = UserFactory() + cls.user2 = UserFactory() + + def setUp(self): + self.email_change, _ = PendingEmailChange.objects.get_or_create( + user=self.user, + new_email='new@example.com', + activation_key='a' * 32 + ) + + def test_delete_by_user_removes_pending_email_change(self): + record_was_deleted = PendingEmailChange.delete_by_user_value(self.user, field='user') + self.assertTrue(record_was_deleted) + self.assertEqual(0, len(PendingEmailChange.objects.all())) + + def test_delete_by_user_no_effect_for_user_with_no_email_change(self): + record_was_deleted = PendingEmailChange.delete_by_user_value(self.user2, field='user') + self.assertFalse(record_was_deleted) + self.assertEqual(1, len(PendingEmailChange.objects.all())) -- GitLab