diff --git a/flashcards/models.py b/flashcards/models.py index ef408f8..f606ceb 100644 --- a/flashcards/models.py +++ b/flashcards/models.py @@ -376,6 +376,7 @@ class Section(Model): course_title = CharField(db_index=True, max_length=50) instructor = CharField(db_index=True, max_length=100) quarter = CharField(db_index=True, max_length=4) + PAGE_SIZE = 40 @classmethod def search(cls, terms): @@ -449,8 +450,8 @@ class Section(Model): def short_name(self): return '%s %s' % (self.department_abbreviation, self.course_num) - def get_feed_for_user(self, user): - cards = list(self.get_cards_for_user(user)) + def get_feed_for_user(self, user, page=1): + cards = list(self.get_cards_for_user(user)[(page-1)*self.PAGE_SIZE:page*self.PAGE_SIZE]) cards.sort(key=lambda x: -x.score) return cards diff --git a/flashcards/serializers.py b/flashcards/serializers.py index 996b40d..bc25e5a 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -83,6 +83,15 @@ class DeepSectionSerializer(SectionSerializer): lectures = LecturePeriodSerializer(source='lectureperiod_set', many=True, read_only=True) +class FeedRequestSerializer(Serializer): + page = IntegerField(min_value=1, default=1, required=False) + + def validate(self, attrs): + if not isinstance(attrs['page'], int): + raise serializers.ValidationError("Invalid page number") + return attrs + + class UserSerializer(ModelSerializer): email = EmailField(required=False) sections = SectionSerializer(many=True) diff --git a/flashcards/views.py b/flashcards/views.py index 6ed8dcd..74ec4d5 100644 --- a/flashcards/views.py +++ b/flashcards/views.py @@ -10,7 +10,7 @@ from flashcards.notifications import notify_new_card from flashcards.serializers import SectionSerializer, UserUpdateSerializer, RegistrationSerializer, UserSerializer, \ PasswordResetSerializer, PasswordResetRequestSerializer, EmailPasswordSerializer, FlashcardSerializer, \ FlashcardUpdateSerializer, QuizRequestSerializer, QuizResponseSerializer, \ - QuizAnswerRequestSerializer, DeepSectionSerializer + QuizAnswerRequestSerializer, DeepSectionSerializer, FeedRequestSerializer 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 @@ -121,9 +121,14 @@ class SectionViewSet(ReadOnlyModelViewSet): """ Gets the contents of a user's feed for a section. Exclude cards that are already in the user's deck - """ - serializer = FlashcardSerializer(self.get_object().get_feed_for_user(request.user), many=True, - context={'user': request.user}) + request_serializer: FeedRequestSerializer + response_serializer: FlashcardSerializer + """ + 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}) log_event(request, str(self.get_object())) return Response(serializer.data) @@ -353,7 +358,6 @@ class FlashcardViewSet(GenericViewSet, CreateModelMixin, RetrieveModelMixin): except FlashcardNotInDeckException: raise ValidationError('Cannot unpull a card not in deck') - def partial_update(self, request, *args, **kwargs): """ Edit settings related to a card for the user.