diff --git a/flashcards/models.py b/flashcards/models.py index 61a2dcc..dcfdcb2 100644 --- a/flashcards/models.py +++ b/flashcards/models.py @@ -1,5 +1,6 @@ from math import log1p from math import exp +from math import e from django.contrib.auth.models import AbstractUser, UserManager from django.contrib.auth.tokens import default_token_generator @@ -11,12 +12,12 @@ from django.core.validators import MinLengthValidator from django.db import IntegrityError from django.db.models import * from django.utils.timezone import now, make_aware -from flashy.settings import QUARTER_START, QUARTER_END +from flashy.settings import QUARTER_START from simple_email_confirmation import SimpleEmailConfirmationUserMixin from fields import MaskField from cached_property import cached_property from flashy.settings import IN_PRODUCTION -from math import e + # Hack to fix AbstractUser before subclassing it @@ -158,7 +159,7 @@ class User(AbstractUser, SimpleEmailConfirmationUserMixin): 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') @@ -413,6 +414,9 @@ class Section(Model): """ return self.whitelist.filter(email=user.email).exists() + def is_user_enrolled(self, user): + return self.user_set.filter(pk=user.pk).exists() + def enroll(self, user): if user.sections.filter(pk=self.pk).exists(): raise ValidationError('User is already enrolled in this section') diff --git a/flashcards/serializers.py b/flashcards/serializers.py index e67045a..e31eacd 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -75,6 +75,7 @@ class SectionSerializer(ModelSerializer): short_name = CharField() long_name = CharField() can_enroll = SerializerMethodField() + is_enrolled = SerializerMethodField() class Meta: model = Section @@ -84,6 +85,10 @@ class SectionSerializer(ModelSerializer): if not obj.is_whitelisted: return True return obj.is_user_on_whitelist(self.context['user']) + def get_is_enrolled(self, obj): + if 'user' not in self.context: return False + return obj.is_user_enrolled(self.context['user']) + class DeepSectionSerializer(SectionSerializer): lectures = LecturePeriodSerializer(source='lectureperiod_set', many=True, read_only=True)