From 640569b81d0eae6c6b568540de2142a3f8b4b0b9 Mon Sep 17 00:00:00 2001 From: Daniel Nuzzo-Mueller Date: Sat, 4 Feb 2023 10:36:45 -0500 Subject: [PATCH 1/4] chore: Add limit parameter to get_retirement_users view --- .python-version | 1 + .../user_api/accounts/tests/test_retirement_views.py | 12 ++++++++++++ openedx/core/djangoapps/user_api/accounts/views.py | 11 ++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .python-version diff --git a/.python-version b/.python-version new file mode 100644 index 0000000000..77266c35f0 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +edx-platform diff --git a/openedx/core/djangoapps/user_api/accounts/tests/test_retirement_views.py b/openedx/core/djangoapps/user_api/accounts/tests/test_retirement_views.py index b8a3a02e66..8f34d4ba42 100644 --- a/openedx/core/djangoapps/user_api/accounts/tests/test_retirement_views.py +++ b/openedx/core/djangoapps/user_api/accounts/tests/test_retirement_views.py @@ -776,6 +776,18 @@ class TestAccountRetirementList(RetirementTestCase): self.assert_status_and_user_list(retirement_values, states_to_request=self._get_non_dead_end_states()) + def test_user_limit_works(self): + """ + Verify that request limiting works to limit returned amount. + """ + state = 'PENDING' + for _ in range(5): + create_retirement_status(UserFactory(), state=RetirementState.objects.get(state_name=state)) + data = {'cool_off_days': 0, 'states': state, 'limit': '2'} + response = self.client.get(self.url, data, **self.headers) + assert response.status_code == status.HTTP_200_OK + assert len(response.json()) == 2 + def test_date_filter(self): """ Verifies the functionality of the `cool_off_days` parameter by creating 1 retirement per day for diff --git a/openedx/core/djangoapps/user_api/accounts/views.py b/openedx/core/djangoapps/user_api/accounts/views.py index a558227b24..7787d6e743 100644 --- a/openedx/core/djangoapps/user_api/accounts/views.py +++ b/openedx/core/djangoapps/user_api/accounts/views.py @@ -917,7 +917,7 @@ class AccountRetirementStatusView(ViewSet): def retirement_queue(self, request): """ GET /api/user/v1/accounts/retirement_queue/ - {'cool_off_days': 7, 'states': ['PENDING', 'COMPLETE']} + {'cool_off_days': 7, 'states': ['PENDING', 'COMPLETE'], 'limit': 500} Returns the list of RetirementStatus users in the given states that were created in the retirement queue at least `cool_off_days` ago. @@ -936,6 +936,13 @@ class AccountRetirementStatusView(ViewSet): found = [s.state_name for s in state_objs] raise RetirementStateError(f'Unknown state. Requested: {states} Found: {found}') + limit = request.GET.get('limit') + if limit: + try: + limit_count = int(limit) + except ValueError: + return Response(f'Limit could not be parsed: {limit} , please ensure this is an integer', status=status.HTTP_400_BAD_REQUEST) + earliest_datetime = datetime.datetime.now(pytz.UTC) - datetime.timedelta(days=cool_off_days) retirements = UserRetirementStatus.objects.select_related( @@ -945,6 +952,8 @@ class AccountRetirementStatusView(ViewSet): ).order_by( 'id' ) + if limit: + retirements = retirements[:limit_count] serializer = UserRetirementStatusSerializer(retirements, many=True) return Response(serializer.data) # This should only occur on the int() conversion of cool_off_days at this point From b3690ef88bbaead0a28e8cc76fd8263ae66f18c1 Mon Sep 17 00:00:00 2001 From: Daniel Nuzzo-Mueller Date: Sun, 5 Feb 2023 08:49:15 -0500 Subject: [PATCH 2/4] chore: Try to fix linting --- openedx/core/djangoapps/user_api/accounts/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openedx/core/djangoapps/user_api/accounts/views.py b/openedx/core/djangoapps/user_api/accounts/views.py index 7787d6e743..f006083006 100644 --- a/openedx/core/djangoapps/user_api/accounts/views.py +++ b/openedx/core/djangoapps/user_api/accounts/views.py @@ -941,7 +941,10 @@ class AccountRetirementStatusView(ViewSet): try: limit_count = int(limit) except ValueError: - return Response(f'Limit could not be parsed: {limit} , please ensure this is an integer', status=status.HTTP_400_BAD_REQUEST) + return Response( + f'Limit could not be parsed: {limit}, please ensure this is an integer' + ,status=status.HTTP_400_BAD_REQUEST + ) earliest_datetime = datetime.datetime.now(pytz.UTC) - datetime.timedelta(days=cool_off_days) From f6a5a9995820c73d20e02447658cbe00fc0a982b Mon Sep 17 00:00:00 2001 From: Daniel Nuzzo-Mueller Date: Mon, 6 Feb 2023 11:00:57 -0500 Subject: [PATCH 3/4] chore: linting fix --- openedx/core/djangoapps/user_api/accounts/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openedx/core/djangoapps/user_api/accounts/views.py b/openedx/core/djangoapps/user_api/accounts/views.py index f006083006..13b7ad39f6 100644 --- a/openedx/core/djangoapps/user_api/accounts/views.py +++ b/openedx/core/djangoapps/user_api/accounts/views.py @@ -942,9 +942,9 @@ class AccountRetirementStatusView(ViewSet): limit_count = int(limit) except ValueError: return Response( - f'Limit could not be parsed: {limit}, please ensure this is an integer' - ,status=status.HTTP_400_BAD_REQUEST - ) + f'Limit could not be parsed: {limit}, please ensure this is an integer', + status=status.HTTP_400_BAD_REQUEST + ) earliest_datetime = datetime.datetime.now(pytz.UTC) - datetime.timedelta(days=cool_off_days) From 358d9ed8733ea43d131ef08998da8a61ea984edc Mon Sep 17 00:00:00 2001 From: Daniel Nuzzo-Mueller Date: Tue, 7 Feb 2023 09:27:34 -0500 Subject: [PATCH 4/4] fix(extra file): Remove .python-version file --- .python-version | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .python-version diff --git a/.python-version b/.python-version deleted file mode 100644 index 77266c35f0..0000000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -edx-platform