diff --git a/flashcards/admin.py b/flashcards/admin.py index 66ec113..f9cff87 100644 --- a/flashcards/admin.py +++ b/flashcards/admin.py @@ -1,13 +1,15 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin from flashcards.models import Flashcard, UserFlashcard, Section, \ - LecturePeriod, User, UserFlashcardQuiz + LecturePeriod, User, UserFlashcardQuiz, WhitelistedAddress, FlashcardHide admin.site.register([ Flashcard, UserFlashcard, UserFlashcardQuiz, Section, - LecturePeriod + LecturePeriod, + FlashcardHide, + WhitelistedAddress ]) -admin.site.register(User, UserAdmin) \ No newline at end of file +admin.site.register(User, UserAdmin) diff --git a/flashcards/models.py b/flashcards/models.py index a8e3cd9..b844737 100644 --- a/flashcards/models.py +++ b/flashcards/models.py @@ -10,7 +10,6 @@ from django.core.mail import send_mail from django.core.validators import MinLengthValidator from django.db import IntegrityError from django.db.models import * -from django.utils.log import getLogger from django.utils.timezone import now, make_aware from flashy.settings import QUARTER_START from simple_email_confirmation import SimpleEmailConfirmationUserMixin @@ -18,6 +17,7 @@ from fields import MaskField from cached_property import cached_property from flashy.settings import IN_PRODUCTION + # Hack to fix AbstractUser before subclassing it AbstractUser._meta.get_field('email')._unique = True @@ -66,7 +66,6 @@ class FlashcardAlreadyPulledException(Exception): pass - class FlashcardNotInDeckException(Exception): pass @@ -106,6 +105,7 @@ class User(AbstractUser, SimpleEmailConfirmationUserMixin): try: import flashcards.notifications + user_card = UserFlashcard.objects.get(user=self, flashcard=flashcard) user_card.delete() flashcards.notifications.notify_score_change(flashcard) diff --git a/flashcards/serializers.py b/flashcards/serializers.py index 996b40d..e67045a 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -1,8 +1,9 @@ -from json import dumps, loads +from json import loads +from collections import Iterable from django.utils.datetime_safe import datetime from django.utils.timezone import now -from flashcards.models import Section, LecturePeriod, User, Flashcard, UserFlashcard, UserFlashcardQuiz +from flashcards.models import Section, LecturePeriod, User, Flashcard, UserFlashcardQuiz from flashcards.validators import FlashcardMask, OverlapIntervalException from rest_framework import serializers from rest_framework.fields import EmailField, BooleanField, CharField, IntegerField, DateTimeField, empty, \ @@ -10,7 +11,6 @@ from rest_framework.fields import EmailField, BooleanField, CharField, IntegerFi from rest_framework.serializers import ModelSerializer, Serializer, PrimaryKeyRelatedField, ListField from rest_framework.validators import UniqueValidator from flashy.settings import QUARTER_END, QUARTER_START -from collections import Iterable class EmailSerializer(Serializer): @@ -59,9 +59,9 @@ class UserUpdateSerializer(Serializer): return data -class Password(Serializer): - email = EmailField(required=True) - password = CharField(required=True) +# class Password(Serializer): +# email = EmailField(required=True) +# password = CharField(required=True) class LecturePeriodSerializer(ModelSerializer): @@ -74,10 +74,16 @@ class SectionSerializer(ModelSerializer): lecture_times = CharField() short_name = CharField() long_name = CharField() + can_enroll = SerializerMethodField() class Meta: model = Section + def get_can_enroll(self, obj): + if 'user' not in self.context: return False + if not obj.is_whitelisted: return True + return obj.is_user_on_whitelist(self.context['user']) + class DeepSectionSerializer(SectionSerializer): lectures = LecturePeriodSerializer(source='lectureperiod_set', many=True, read_only=True) diff --git a/flashcards/views.py b/flashcards/views.py index cd40a92..e310f4f 100644 --- a/flashcards/views.py +++ b/flashcards/views.py @@ -1,3 +1,5 @@ +from math import e + import django from django.contrib import auth from django.shortcuts import get_object_or_404 @@ -19,13 +21,11 @@ from rest_framework.viewsets import ReadOnlyModelViewSet, GenericViewSet from django.core.mail import send_mail from django.contrib.auth import authenticate from django.contrib.auth.tokens import default_token_generator -from django.db.models import Count, Max, F, Value, When, Case, DateTimeField, FloatField +from django.db.models import Count, Max, F, Value, When, Case, FloatField from rest_framework.status import HTTP_204_NO_CONTENT, HTTP_201_CREATED, HTTP_200_OK from rest_framework.response import Response from rest_framework.exceptions import AuthenticationFailed, NotAuthenticated, ValidationError, PermissionDenied from simple_email_confirmation import EmailAddress -from math import e -from django.utils.timezone import now def log_event(request, event=''): @@ -105,7 +105,7 @@ class SectionViewSet(ReadOnlyModelViewSet): query = request.GET.get('q', None) if not query: return Response('[]') qs = Section.search(query.split(' '))[:20] - data = SectionSerializer(qs, many=True).data + data = SectionSerializer(qs, many=True, context={'user': request.user}).data log_event(request, query) return Response(data) @@ -356,7 +356,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. @@ -411,7 +410,7 @@ class UserFlashcardQuizViewSet(GenericViewSet, CreateModelMixin, UpdateModelMixi output_field=FloatField() ), retention_score=Case( - default=Value(e, output_field=FloatField()) ** (F('days_since')*(-0.1/(F('study_count')+1))), + default=Value(e, output_field=FloatField()) ** (F('days_since') * (-0.1 / (F('study_count') + 1))), output_field=FloatField() ) ).order_by('retention_score')