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