Commit 901ee2fa94a11d428f3963e58ad1ddd35c1ff670
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 | """ |