Commit 000b5980c9b7ffcd1901d7b4701e553236e5a2b6

Authored by Rohan Rangray
Exists in master

Merge branch 'master' of git.ucsd.edu:110swag/flashy-backend

ermging

Showing 4 changed files Side-by-side Diff

flashcards/migrations/0021_auto_20150603_1617.py View file @ 000b598
  1 +# -*- coding: utf-8 -*-
  2 +from __future__ import unicode_literals
  3 +
  4 +from django.db import models, migrations
  5 +
  6 +
  7 +class Migration(migrations.Migration):
  8 +
  9 + dependencies = [
  10 + ('flashcards', '0020_merge'),
  11 + ]
  12 +
  13 + operations = [
  14 + migrations.AlterField(
  15 + model_name='userflashcardquiz',
  16 + name='blanked_word',
  17 + field=models.CharField(help_text=b'The character range which was blanked', max_length=255, blank=True),
  18 + ),
  19 + ]
flashcards/models.py View file @ 000b598
... ... @@ -411,7 +411,7 @@
411 411 """
412 412 user_flashcard = ForeignKey(UserFlashcard)
413 413 when = DateTimeField(auto_now=True)
414   - blanked_word = CharField(max_length=40, blank=True, help_text="The character range which was blanked")
  414 + blanked_word = CharField(max_length=255, blank=True, help_text="The character range which was blanked")
415 415 response = CharField(max_length=255, blank=True, null=True, default=None, help_text="The user's response")
416 416 correct = NullBooleanField(help_text="The user's self-evaluation of their response")
417 417  
... ... @@ -468,7 +468,7 @@
468 468 q |= Q(course_num__icontains=term)
469 469 q |= Q(instructor__icontains=term)
470 470 final_q &= q
471   - qs = cls.objects.filter(final_q)
  471 + qs = cls.objects.filter(final_q).prefetch_related('whitelist')
472 472 # Have the database cast the course number to an integer so it will sort properly
473 473 # ECE 35 should rank before ECE 135 even though '135' < '35' lexicographically
474 474 qs = qs.extra(select={'course_num_int': "CAST(rtrim(course_num, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') AS INTEGER)"})
... ... @@ -480,7 +480,11 @@
480 480 """
481 481 :return: whether a whitelist exists for this section
482 482 """
483   - return self.whitelist.exists()
  483 + data = cache.get("section_%d_is_whitelisted" % self.pk)
  484 + if data is None:
  485 + data = self.whitelist.exists()
  486 + cache.set("section_%d_is_whitelisted" % self.pk, data, 24 * 60 * 60)
  487 + return data
484 488  
485 489 def is_user_on_whitelist(self, user):
486 490 """
... ... @@ -527,8 +531,8 @@
527 531 def short_name(self):
528 532 return '%s %s' % (self.department_abbreviation, self.course_num)
529 533  
530   - def get_feed_for_user(self, user, page=1):
531   - cards = self.get_cards_for_user(user).order_by('-score')[(page - 1) * self.PAGE_SIZE:page * self.PAGE_SIZE]
  534 + def get_feed_for_user(self, user):
  535 + cards = self.get_cards_for_user(user).order_by('-score')
532 536 return cards
533 537  
534 538 def get_cards_for_user(self, user):
flashcards/views.py View file @ 000b598
... ... @@ -10,7 +10,8 @@
10 10 PasswordResetSerializer, PasswordResetRequestSerializer, EmailPasswordSerializer, FlashcardSerializer, \
11 11 FlashcardUpdateSerializer, QuizRequestSerializer, QuizResponseSerializer, SubscribeViewSerializer, \
12 12 QuizAnswerRequestSerializer, DeepSectionSerializer, EmailVerificationSerializer, FeedRequestSerializer
13   -from rest_framework.decorators import detail_route, permission_classes, api_view, list_route, throttle_classes
  13 +from flashy.settings import FEED_PAGE_SIZE
  14 +from rest_framework.decorators import detail_route, permission_classes, api_view, list_route
14 15 from rest_framework.generics import ListAPIView, GenericAPIView
15 16 from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
16 17 from rest_framework.permissions import IsAuthenticated
17 18  
18 19  
... ... @@ -25,13 +26,16 @@
25 26 from simple_email_confirmation import EmailAddress
26 27 from rest_framework.throttling import UserRateThrottle
27 28  
  29 +
28 30 def log_event(request, event=''):
29 31 logstr = u'%s %s %s %s' % (request.META['REMOTE_ADDR'], request.user, request.path, event)
30 32 getLogger('flashy.events').info(logstr)
31 33  
  34 +
32 35 class LimitFlashcardPushThrottle(UserRateThrottle):
33 36 rate = '10/min'
34 37  
  38 +
35 39 class SectionViewSet(ReadOnlyModelViewSet):
36 40 queryset = Section.objects.all()
37 41 serializer_class = DeepSectionSerializer
... ... @@ -129,8 +133,10 @@
129 133 feed_serializer = FeedRequestSerializer(data=request.data)
130 134 feed_serializer.is_valid(raise_exception=True)
131 135 page = feed_serializer.validated_data['page']
132   - serializer = FlashcardSerializer(self.get_object().get_feed_for_user(request.user, page=page),
133   - many=True, context={'user': request.user})
  136 + feed = self.get_object().get_feed_for_user(request.user)
  137 + if page:
  138 + feed = feed[(page - 1) * FEED_PAGE_SIZE:page * FEED_PAGE_SIZE]
  139 + serializer = FlashcardSerializer(feed, many=True, context={'user': request.user})
134 140 log_event(request, str(self.get_object()))
135 141 return Response(serializer.data)
136 142  
... ... @@ -244,6 +250,7 @@
244 250 serializer.is_valid(raise_exception=True)
245 251 request.user.set_registration_id(serializer.validated_data['registration_id'])
246 252 return Response(status=HTTP_204_NO_CONTENT)
  253 +
247 254  
248 255 @api_view(['POST'])
249 256 def unsubscribe(request, format=None):
flashy/settings.py View file @ 000b598
... ... @@ -121,6 +121,7 @@
121 121  
122 122 if DEBUG:
123 123 INSTALLED_APPS.append('debug_toolbar')
  124 + # DEBUG_TOOLBAR_PANELS = ['debug_toolbar.panels.profiling.ProfilingPanel']
124 125  
125 126 if IN_PRODUCTION:
126 127 INSTALLED_APPS.append('django_ses')
... ... @@ -188,4 +189,6 @@
188 189  
189 190 WS4REDIS_EXPIRE = 0
190 191 SESSION_ENGINE = 'redis_sessions.session'
  192 +
  193 +FEED_PAGE_SIZE = 50