Add retirement stage API that adds a user to the partner reporting queue
This commit is contained in:
@@ -193,10 +193,10 @@ class RetirementTestCase(TestCase):
|
||||
('ENROLLMENTS_COMPLETE', 130, False, False),
|
||||
('RETIRING_NOTES', 140, False, False),
|
||||
('NOTES_COMPLETE', 150, False, False),
|
||||
('NOTIFYING_PARTNERS', 160, False, False),
|
||||
('PARTNERS_NOTIFIED', 170, False, False),
|
||||
('RETIRING_LMS', 180, False, False),
|
||||
('LMS_COMPLETE', 190, False, False),
|
||||
('RETIRING_LMS', 160, False, False),
|
||||
('LMS_COMPLETE', 170, False, False),
|
||||
('ADDING_TO_PARTNER_QUEUE', 180, False, False),
|
||||
('PARTNER_QUEUE_COMPLETE', 190, False, False),
|
||||
('ERRORED', 200, True, True),
|
||||
('ABORTED', 210, True, True),
|
||||
('COMPLETE', 220, True, True),
|
||||
@@ -560,6 +560,68 @@ class TestPartnerReportingCleanup(ModuleStoreTestCase):
|
||||
self.assert_status_and_count(statuses, len(statuses))
|
||||
|
||||
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Account APIs are only supported in LMS')
|
||||
class TestPartnerReportingPut(RetirementTestCase, ModuleStoreTestCase):
|
||||
"""
|
||||
Tests the partner reporting list endpoint
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super(TestPartnerReportingPut, self).setUp()
|
||||
self.test_superuser = SuperuserFactory()
|
||||
self.course = CourseFactory()
|
||||
self.course_awesome_org = CourseFactory(org='awesome_org')
|
||||
self.courses = (self.course, self.course_awesome_org)
|
||||
self.headers = build_jwt_headers(self.test_superuser)
|
||||
self.url = reverse('accounts_retirement_partner_report')
|
||||
self.headers['content_type'] = "application/json"
|
||||
self.maxDiff = None
|
||||
self.partner_queue_state = RetirementState.objects.get(state_name='ADDING_TO_PARTNER_QUEUE')
|
||||
|
||||
def post_and_assert_status(self, data, expected_status=status.HTTP_204_NO_CONTENT):
|
||||
"""
|
||||
Helper function for making a request to the retire subscriptions endpoint, and asserting the status.
|
||||
"""
|
||||
response = self.client.put(self.url, json.dumps(data), **self.headers)
|
||||
self.assertEqual(response.status_code, expected_status)
|
||||
return response
|
||||
|
||||
def test_success(self):
|
||||
"""
|
||||
Checks the simple success case of creating a user, enrolling in a course, and doing the partner
|
||||
report PUT. User should then have the appropriate row in UserRetirementPartnerReportingStatus
|
||||
"""
|
||||
retirement = self._create_retirement(self.partner_queue_state)
|
||||
for course in self.courses:
|
||||
CourseEnrollment.enroll(user=retirement.user, course_key=course.id)
|
||||
|
||||
self.post_and_assert_status({'username': retirement.original_username})
|
||||
self.assertTrue(UserRetirementPartnerReportingStatus.objects.filter(user=retirement.user).exists())
|
||||
|
||||
def test_idempotent(self):
|
||||
"""
|
||||
Runs the success test twice to make sure that re-running the step still succeeds.
|
||||
"""
|
||||
retirement = self._create_retirement(self.partner_queue_state)
|
||||
for course in self.courses:
|
||||
CourseEnrollment.enroll(user=retirement.user, course_key=course.id)
|
||||
|
||||
# We really do want this twice.
|
||||
self.post_and_assert_status({'username': retirement.original_username})
|
||||
self.post_and_assert_status({'username': retirement.original_username})
|
||||
self.assertTrue(UserRetirementPartnerReportingStatus.objects.filter(user=retirement.user).exists())
|
||||
|
||||
def test_unknown_user(self):
|
||||
"""
|
||||
Checks that a username with no active retirement generates a 404
|
||||
"""
|
||||
user = UserFactory()
|
||||
for course in self.courses:
|
||||
CourseEnrollment.enroll(user=user, course_key=course.id)
|
||||
|
||||
self.post_and_assert_status({'username': user.username}, status.HTTP_404_NOT_FOUND)
|
||||
|
||||
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Account APIs are only supported in LMS')
|
||||
class TestPartnerReportingList(ModuleStoreTestCase):
|
||||
"""
|
||||
@@ -624,7 +686,7 @@ class TestPartnerReportingList(ModuleStoreTestCase):
|
||||
|
||||
def assert_status_and_user_list(self, expected_users, expected_status=status.HTTP_200_OK):
|
||||
"""
|
||||
Makes the partner reporting list GET and asserts that the given users are
|
||||
Makes the partner reporting list POST and asserts that the given users are
|
||||
in the returned list, as well as asserting the expected HTTP status code
|
||||
is returned.
|
||||
"""
|
||||
|
||||
@@ -572,6 +572,38 @@ class AccountRetirementPartnerReportView(ViewSet):
|
||||
|
||||
return Response(serializer.data)
|
||||
|
||||
@request_requires_username
|
||||
def retirement_partner_status_create(self, request):
|
||||
"""
|
||||
PUT /api/user/v1/accounts/retirement_partner_report/
|
||||
|
||||
{
|
||||
'username': 'user_to_retire'
|
||||
}
|
||||
|
||||
Creates a UserRetirementPartnerReportingStatus object for the given user
|
||||
as part of the retirement pipeline.
|
||||
"""
|
||||
username = request.data['username']
|
||||
|
||||
try:
|
||||
retirement = UserRetirementStatus.get_retirement_for_retirement_action(username)
|
||||
orgs = self._get_orgs_for_user(retirement.user)
|
||||
|
||||
if orgs:
|
||||
UserRetirementPartnerReportingStatus.objects.get_or_create(
|
||||
user=retirement.user,
|
||||
defaults={
|
||||
'original_username': retirement.original_username,
|
||||
'original_email': retirement.original_email,
|
||||
'original_name': retirement.original_name
|
||||
}
|
||||
)
|
||||
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
except UserRetirementStatus.DoesNotExist:
|
||||
return Response(status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
def retirement_partner_cleanup(self, request):
|
||||
"""
|
||||
DELETE /api/user/v1/accounts/retirement_partner_report/
|
||||
|
||||
@@ -35,6 +35,7 @@ ACCOUNT_DETAIL = AccountViewSet.as_view({
|
||||
|
||||
PARTNER_REPORT = AccountRetirementPartnerReportView.as_view({
|
||||
'post': 'retirement_partner_report',
|
||||
'put': 'retirement_partner_status_create',
|
||||
'delete': 'retirement_partner_cleanup'
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user