From 17b0570e3785e50b347d9eba3f9bd4516cf08ed5 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Wed, 27 Jan 2021 03:20:12 +0530 Subject: Apply LimitOffsetPagination in GET Infraction with default Page Size 100 --- pydis_site/apps/api/viewsets/bot/infraction.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 423e806e..b89c3386 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -3,6 +3,7 @@ from django_filters.rest_framework import DjangoFilterBackend from rest_framework.decorators import action from rest_framework.exceptions import ValidationError from rest_framework.filters import OrderingFilter, SearchFilter +from rest_framework.pagination import LimitOffsetPagination from rest_framework.mixins import ( CreateModelMixin, DestroyModelMixin, @@ -133,6 +134,7 @@ class InfractionViewSet( serializer_class = InfractionSerializer queryset = Infraction.objects.all() + pagination_class = LimitOffsetPagination filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) filter_fields = ('user__id', 'actor__id', 'active', 'hidden', 'type') search_fields = ('$reason',) -- cgit v1.2.3 From a67d3d9abfebfc45cef2ed98bb727de02156d113 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Wed, 27 Jan 2021 04:01:33 +0530 Subject: fix: flake8 error --- pydis_site/apps/api/viewsets/bot/infraction.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index b89c3386..2ccb35dd 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -3,21 +3,15 @@ from django_filters.rest_framework import DjangoFilterBackend from rest_framework.decorators import action from rest_framework.exceptions import ValidationError from rest_framework.filters import OrderingFilter, SearchFilter +from rest_framework.mixins import (CreateModelMixin, DestroyModelMixin, + ListModelMixin, RetrieveModelMixin) from rest_framework.pagination import LimitOffsetPagination -from rest_framework.mixins import ( - CreateModelMixin, - DestroyModelMixin, - ListModelMixin, - RetrieveModelMixin -) from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet from pydis_site.apps.api.models.bot.infraction import Infraction -from pydis_site.apps.api.serializers import ( - ExpandedInfractionSerializer, - InfractionSerializer -) +from pydis_site.apps.api.serializers import (ExpandedInfractionSerializer, + InfractionSerializer) class InfractionViewSet( -- cgit v1.2.3 From d1955b7a87fcd126b3c0a6b33ec2e7df6495b3de Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Thu, 28 Jan 2021 02:40:17 +0530 Subject: update paginated response in list infraction --- pydis_site/apps/api/viewsets/bot/infraction.py | 15 +++++++++++++++ pydis_site/settings.py | 5 ++--- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 2ccb35dd..851eae34 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -133,6 +133,21 @@ class InfractionViewSet( filter_fields = ('user__id', 'actor__id', 'active', 'hidden', 'type') search_fields = ('$reason',) frozen_fields = ('id', 'inserted_at', 'type', 'user', 'actor', 'hidden') + LimitOffsetPagination.default_limit = 100 + + def list(self, request: HttpRequest, *args, **kwargs) -> Response: + """ + DRF method for listing Infraction entries. + + Called by the Django Rest Framework in response to the corresponding HTTP request. + """ + queryset = self.filter_queryset(self.get_queryset()) + page = self.paginate_queryset(queryset) + if page: + serializer = self.get_serializer(page, many=True) + return Response(self.get_paginated_response(serializer.data).data.get('results')) + serializer = InfractionSerializer(queryset, many=True) + return Response(serializer.data) def partial_update(self, request: HttpRequest, *_args, **_kwargs) -> Response: """Method that handles the nuts and bolts of updating an Infraction.""" diff --git a/pydis_site/settings.py b/pydis_site/settings.py index a98b5712..8f5c58ef 100644 --- a/pydis_site/settings.py +++ b/pydis_site/settings.py @@ -230,9 +230,8 @@ REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.DjangoModelPermissions', ), - 'TEST_REQUEST_DEFAULT_FORMAT': 'json', - 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', - 'PAGE_SIZE': 100, + 'TEST_REQUEST_DEFAULT_FORMAT': 'json' + } # Logging -- cgit v1.2.3 From 83b5f8ebd9c17fe6a444765f8d3a8ead431fa916 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Thu, 28 Jan 2021 03:05:53 +0530 Subject: Styling fixes --- pydis_site/apps/api/viewsets/bot/infraction.py | 17 ++++++++++++----- pydis_site/settings.py | 1 - 2 files changed, 12 insertions(+), 6 deletions(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 851eae34..6464c1b9 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -3,15 +3,21 @@ from django_filters.rest_framework import DjangoFilterBackend from rest_framework.decorators import action from rest_framework.exceptions import ValidationError from rest_framework.filters import OrderingFilter, SearchFilter -from rest_framework.mixins import (CreateModelMixin, DestroyModelMixin, - ListModelMixin, RetrieveModelMixin) +from rest_framework.mixins import ( + CreateModelMixin, + DestroyModelMixin, + ListModelMixin, + RetrieveModelMixin +) from rest_framework.pagination import LimitOffsetPagination from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet from pydis_site.apps.api.models.bot.infraction import Infraction -from pydis_site.apps.api.serializers import (ExpandedInfractionSerializer, - InfractionSerializer) +from pydis_site.apps.api.serializers import ( + ExpandedInfractionSerializer, + InfractionSerializer +) class InfractionViewSet( @@ -145,7 +151,8 @@ class InfractionViewSet( page = self.paginate_queryset(queryset) if page: serializer = self.get_serializer(page, many=True) - return Response(self.get_paginated_response(serializer.data).data.get('results')) + result = self.get_paginated_response(serializer.data) + return Response(result.data.get('results')) serializer = InfractionSerializer(queryset, many=True) return Response(serializer.data) diff --git a/pydis_site/settings.py b/pydis_site/settings.py index 8f5c58ef..50caab80 100644 --- a/pydis_site/settings.py +++ b/pydis_site/settings.py @@ -231,7 +231,6 @@ REST_FRAMEWORK = { 'rest_framework.permissions.DjangoModelPermissions', ), 'TEST_REQUEST_DEFAULT_FORMAT': 'json' - } # Logging -- cgit v1.2.3 From 26e19ff1537856918aaf9b7d717fa10dc70fabc8 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Thu, 25 Feb 2021 06:10:02 +0530 Subject: Add custom paginator class to override default resonse --- pydis_site/apps/api/viewsets/bot/infraction.py | 23 +++++------------------ pydis_site/apps/api/viewsets/bot/pagination.py | 12 ++++++++++++ 2 files changed, 17 insertions(+), 18 deletions(-) create mode 100644 pydis_site/apps/api/viewsets/bot/pagination.py (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 6464c1b9..2b0bbf3e 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -9,7 +9,6 @@ from rest_framework.mixins import ( ListModelMixin, RetrieveModelMixin ) -from rest_framework.pagination import LimitOffsetPagination from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet @@ -18,6 +17,7 @@ from pydis_site.apps.api.serializers import ( ExpandedInfractionSerializer, InfractionSerializer ) +from pydis_site.apps.api.viewsets.bot.pagination import LimitSetPagination class InfractionViewSet( @@ -39,6 +39,8 @@ class InfractionViewSet( - **active** `bool`: whether the infraction is still active - **actor__id** `int`: snowflake of the user which applied the infraction - **hidden** `bool`: whether the infraction is a shadow infraction + - **limit** `int`: default limit is 100 + - **offset** `int`: default is 0 - **search** `str`: regular expression applied to the infraction's reason - **type** `str`: the type of the infraction - **user__id** `int`: snowflake of the user to which the infraction was applied @@ -47,6 +49,7 @@ class InfractionViewSet( Invalid query parameters are ignored. #### Response format + - Response are paginated but only the actual data is returned >>> [ ... { ... 'id': 5, @@ -134,27 +137,11 @@ class InfractionViewSet( serializer_class = InfractionSerializer queryset = Infraction.objects.all() - pagination_class = LimitOffsetPagination + pagination_class = LimitSetPagination filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) filter_fields = ('user__id', 'actor__id', 'active', 'hidden', 'type') search_fields = ('$reason',) frozen_fields = ('id', 'inserted_at', 'type', 'user', 'actor', 'hidden') - LimitOffsetPagination.default_limit = 100 - - def list(self, request: HttpRequest, *args, **kwargs) -> Response: - """ - DRF method for listing Infraction entries. - - Called by the Django Rest Framework in response to the corresponding HTTP request. - """ - queryset = self.filter_queryset(self.get_queryset()) - page = self.paginate_queryset(queryset) - if page: - serializer = self.get_serializer(page, many=True) - result = self.get_paginated_response(serializer.data) - return Response(result.data.get('results')) - serializer = InfractionSerializer(queryset, many=True) - return Response(serializer.data) def partial_update(self, request: HttpRequest, *_args, **_kwargs) -> Response: """Method that handles the nuts and bolts of updating an Infraction.""" diff --git a/pydis_site/apps/api/viewsets/bot/pagination.py b/pydis_site/apps/api/viewsets/bot/pagination.py new file mode 100644 index 00000000..f9a8ccae --- /dev/null +++ b/pydis_site/apps/api/viewsets/bot/pagination.py @@ -0,0 +1,12 @@ +from rest_framework.pagination import LimitOffsetPagination +from rest_framework.response import Response + + +class LimitSetPagination(LimitOffsetPagination): + """Extend LimitOffsetPagination.""" + + default_limit = 100 + + def get_paginated_response(self, data: list) -> Response: + """Override default response.""" + return Response(data) -- cgit v1.2.3 From 4a5fa2d3c8e0aa2d71e13d15ca7b31ef46535001 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Fri, 26 Feb 2021 13:10:05 +0530 Subject: Update pagination docs and pagination class location --- pydis_site/apps/api/pagination.py | 49 ++++++++++++++++++++++++++ pydis_site/apps/api/viewsets/bot/infraction.py | 11 +++--- pydis_site/apps/api/viewsets/bot/pagination.py | 12 ------- 3 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 pydis_site/apps/api/pagination.py delete mode 100644 pydis_site/apps/api/viewsets/bot/pagination.py (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/pagination.py b/pydis_site/apps/api/pagination.py new file mode 100644 index 00000000..bd8d963d --- /dev/null +++ b/pydis_site/apps/api/pagination.py @@ -0,0 +1,49 @@ +import typing + +from rest_framework.pagination import LimitOffsetPagination +from rest_framework.response import Response + + +class LimitOffsetPaginationExtended(LimitOffsetPagination): + """ + Extend LimitOffsetPagination to customise the default response. + + For example: + + ## Default response + { + "count": 1, + "next": null, + "previous": null, + "results": [{ + "id": 6, + "inserted_at": "2021-01-26T21:13:35.477879Z", + "expires_at": null, + "active": false, + "user": 1, + "actor": 2, + "type": "warning", + "reason": null, + "hidden": false + }] + } + ## Required response + [{ + "id": 6, + "inserted_at": "2021-01-26T21:13:35.477879Z", + "expires_at": null, + "active": false, + "user": 1, + "actor": 2, + "type": "warning", + "reason": null, + "hidden": false + }] + + """ + + default_limit = 100 + + def get_paginated_response(self, data: typing.Any) -> Response: + """Override to skip metadata i.e. `count`, `next` and `previous`.""" + return Response(data) diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 2b0bbf3e..1bf89203 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -13,11 +13,11 @@ from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet from pydis_site.apps.api.models.bot.infraction import Infraction +from pydis_site.apps.api.pagination import LimitOffsetPaginationExtended from pydis_site.apps.api.serializers import ( ExpandedInfractionSerializer, InfractionSerializer ) -from pydis_site.apps.api.viewsets.bot.pagination import LimitSetPagination class InfractionViewSet( @@ -39,8 +39,8 @@ class InfractionViewSet( - **active** `bool`: whether the infraction is still active - **actor__id** `int`: snowflake of the user which applied the infraction - **hidden** `bool`: whether the infraction is a shadow infraction - - **limit** `int`: default limit is 100 - - **offset** `int`: default is 0 + - **limit** `int`: number of results return per page. default limit is 100 + - **offset** `int`: the initial index from which to return the results, default is 0 - **search** `str`: regular expression applied to the infraction's reason - **type** `str`: the type of the infraction - **user__id** `int`: snowflake of the user to which the infraction was applied @@ -49,7 +49,8 @@ class InfractionViewSet( Invalid query parameters are ignored. #### Response format - - Response are paginated but only the actual data is returned + - Response are paginated but the result is returned without any pagination metadata. + Below is the returned format. >>> [ ... { ... 'id': 5, @@ -137,7 +138,7 @@ class InfractionViewSet( serializer_class = InfractionSerializer queryset = Infraction.objects.all() - pagination_class = LimitSetPagination + pagination_class = LimitOffsetPaginationExtended filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) filter_fields = ('user__id', 'actor__id', 'active', 'hidden', 'type') search_fields = ('$reason',) diff --git a/pydis_site/apps/api/viewsets/bot/pagination.py b/pydis_site/apps/api/viewsets/bot/pagination.py deleted file mode 100644 index f9a8ccae..00000000 --- a/pydis_site/apps/api/viewsets/bot/pagination.py +++ /dev/null @@ -1,12 +0,0 @@ -from rest_framework.pagination import LimitOffsetPagination -from rest_framework.response import Response - - -class LimitSetPagination(LimitOffsetPagination): - """Extend LimitOffsetPagination.""" - - default_limit = 100 - - def get_paginated_response(self, data: list) -> Response: - """Override default response.""" - return Response(data) -- cgit v1.2.3 From eae89ece75eba1947c2214266d5590aeba70c588 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Sun, 7 Mar 2021 20:29:22 +0530 Subject: Update doc in pydis_site/apps/api/pagination.py Co-authored-by: Mark --- pydis_site/apps/api/pagination.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/pagination.py b/pydis_site/apps/api/pagination.py index bd8d963d..f928ea94 100644 --- a/pydis_site/apps/api/pagination.py +++ b/pydis_site/apps/api/pagination.py @@ -45,5 +45,5 @@ class LimitOffsetPaginationExtended(LimitOffsetPagination): default_limit = 100 def get_paginated_response(self, data: typing.Any) -> Response: - """Override to skip metadata i.e. `count`, `next` and `previous`.""" + """Override to skip metadata i.e. `count`, `next`, and `previous`.""" return Response(data) -- cgit v1.2.3 From 5e2ebf3bf8c6a1baf88c84137b78019196068110 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Sun, 7 Mar 2021 20:29:59 +0530 Subject: Update doc in pydis_site/apps/api/viewsets/bot/infraction.py Co-authored-by: Mark --- pydis_site/apps/api/viewsets/bot/infraction.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 1bf89203..9d5076d9 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -49,8 +49,7 @@ class InfractionViewSet( Invalid query parameters are ignored. #### Response format - - Response are paginated but the result is returned without any pagination metadata. - Below is the returned format. + Response is paginated but the result is returned without any pagination metadata. >>> [ ... { ... 'id': 5, -- cgit v1.2.3 From 0a7bffb0bb793517bb36136c847e13d439ce1ef9 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Sun, 7 Mar 2021 20:30:13 +0530 Subject: Update doc in pydis_site/apps/api/viewsets/bot/infraction.py Co-authored-by: Mark --- pydis_site/apps/api/viewsets/bot/infraction.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 9d5076d9..bd512ddd 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -39,8 +39,8 @@ class InfractionViewSet( - **active** `bool`: whether the infraction is still active - **actor__id** `int`: snowflake of the user which applied the infraction - **hidden** `bool`: whether the infraction is a shadow infraction - - **limit** `int`: number of results return per page. default limit is 100 - - **offset** `int`: the initial index from which to return the results, default is 0 + - **limit** `int`: number of results return per page (default 100) + - **offset** `int`: the initial index from which to return the results (default 0) - **search** `str`: regular expression applied to the infraction's reason - **type** `str`: the type of the infraction - **user__id** `int`: snowflake of the user to which the infraction was applied -- cgit v1.2.3 From aa11f63cad537349c5ea04c6f969658c313a1370 Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Sun, 7 Mar 2021 20:30:28 +0530 Subject: Update pydis_site/apps/api/pagination.py Co-authored-by: Mark --- pydis_site/apps/api/pagination.py | 1 - 1 file changed, 1 deletion(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/pagination.py b/pydis_site/apps/api/pagination.py index f928ea94..ce9671ff 100644 --- a/pydis_site/apps/api/pagination.py +++ b/pydis_site/apps/api/pagination.py @@ -39,7 +39,6 @@ class LimitOffsetPaginationExtended(LimitOffsetPagination): "reason": null, "hidden": false }] - """ default_limit = 100 -- cgit v1.2.3 From c3c44ea0a733022fb30bb1905ce317b570e0466f Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Sun, 7 Mar 2021 20:30:44 +0530 Subject: Update doc in pydis_site/apps/api/pagination.py Co-authored-by: Mark --- pydis_site/apps/api/pagination.py | 1 + 1 file changed, 1 insertion(+) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/pagination.py b/pydis_site/apps/api/pagination.py index ce9671ff..faf33687 100644 --- a/pydis_site/apps/api/pagination.py +++ b/pydis_site/apps/api/pagination.py @@ -27,6 +27,7 @@ class LimitOffsetPaginationExtended(LimitOffsetPagination): "hidden": false }] } + ## Required response [{ "id": 6, -- cgit v1.2.3 From b32f5b86d51eb2af4d959bc78450ec049e8b563f Mon Sep 17 00:00:00 2001 From: Matteo Bertucci Date: Sat, 24 Apr 2021 16:44:06 +0200 Subject: Pagination: Use REPL style examples --- pydis_site/apps/api/pagination.py | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/pagination.py b/pydis_site/apps/api/pagination.py index faf33687..2a325460 100644 --- a/pydis_site/apps/api/pagination.py +++ b/pydis_site/apps/api/pagination.py @@ -11,35 +11,35 @@ class LimitOffsetPaginationExtended(LimitOffsetPagination): For example: ## Default response - { - "count": 1, - "next": null, - "previous": null, - "results": [{ - "id": 6, - "inserted_at": "2021-01-26T21:13:35.477879Z", - "expires_at": null, - "active": false, - "user": 1, - "actor": 2, - "type": "warning", - "reason": null, - "hidden": false - }] - } + >>> { + ... "count": 1, + ... "next": None, + ... "previous": None, + ... "results": [{ + ... "id": 6, + ... "inserted_at": "2021-01-26T21:13:35.477879Z", + ... "expires_at": None, + ... "active": False, + ... "user": 1, + ... "actor": 2, + ... "type": "warning", + ... "reason": null, + ... "hidden": false + ... }] + ... } ## Required response - [{ - "id": 6, - "inserted_at": "2021-01-26T21:13:35.477879Z", - "expires_at": null, - "active": false, - "user": 1, - "actor": 2, - "type": "warning", - "reason": null, - "hidden": false - }] + >>> [{ + ... "id": 6, + ... "inserted_at": "2021-01-26T21:13:35.477879Z", + ... "expires_at": None, + ... "active": False, + ... "user": 1, + ... "actor": 2, + ... "type": "warning", + ... "reason": None, + ... "hidden": False + ... }] """ default_limit = 100 -- cgit v1.2.3