-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpaginations.py
155 lines (109 loc) · 3.59 KB
/
paginations.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
"""
Classes for pagination objects in response.
"""
import abc
import six
from rest_framework.utils.decorators import copy_methods_signature
class BasePaginatorAbstract(six.with_metaclass(abc.ABCMeta, object)):
"""
Paginator for base class.
"""
def __init__(self, objects):
self.objects = objects
@abc.abstractmethod
def get_paginate_data(self, *args, **kwargs):
"""
Get paginate data, page_size, count_page and etc.
:return: Paginate data dict.
:rtype: dict
Examples:
return {limit: 10, offset: 10, count: 100}
return {after: 'hash_code', before: 'hash_code', count_objects: 10}
"""
pass
@abc.abstractmethod
def get_objects_data(self):
"""
Get paginate objects data.
:return: Pagination objects dict
:rtype: dict
Examples:
return {'result': self.objects}
return {'objects': self.objects}
"""
pass
def paginate(self, *args, **kwargs):
"""
Paginate method. Return result paginate dict.
:return: Result paginate data
:rtype: dict
"""
result = {}
result.update(self.get_paginate_data(*args, **kwargs))
result.update(self.get_objects_data())
return result
class LimitOffsetGetPaginateDataMixin(BasePaginatorAbstract):
"""
Mixin for limit offset pagination.
"""
def get_paginate_data(self, limit=10, offset=0, count=None):
"""
Get paginate data for limit offset pagination.
:return: Paginate data dict. {'limit': limit, 'offset': offset, count: count}
:rtype: dict
"""
return dict(limit=limit, offset=offset, count=count)
class ResultGetObjectsDataPaginatorMixin(BasePaginatorAbstract):
"""
Mixin for return result from get_objects_data.
"""
def get_objects_data(self):
"""
Get paginate objects data.
:return: Pagination objects dict. {'result': objects}
:rtype: dict
"""
return dict(result=self.objects)
class ObjectsGetObjectsDataPaginatorMixin(BasePaginatorAbstract):
"""
Mixin for return result from get_objects_data.
"""
def get_objects_data(self):
"""
Get paginate objects data.
:return: Pagination objects dict. {'objects': objects}
:rtype: dict
"""
return dict(objects=self.objects)
class ItemsGetObjectsDataPaginatorMixin(BasePaginatorAbstract):
"""
Mixin for return result from get_objects_data.
"""
def get_objects_data(self):
"""
Get paginate objects data.
:return: Pagination objects dict. {'items': objects}
:rtype: dict
"""
return dict(items=self.objects)
@copy_methods_signature({'get_paginate_data': 'paginate'})
class LimitOffsetResultPaginator(LimitOffsetGetPaginateDataMixin, ResultGetObjectsDataPaginatorMixin,
BasePaginatorAbstract):
"""
Limit offset result paginator.
"""
pass
@copy_methods_signature({'get_paginate_data': 'paginate'})
class LimitOffsetObjectsPaginator(LimitOffsetGetPaginateDataMixin, ObjectsGetObjectsDataPaginatorMixin,
BasePaginatorAbstract):
"""
Limit offset objects paginator.
"""
pass
@copy_methods_signature({'get_paginate_data': 'paginate'})
class LimitOffsetItemsPaginator(LimitOffsetGetPaginateDataMixin, ItemsGetObjectsDataPaginatorMixin,
BasePaginatorAbstract):
"""
Limit offset items paginator.
"""
pass