From a3ae545efed1c233e89ff9d803a03c85ceee6ee2 Mon Sep 17 00:00:00 2001 From: Andrew Buss Date: Thu, 4 Jun 2015 02:30:22 -0700 Subject: [PATCH] send user's chosen mask --- flashcards/models.py | 63 ++++++++++++++++++++++++++--------------------- flashcards/serializers.py | 9 ++++++- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/flashcards/models.py b/flashcards/models.py index 7043494..3a0932e 100644 --- a/flashcards/models.py +++ b/flashcards/models.py @@ -2,6 +2,7 @@ from math import log1p from math import exp from datetime import timedelta +from flashcards.validators import FlashcardMask from gcm import gcm from django.contrib.auth.models import AbstractUser, UserManager from django.contrib.auth.tokens import default_token_generator @@ -23,6 +24,14 @@ from cached_property import cached_property + + + + + + + + # Hack to fix AbstractUser before subclassing it AbstractUser._meta.get_field('email')._unique = True @@ -139,6 +148,8 @@ class User(AbstractUser, SimpleEmailConfirmationUserMixin): flashcards.pushes.push_feed_event('score_change', flashcard) flashcards.pushes.push_deck_event('card_pulled', flashcard, self) + return user_card + def unpull(self, flashcard): if not self.is_in_section(flashcard.section): raise ValueError("User not in the section this flashcard belongs to") @@ -331,36 +342,32 @@ class Flashcard(Model): :param user: The user editing this card. :param new_data: The new information, namely a dict containg 'material_date', 'text', and 'mask' keys. """ - - # content_changed is True iff either material_date or text were changed - content_changed = False - # create_new is True iff the user editing this card is the author of this card - # and there are no other users with this card in their decks - create_new = user != self.author or \ - UserFlashcard.objects.filter(flashcard=self).exclude(user=user).exists() - if 'material_date' in new_data and self.material_date != new_data['material_date']: - content_changed = True - self.material_date = new_data['material_date'] - if 'text' in new_data and self.text != new_data['text']: - content_changed = True - self.text = new_data['text'] - if create_new and content_changed: - if self.is_in_deck(user): user.unpull(self) - self.previous_id = self.pk - self.pk = None - self.mask = new_data.get('mask', self.mask) - self.save() - Flashcard.objects.get(pk=self.previous_id).hide_by_user(user) - import flashcards.pushes - - flashcards.pushes.push_feed_event('new_card', self) - user.pull(self) + material_date_changed = ('material_date' in new_data and self.material_date != new_data['material_date']) + text_changed = ('text' in new_data and self.text != new_data['text']) + mask_changed = ('mask' in new_data and self.mask != new_data['mask']) + new_mask = FlashcardMask(new_data['mask']) if mask_changed else self.mask + content_changed = text_changed or material_date_changed + create_new = (text_changed or material_date_changed) and ( + user != self.author or UserFlashcard.objects.filter(flashcard=self).exclude(user=user).exists()) + if create_new: + self.hide_by_user(user, 'replaced by new card') + Flashcard.push(text=new_data.get('text', self.text), + mask=new_mask, + material_date=new_data.get('material_date', self.material_date), + section=self.section, + previous=self, + author=user) else: - user_card, created = UserFlashcard.objects.get_or_create(user=user, flashcard=self) - user_card.mask = new_data.get('mask', user_card.mask) - user_card.save() - if not create_new: + self.mask = FlashcardMask(new_data['mask']) + if text_changed: self.text = new_data['text'] + if material_date_changed: self.material_date = new_data['material_date'] self.save() + if not self.is_in_deck(user): user.pull(self) + if not content_changed: + user_card = UserFlashcard.objects.get(user=user, flashcard=self) + user_card.mask = new_mask + user_card.save() + import flashcards.pushes flashcards.pushes.push_deck_event('card_fixed', self, user) diff --git a/flashcards/serializers.py b/flashcards/serializers.py index d16fc4f..d984083 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -3,7 +3,7 @@ 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, UserFlashcardQuiz +from flashcards.models import Section, LecturePeriod, User, Flashcard, UserFlashcardQuiz, UserFlashcard from flashcards.validators import FlashcardMask, OverlapIntervalException from rest_framework import serializers from rest_framework.fields import EmailField, BooleanField, CharField, IntegerField, DateTimeField, empty, \ @@ -145,6 +145,7 @@ class FlashcardSerializer(ModelSerializer): material_week_num = IntegerField(read_only=True) material_date = DateTimeField(default=now) mask = MaskFieldSerializer(allow_null=True) + display_mask = SerializerMethodField() score = FloatField(read_only=True) def validate_material_date(self, value): @@ -178,6 +179,12 @@ class FlashcardSerializer(ModelSerializer): if 'user' not in self.context: return False return obj.author == self.context['user'] + def get_display_mask(self, obj): + if 'user' in self.context: + userflashcard = UserFlashcard.objects.filter(flashcard=obj, user=self.context['user']) + if userflashcard.exists() and userflashcard.get().mask: + return MaskFieldSerializer().to_representation(userflashcard.get().mask) + return MaskFieldSerializer().to_representation(obj.mask) class Meta: model = Flashcard -- 1.9.1