Skip to content

Commit 5bf5229

Browse files
committed
Add pagination and search filters
1 parent c93f5dc commit 5bf5229

File tree

5 files changed

+50
-11
lines changed

5 files changed

+50
-11
lines changed

Dockerfile

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
FROM python:3.5
22

3+
RUN mkdir /app
34
WORKDIR /app
45

5-
COPY . /app
6+
ADD . /app
67

78
RUN pip install -r requirements.txt
89

910
EXPOSE 8096
1011
EXPOSE 80
11-
12-
CMD ["python", "manage.py", "makemigrations"]
13-
CMD ["python", "manage.py", "migrate"]
14-
CMD ["python", "manage.py", "runserver"]

app_dir/user/api/pagination.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from rest_framework.response import Response
2+
from rest_framework.pagination import (
3+
LimitOffsetPagination,
4+
PageNumberPagination,
5+
)
6+
7+
8+
class PostLimitOffsetPagination(PageNumberPagination, LimitOffsetPagination):
9+
10+
def get_paginated_response(self, data):
11+
return Response({
12+
'links': {
13+
'next': self.get_next_link(),
14+
'previous': self.get_previous_link()
15+
},
16+
'count': self.page.paginator.count,
17+
'total_pages': self.page.paginator.num_pages,
18+
'results': data
19+
})

app_dir/user/api/views.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,34 @@
22
ListAPIView, CreateAPIView, RetrieveUpdateAPIView,
33
RetrieveAPIView, DestroyAPIView
44
)
5+
from django.db.models import Q
6+
from rest_framework import pagination
57
from rest_framework.permissions import (IsAuthenticatedOrReadOnly, IsAuthenticated)
68
from .serializers import UserSerializer, User
9+
from .pagination import PostLimitOffsetPagination
710

811

912
class UserListAPIView(ListAPIView):
1013
permission_classes = [IsAuthenticatedOrReadOnly]
11-
queryset = User.objects.all()
1214
serializer_class = UserSerializer
15+
pagination_class = PostLimitOffsetPagination
16+
17+
def get_queryset(self, *args, **kwargs):
18+
queryset_list = User.objects.all()
19+
20+
page_size = 'page_size'
21+
if self.request.GET.get(page_size):
22+
pagination.PageNumberPagination.page_size = self.request.GET.get(page_size)
23+
else:
24+
pagination.PageNumberPagination.page_size = 10
25+
query = self.request.GET.get('q')
26+
if query:
27+
queryset_list = queryset_list.filter(
28+
Q(email__icontains=query) |
29+
Q(username__icontains=query)
30+
)
31+
32+
return queryset_list.order_by('-id')
1333

1434

1535
class UserCreateAPIView(CreateAPIView):

configurations/urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
path('api-auth/', include('rest_framework.urls', namespace='rest')),
88
path('api-token-auth', obtain_jwt_token),
99
path('user/', include(('app_dir.user.urls', 'user'), namespace='user')),
10-
path('user/api/', include(('app_dir.user.api.urls', 'user_api'), namespace='user_api'))
10+
path('api/user/', include(('app_dir.user.api.urls', 'user_api'), namespace='user_api'))
1111
]
1212

docker-compose.yml

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
version: '3'
22
services:
3+
db:
4+
image: postgres
35
web:
46
build: .
5-
ports:
6-
- "5000:5000"
77
volumes:
8-
- .:/code
9-
- logvolume01:/var/log
8+
- .:/app
109
links:
1110
- redis
1211
command: python manage.py runserver 0.0.0.0:5000
12+
ports:
13+
- "5000:5000"
14+
depends_on:
15+
- db
1316
redis:
1417
image: redis
1518
volumes:

0 commit comments

Comments
 (0)