From 137ad427603c9232c88a28e272345b48f45076ea Mon Sep 17 00:00:00 2001 From: Andrew Buss Date: Wed, 3 Jun 2015 16:16:45 -0700 Subject: [PATCH] refactor feed pagination; make it optionaller --- flashcards/models.py | 4 ++-- flashcards/views.py | 13 ++++++++++--- flashy/settings.py | 2 ++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/flashcards/models.py b/flashcards/models.py index 9ef1b10..f0f73dd 100644 --- a/flashcards/models.py +++ b/flashcards/models.py @@ -531,8 +531,8 @@ class Section(Model): def short_name(self): return '%s %s' % (self.department_abbreviation, self.course_num) - def get_feed_for_user(self, user, page=1): - cards = self.get_cards_for_user(user).order_by('-score')[(page - 1) * self.PAGE_SIZE:page * self.PAGE_SIZE] + def get_feed_for_user(self, user): + cards = self.get_cards_for_user(user).order_by('-score') return cards def get_cards_for_user(self, user): diff --git a/flashcards/views.py b/flashcards/views.py index bc2a880..698ce68 100644 --- a/flashcards/views.py +++ b/flashcards/views.py @@ -10,7 +10,8 @@ from flashcards.serializers import SectionSerializer, UserUpdateSerializer, Regi PasswordResetSerializer, PasswordResetRequestSerializer, EmailPasswordSerializer, FlashcardSerializer, \ FlashcardUpdateSerializer, QuizRequestSerializer, QuizResponseSerializer, SubscribeViewSerializer, \ QuizAnswerRequestSerializer, DeepSectionSerializer, EmailVerificationSerializer, FeedRequestSerializer -from rest_framework.decorators import detail_route, permission_classes, api_view, list_route, throttle_classes +from flashy.settings import FEED_PAGE_SIZE +from rest_framework.decorators import detail_route, permission_classes, api_view, list_route from rest_framework.generics import ListAPIView, GenericAPIView from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, UpdateModelMixin from rest_framework.permissions import IsAuthenticated @@ -25,13 +26,16 @@ from rest_framework.exceptions import AuthenticationFailed, NotAuthenticated, Va from simple_email_confirmation import EmailAddress from rest_framework.throttling import UserRateThrottle + def log_event(request, event=''): logstr = u'%s %s %s %s' % (request.META['REMOTE_ADDR'], request.user, request.path, event) getLogger('flashy.events').info(logstr) + class LimitFlashcardPushThrottle(UserRateThrottle): rate = '10/min' + class SectionViewSet(ReadOnlyModelViewSet): queryset = Section.objects.all() serializer_class = DeepSectionSerializer @@ -129,8 +133,10 @@ class SectionViewSet(ReadOnlyModelViewSet): feed_serializer = FeedRequestSerializer(data=request.data) feed_serializer.is_valid(raise_exception=True) page = feed_serializer.validated_data['page'] - serializer = FlashcardSerializer(self.get_object().get_feed_for_user(request.user, page=page), - many=True, context={'user': request.user}) + feed = self.get_object().get_feed_for_user(request.user) + if page: + feed = feed[(page - 1) * FEED_PAGE_SIZE:page * FEED_PAGE_SIZE] + serializer = FlashcardSerializer(feed, many=True, context={'user': request.user}) log_event(request, str(self.get_object())) return Response(serializer.data) @@ -245,6 +251,7 @@ def subscribe(request, format=None): request.user.set_registration_id(serializer.validated_data['registration_id']) return Response(status=HTTP_204_NO_CONTENT) + @api_view(['POST']) def unsubscribe(request, format=None): """ diff --git a/flashy/settings.py b/flashy/settings.py index bc6c30d..1b55912 100644 --- a/flashy/settings.py +++ b/flashy/settings.py @@ -189,3 +189,5 @@ SWAGGER_SETTINGS = { WS4REDIS_EXPIRE = 0 SESSION_ENGINE = 'redis_sessions.session' + +FEED_PAGE_SIZE = 50 \ No newline at end of file -- 1.9.1