Commit 000b5980c9b7ffcd1901d7b4701e553236e5a2b6
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 |