From dd4fdcc418af949b3f44dbea7868af3624a4cfba Mon Sep 17 00:00:00 2001 From: Payam Date: Sat, 17 Jun 2017 09:51:53 +0100 Subject: [PATCH 1/5] Update pagination.py Allow User to add extra fields to data before sending it to HTTP Response --- rest_framework/pagination.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 0255cfc7f..3f937ab66 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -225,13 +225,16 @@ class PageNumberPagination(BasePagination): self.request = request return list(self.page) - def get_paginated_response(self, data): - return Response(OrderedDict([ + def get_paginated_dictionary(self, data): + return OrderedDict([ ('count', self.page.paginator.count), ('next', self.get_next_link()), ('previous', self.get_previous_link()), ('results', data) - ])) + ]) + + def get_paginated_response(self, data, extra_fields={}): + return Response(self.get_paginated_dictionary(data).update(extra_fields)) def get_page_size(self, request): if self.page_size_query_param: From 4c608a12f925616e7e425984f04279a1da146a9c Mon Sep 17 00:00:00 2001 From: Payam Date: Sat, 17 Jun 2017 10:00:04 +0100 Subject: [PATCH 2/5] Update mixins.py Allow the user to pass extra fields to the paginated response from the keyword arguments. --- rest_framework/mixins.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index f3695e665..77097a06e 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -42,7 +42,11 @@ class ListModelMixin(object): page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) - return self.get_paginated_response(serializer.data) + if 'extra_fields' in kwargs: + extra_fields = kwargs['extra_fields'] + else: + extra_fields = {} + return self.get_paginated_response(serializer.data, extra_fields) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) From 4fe0433fd7f0078b8a2f0e4550d90bb298211010 Mon Sep 17 00:00:00 2001 From: Payam Date: Sat, 17 Jun 2017 10:50:32 +0100 Subject: [PATCH 3/5] Update generics.py --- rest_framework/generics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest_framework/generics.py b/rest_framework/generics.py index 8d0bf284a..01d00b3b9 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -172,12 +172,12 @@ class GenericAPIView(views.APIView): return None return self.paginator.paginate_queryset(queryset, self.request, view=self) - def get_paginated_response(self, data): + def get_paginated_response(self, data, extra_fields={}): """ Return a paginated style `Response` object for the given output data. """ assert self.paginator is not None - return self.paginator.get_paginated_response(data) + return self.paginator.get_paginated_response(data, extra_fields) # Concrete view classes that provide method handlers From d18e3a61e58fe22dedd10a68928ff36fe82e8275 Mon Sep 17 00:00:00 2001 From: Payam Date: Sat, 17 Jun 2017 10:53:29 +0100 Subject: [PATCH 4/5] Update pagination.py Pass extra fields to paginator HTTP Response --- rest_framework/pagination.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 3f937ab66..f89804aef 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -149,7 +149,7 @@ class BasePagination(object): def paginate_queryset(self, queryset, request, view=None): # pragma: no cover raise NotImplementedError('paginate_queryset() must be implemented.') - def get_paginated_response(self, data): # pragma: no cover + def get_paginated_response(self, data, extra_fields={}): # pragma: no cover raise NotImplementedError('get_paginated_response() must be implemented.') def to_html(self): # pragma: no cover @@ -234,7 +234,10 @@ class PageNumberPagination(BasePagination): ]) def get_paginated_response(self, data, extra_fields={}): - return Response(self.get_paginated_dictionary(data).update(extra_fields)) + ordered_dict = self.get_paginated_dictionary(data) + for key in extra_fields: + ordered_dict.__setitem__(key, extra_fields[key]) + return Response(ordered_dict) def get_page_size(self, request): if self.page_size_query_param: @@ -349,13 +352,19 @@ class LimitOffsetPagination(BasePagination): return [] return list(queryset[self.offset:self.offset + self.limit]) - def get_paginated_response(self, data): - return Response(OrderedDict([ + def get_paginated_dictionary(self, data): + return OrderedDict([ ('count', self.count), ('next', self.get_next_link()), ('previous', self.get_previous_link()), ('results', data) - ])) + ]) + + def get_paginated_response(self, data, extra_fields={}): + ordered_dict = self.get_paginated_dictionary(data) + for key in extra_fields: + ordered_dict.__setitem__(key, extra_fields[key]) + return Response(ordered_dict) def get_limit(self, request): if self.limit_query_param: @@ -761,12 +770,18 @@ class CursorPagination(BasePagination): attr = getattr(instance, field_name) return six.text_type(attr) - def get_paginated_response(self, data): - return Response(OrderedDict([ + def get_paginated_dictionary(self, data): + return OrderedDict([ ('next', self.get_next_link()), ('previous', self.get_previous_link()), ('results', data) - ])) + ]) + + def get_paginated_response(self, data, extra_fields={}): + ordered_dict = self.get_paginated_dictionary(data) + for key in extra_fields: + ordered_dict.__setitem__(key, extra_fields[key]) + return Response(ordered_dict) def get_html_context(self): return { From dfc868664ffac7a635c7f7a8471206593dca4611 Mon Sep 17 00:00:00 2001 From: Payam Najafizadeh Date: Sat, 17 Jun 2017 11:46:15 +0100 Subject: [PATCH 5/5] reove extra space --- rest_framework/pagination.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index f89804aef..5d36b8edd 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -232,7 +232,7 @@ class PageNumberPagination(BasePagination): ('previous', self.get_previous_link()), ('results', data) ]) - + def get_paginated_response(self, data, extra_fields={}): ordered_dict = self.get_paginated_dictionary(data) for key in extra_fields: