def test_empty_queryset(self): """pagination works for empty queryset""" paginator = ApiPaginator(6, 2)() querset = [] results = paginator.paginate_queryset(querset, MockRequest()) self.assertEqual(results, []) meta = paginator.get_meta() self.assertEqual(meta['count'], 0) self.assertEqual(meta['pages'], 1) self.assertEqual(meta['first'], None) self.assertEqual(meta['previous'], None) self.assertEqual(meta['next'], None) self.assertEqual(meta['last'], None)
def test_empty_queryset(self): """pagination works for empty queryset""" paginator = ApiPaginator(6, 2)() querset = [] results = paginator.paginate_queryset(querset, MockRequest()) self.assertEqual(results, []) meta = paginator.get_meta() self.assertEqual(meta['count'], 0) self.assertEqual(meta['pages'], 1) self.assertEqual(meta['first'], None) self.assertEqual(meta['previous'], None) self.assertEqual(meta['next'], None) self.assertEqual(meta['last'], None) self.assertEqual(meta['before'], 0) self.assertEqual(meta['more'], 0)
def test_last_page(self): """pagination works for next page of queryset""" paginator = ApiPaginator(6, 2)() querset = [i for i in xrange(20)] results = paginator.paginate_queryset(querset, MockRequest(3)) self.assertEqual(results, [12, 13, 14, 15, 16, 17, 18, 19]) meta = paginator.get_meta() self.assertEqual(meta['count'], 20) self.assertEqual(meta['pages'], 3) self.assertEqual(meta['first'], 1) self.assertEqual(meta['previous'], 2) self.assertEqual(meta['next'], None) self.assertEqual(meta['last'], None) response = paginator.get_paginated_response(results) self.assertEqual(response.status_code, 200)
def test_last_page(self): """pagination works for last page of queryset""" paginator = ApiPaginator(6, 2)() querset = [i for i in xrange(20)] results = paginator.paginate_queryset(querset, MockRequest(3)) self.assertEqual(results, [12, 13, 14, 15, 16, 17, 18, 19]) meta = paginator.get_meta() self.assertEqual(meta['count'], 20) self.assertEqual(meta['pages'], 3) self.assertEqual(meta['first'], 1) self.assertEqual(meta['previous'], 2) self.assertEqual(meta['next'], None) self.assertEqual(meta['last'], None) self.assertEqual(meta['before'], 12) self.assertEqual(meta['more'], 0) response = paginator.get_paginated_response(results) self.assertEqual(response.status_code, 200)
def test_next_page(self): """pagination works for next page of queryset""" paginator = ApiPaginator(6, 2)() querset = [i for i in xrange(20)] results = paginator.paginate_queryset(querset, MockRequest(2)) self.assertEqual(results, [6, 7, 8, 9, 10, 11]) meta = paginator.get_meta() self.assertEqual(meta['count'], 20) self.assertEqual(meta['pages'], 3) self.assertEqual(meta['first'], 1) self.assertEqual(meta['previous'], None) self.assertEqual(meta['next'], 3) self.assertEqual(meta['last'], 3) self.assertEqual(meta['before'], 6) self.assertEqual(meta['more'], 8) response = paginator.get_paginated_response(results) self.assertEqual(response.status_code, 200)
class UsernameChangesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (UsernameChangesViewSetPermission, ) serializer_class = UsernameChangeSerializer queryset = UsernameChange.objects pagination_class = ApiPaginator(20, 5) def get_queryset(self): queryset = UsernameChange.objects.select_related('user', 'changed_by') user = self.request.query_params.get('user', None) if user is not None: try: queryset = queryset.filter(user_id=int(user)) except (ValueError, TypeError): queryset = queryset.none() return queryset.order_by('-id')
class UsernameChangesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (UsernameChangesViewSetPermission, ) serializer_class = UsernameChangeSerializer pagination_class = ApiPaginator(12, 4) def get_queryset(self): queryset = UsernameChange.objects if self.request.query_params.get('user'): user_pk = get_int_or_404(self.request.query_params.get('user')) queryset = get_object_or_404(get_user_model().objects, pk=user_pk).namechanges if self.request.query_params.get('search'): search_phrase = self.request.query_params.get('search').strip() if search_phrase: queryset = queryset.filter( Q(changed_by_username__istartswith=search_phrase) | Q(new_username__istartswith=search_phrase) | Q(old_username__istartswith=search_phrase)) return queryset.select_related('user', 'changed_by').order_by('-id')
class UserViewSet(viewsets.GenericViewSet): permission_classes = (UserViewSetPermission, ) parser_classes = (JSONParser, MultiPartParser) serializer_class = UserSerializer queryset = get_user_model().objects pagination_class = ApiPaginator(settings.MISAGO_USERS_PER_PAGE, 4) def get_queryset(self): relations = ('rank', 'online_tracker', 'ban_cache') return self.queryset.select_related(*relations) def get_users_count(self): users_count = cache.get('users_count') if not users_count: users_count = self.queryset.count() cache.set('users_count', users_count, 15 * 60) return users_count def list(self, request): import time time.sleep(10) allow_browse_users_list(request.user) response_dict = { 'results': [], 'users': self.get_users_count(), } list_dict = list_endpoint(request, self.get_queryset()) if not list_dict: return Response([]) if list_dict.get('meta'): response_dict.update(list_dict['meta']) if list_dict.get('results'): response_dict['results'] = list_dict['results'] elif list_dict.get('queryset'): queryset = list_dict['queryset'] if list_dict.get('paginate'): queryset = self.paginate_queryset(list_dict['queryset']) response_dict.update(self.paginator.get_meta()) if list_dict.get('serializer'): SerializerClass = list_dict.get('serializer') else: SerializerClass = self.serializer_class serializer = SerializerClass(queryset, many=True, context={'user': request.user}) response_dict['results'] = serializer.data return Response(response_dict) def create(self, request): return create_endpoint(request) def retrieve(self, request, pk=None): qs = self.get_queryset() profile = get_object_or_404(self.get_queryset(), id=pk) add_acl(request.user, profile) serializer = UserProfileSerializer(profile, context={'user': request.user}) return Response(serializer.data) @detail_route(methods=['get', 'post']) def avatar(self, request, pk=None): allow_self_only(request.user, pk, _("You can't change other users avatars.")) return avatar_endpoint(request) @detail_route(methods=['post']) def forum_options(self, request, pk=None): allow_self_only(request.user, pk, _("You can't change other users options.")) form = ForumOptionsForm(request.data, instance=request.user) if form.is_valid(): form.save() return Response( {'detail': _("Your forum options have been changed.")}) else: return Response(form.errors, status=status.HTTP_400_BAD_REQUEST) @detail_route(methods=['get', 'post']) def username(self, request, pk=None): allow_self_only(request.user, pk, _("You can't change other users names.")) return username_endpoint(request) @detail_route(methods=['get', 'post']) def signature(self, request, pk=None): allow_self_only(request.user, pk, _("You can't change other users signatures.")) return signature_endpoint(request) @detail_route(methods=['post']) def change_password(self, request, pk=None): allow_self_only(request.user, pk, _("You can't change other users passwords.")) return change_password_endpoint(request) @detail_route(methods=['post']) def change_email(self, request, pk=None): allow_self_only(request.user, pk, _("You can't change other users e-mail addresses.")) return change_email_endpoint(request)
def test_init_paginator(self): """ApiPaginator returns type that can be initalized""" paginator = ApiPaginator(3, 1)()
from django.http import Http404 from django.utils import timezone from rest_framework.response import Response from misago.conf import settings from misago.core.apipaginator import ApiPaginator from misago.core.cache import cache from misago.core.shortcuts import get_int_or_404, get_object_or_404 from ...activepostersranking import get_active_posters_ranking from ...models import Rank from ...online.utils import make_users_status_aware from ...serializers import ScoredUserSerializer, UserSerializer Paginator = ApiPaginator(settings.MISAGO_USERS_PER_PAGE, 4) def active(request): ranking = get_active_posters_ranking() make_users_status_aware(request.user, ranking['users'], fetch_state=True) return Response({ 'tracked_period': settings.MISAGO_RANKING_LENGTH, 'results': ScoredUserSerializer(ranking['users'], many=True).data, 'count': ranking['users_count'] })