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/viewsets/bot') 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/viewsets/bot') 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/viewsets/bot') 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/viewsets/bot') 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/viewsets/bot') 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/viewsets/bot') 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 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/viewsets/bot') 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/viewsets/bot') 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