コード例 #1
0
    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)
コード例 #2
0
ファイル: test_apipaginator.py プロジェクト: pylixm/Misago
    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)
コード例 #3
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)
コード例 #4
0
ファイル: test_apipaginator.py プロジェクト: pylixm/Misago
    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)
コード例 #5
0
ファイル: test_apipaginator.py プロジェクト: pylixm/Misago
    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)
コード例 #6
0
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')
コード例 #7
0
ファイル: usernamechanges.py プロジェクト: kinsney/education
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')
コード例 #8
0
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)
コード例 #9
0
ファイル: test_apipaginator.py プロジェクト: pylixm/Misago
 def test_init_paginator(self):
     """ApiPaginator returns type that can be initalized"""
     paginator = ApiPaginator(3, 1)()
コード例 #10
0
ファイル: list.py プロジェクト: ioandev/MisagoFork
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']
    })