Add retirement stage API that adds a user to the partner reporting queue

This commit is contained in:
bmedx
2018-06-14 19:16:53 -04:00
parent 75d71097b8
commit 706d3dd395
3 changed files with 100 additions and 5 deletions

View File

@@ -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.
"""

View File

@@ -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/

View File

@@ -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'
})