Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: create lms retirement listener for verified name #221

Merged
merged 1 commit into from
Sep 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion edx_name_affirmation/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
Django app housing name affirmation logic.
"""

__version__ = '2.4.1'
__version__ = '2.4.2'
9 changes: 9 additions & 0 deletions edx_name_affirmation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,15 @@ class VerifiedName(TimeStampedModel):
)
history = HistoricalRecords()

@classmethod
def retire_user(cls, user_id):
"""
Retire user as part of GDPR pipeline
:param user_id: int
"""
verified_names = cls.objects.filter(user_id=user_id)
verified_names.delete()

class Meta:
""" Meta class for this Django model """
db_table = 'nameaffirmation_verifiedname'
Expand Down
16 changes: 16 additions & 0 deletions edx_name_affirmation/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,21 @@
"""

from django.dispatch import Signal
from django.dispatch.dispatcher import receiver

try:
from openedx.core.djangoapps.user_api.accounts.signals import USER_RETIRE_LMS_MISC
except ImportError:
# An ImportError should only be raised in tests, where the code is not running as an installation of
# edx-platform. In this case, the import should default to a generic Signal.
USER_RETIRE_LMS_MISC = Signal()

from .models import VerifiedName

VERIFIED_NAME_APPROVED = Signal()


@receiver(USER_RETIRE_LMS_MISC)
def _listen_for_lms_retire_verified_names(sender, **kwargs): # pylint: disable=unused-argument
user = kwargs.get('user')
VerifiedName.retire_user(user.id)
66 changes: 66 additions & 0 deletions edx_name_affirmation/tests/test_signals.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""
Tests for Name Affirmation signals
"""

import ddt

from django.contrib.auth import get_user_model
from django.test import TestCase

from edx_name_affirmation.models import VerifiedName
from edx_name_affirmation.signals import _listen_for_lms_retire_verified_names

User = get_user_model()


@ddt.ddt
class RetirementSignalVerifiedNamesTest(TestCase):
"""
Tests for the LMS User Retirement signal for Verified Names
"""

def setUp(self):
varshamenon4 marked this conversation as resolved.
Show resolved Hide resolved
self.user = User(username='tester', email='[email protected]')
self.user.save()
self.name = 'Jonathan Smith'
self.profile_name = 'Jon Smith'
self.idv_attempt_id = 1111111
self.verified_name_obj = VerifiedName.objects.create(
user=self.user,
verified_name=self.name,
profile_name=self.profile_name,
verification_attempt_id=self.idv_attempt_id
)

self.other_user = User(username='other_tester', email='[email protected]')
self.other_user.save()
self.other_name = 'Jonathan Other'
self.other_profile_name = 'Jon Other'
self.other_idv_attempt_id = 1111112
self.verified_name_obj = VerifiedName.objects.create(
user=self.other_user,
verified_name=self.other_name,
profile_name=self.other_profile_name,
verification_attempt_id=self.other_idv_attempt_id
)

def test_retirement_signal(self):
varshamenon4 marked this conversation as resolved.
Show resolved Hide resolved
_listen_for_lms_retire_verified_names(sender=self.__class__, user=self.user)
self.assertEqual(len(VerifiedName.objects.filter(user=self.user)), 0)
self.assertEqual(len(VerifiedName.objects.filter(user=self.other_user)), 1)

def test_retirement_signal_no_verified_names(self):
no_verified_user = User(username='no_verified', email='[email protected]')
_listen_for_lms_retire_verified_names(sender=self.__class__, user=no_verified_user)
self.assertEqual(len(VerifiedName.objects.all()), 2)

def test_retirement_signal_all_verified_names_for_user(self):
# create a second verified name for user to check that both names are deleted
VerifiedName.objects.create(
user=self.user,
verified_name='J Smith',
profile_name=self.profile_name,
verification_attempt_id=1111112
)
_listen_for_lms_retire_verified_names(sender=self.__class__, user=self.user)
self.assertEqual(len(VerifiedName.objects.filter(user=self.user)), 0)
Loading