Commit 901ee2fa94a11d428f3963e58ad1ddd35c1ff670

Authored by Rohan Rangray
1 parent 6967144326
Exists in master

Added pagination for the feed.

Showing 3 changed files with 21 additions and 7 deletions Side-by-side Diff

flashcards/models.py View file @ 901ee2f
... ... @@ -376,6 +376,7 @@
376 376 course_title = CharField(db_index=True, max_length=50)
377 377 instructor = CharField(db_index=True, max_length=100)
378 378 quarter = CharField(db_index=True, max_length=4)
  379 + PAGE_SIZE = 40
379 380  
380 381 @classmethod
381 382 def search(cls, terms):
... ... @@ -449,8 +450,8 @@
449 450 def short_name(self):
450 451 return '%s %s' % (self.department_abbreviation, self.course_num)
451 452  
452   - def get_feed_for_user(self, user):
453   - cards = list(self.get_cards_for_user(user))
  453 + def get_feed_for_user(self, user, page=1):
  454 + cards = list(self.get_cards_for_user(user)[(page-1)*self.PAGE_SIZE:page*self.PAGE_SIZE])
454 455 cards.sort(key=lambda x: -x.score)
455 456 return cards
456 457  
flashcards/serializers.py View file @ 901ee2f
... ... @@ -83,6 +83,15 @@
83 83 lectures = LecturePeriodSerializer(source='lectureperiod_set', many=True, read_only=True)
84 84  
85 85  
  86 +class FeedRequestSerializer(Serializer):
  87 + page = IntegerField(min_value=1, default=1, required=False)
  88 +
  89 + def validate(self, attrs):
  90 + if not isinstance(attrs['page'], int):
  91 + raise serializers.ValidationError("Invalid page number")
  92 + return attrs
  93 +
  94 +
86 95 class UserSerializer(ModelSerializer):
87 96 email = EmailField(required=False)
88 97 sections = SectionSerializer(many=True)
flashcards/views.py View file @ 901ee2f
... ... @@ -10,7 +10,7 @@
10 10 from flashcards.serializers import SectionSerializer, UserUpdateSerializer, RegistrationSerializer, UserSerializer, \
11 11 PasswordResetSerializer, PasswordResetRequestSerializer, EmailPasswordSerializer, FlashcardSerializer, \
12 12 FlashcardUpdateSerializer, QuizRequestSerializer, QuizResponseSerializer, \
13   - QuizAnswerRequestSerializer, DeepSectionSerializer
  13 + QuizAnswerRequestSerializer, DeepSectionSerializer, FeedRequestSerializer
14 14 from rest_framework.decorators import detail_route, permission_classes, api_view, list_route
15 15 from rest_framework.generics import ListAPIView, GenericAPIView
16 16 from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
17 17  
... ... @@ -121,9 +121,14 @@
121 121 """
122 122 Gets the contents of a user's feed for a section.
123 123 Exclude cards that are already in the user's deck
  124 + request_serializer: FeedRequestSerializer
  125 + response_serializer: FlashcardSerializer
124 126 """
125   - serializer = FlashcardSerializer(self.get_object().get_feed_for_user(request.user), many=True,
126   - context={'user': request.user})
  127 + feed_serializer = FeedRequestSerializer(data=request.data)
  128 + feed_serializer.is_valid(raise_exception=True)
  129 + page = feed_serializer.validated_data['page']
  130 + serializer = FlashcardSerializer(self.get_object().get_feed_for_user(request.user, page=page),
  131 + many=True, context={'user': request.user})
127 132 log_event(request, str(self.get_object()))
128 133 return Response(serializer.data)
129 134  
... ... @@ -352,7 +357,6 @@
352 357 return Response(status=HTTP_204_NO_CONTENT)
353 358 except FlashcardNotInDeckException:
354 359 raise ValidationError('Cannot unpull a card not in deck')
355   -
356 360  
357 361 def partial_update(self, request, *args, **kwargs):
358 362 """