From e7bdbe6846da7cfac089359b24dd8072df7635a6 Mon Sep 17 00:00:00 2001 From: John Eskew Date: Sun, 29 Apr 2018 10:43:36 -0400 Subject: [PATCH 1/2] Process states param to gather all passed-in states. --- openedx/core/djangoapps/user_api/accounts/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openedx/core/djangoapps/user_api/accounts/views.py b/openedx/core/djangoapps/user_api/accounts/views.py index 8906c35528..010b270909 100644 --- a/openedx/core/djangoapps/user_api/accounts/views.py +++ b/openedx/core/djangoapps/user_api/accounts/views.py @@ -396,11 +396,13 @@ class AccountRetirementView(ViewSet): """ try: cool_off_days = int(request.GET['cool_off_days']) - states = request.GET['states'].split(',') - if cool_off_days < 0: raise RetirementStateError('Invalid argument for cool_off_days, must be greater than 0.') + states = request.GET.getlist('states') + if not states: + raise RetirementStateError('Param "states" required with at least one state.') + state_objs = RetirementState.objects.filter(state_name__in=states) if state_objs.count() != len(states): found = [s.state_name for s in state_objs] From 891b9a64de78541fb8553066c1fe96440d2bcf45 Mon Sep 17 00:00:00 2001 From: John Eskew Date: Mon, 30 Apr 2018 13:38:29 -0400 Subject: [PATCH 2/2] Add a test for multiple learner states. --- .../user_api/accounts/tests/test_views.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/openedx/core/djangoapps/user_api/accounts/tests/test_views.py b/openedx/core/djangoapps/user_api/accounts/tests/test_views.py index 2ffd87f840..77ffa275b5 100644 --- a/openedx/core/djangoapps/user_api/accounts/tests/test_views.py +++ b/openedx/core/djangoapps/user_api/accounts/tests/test_views.py @@ -1263,7 +1263,7 @@ class TestAccountRetirementList(RetirementTestCase): except AttributeError: states_to_request = states_to_request - data = {'cool_off_days': cool_off_days, 'states': ','.join(states_to_request)} + data = {'cool_off_days': cool_off_days, 'states': states_to_request} response = self.client.get(self.url, data, **self.headers) self.assertEqual(response.status_code, expected_status) response_data = response.json() @@ -1291,6 +1291,18 @@ class TestAccountRetirementList(RetirementTestCase): self._create_retirement(state) self.assert_status_and_user_list([], states_to_request=self._get_non_dead_end_states()) + def test_users_retrieved_in_multiple_states(self): + """ + Verify that if multiple states are requested, learners in each state are returned. + """ + multiple_states = ['PENDING', 'FORUMS_COMPLETE'] + for state in multiple_states: + self._create_retirement(RetirementState.objects.get(state_name=state)) + data = {'cool_off_days': 0, 'states': multiple_states} + response = self.client.get(self.url, data, **self.headers) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.json()), 2) + def test_users_exist(self): """ Verify users in different states are returned with correct data or filtered out