Commit a3ae545efed1c233e89ff9d803a03c85ceee6ee2

Authored by Andrew Buss
1 parent 4263a9ac9e
Exists in master

send user's chosen mask

Showing 2 changed files with 43 additions and 29 deletions Side-by-side Diff

flashcards/models.py View file @ a3ae545
... ... @@ -2,6 +2,7 @@
2 2 from math import exp
3 3 from datetime import timedelta
4 4  
  5 +from flashcards.validators import FlashcardMask
5 6 from gcm import gcm
6 7 from django.contrib.auth.models import AbstractUser, UserManager
7 8 from django.contrib.auth.tokens import default_token_generator
... ... @@ -23,6 +24,14 @@
23 24  
24 25  
25 26  
  27 +
  28 +
  29 +
  30 +
  31 +
  32 +
  33 +
  34 +
26 35 # Hack to fix AbstractUser before subclassing it
27 36  
28 37 AbstractUser._meta.get_field('email')._unique = True
... ... @@ -139,6 +148,8 @@
139 148 flashcards.pushes.push_feed_event('score_change', flashcard)
140 149 flashcards.pushes.push_deck_event('card_pulled', flashcard, self)
141 150  
  151 + return user_card
  152 +
142 153 def unpull(self, flashcard):
143 154 if not self.is_in_section(flashcard.section):
144 155 raise ValueError("User not in the section this flashcard belongs to")
145 156  
146 157  
... ... @@ -331,36 +342,32 @@
331 342 :param user: The user editing this card.
332 343 :param new_data: The new information, namely a dict containg 'material_date', 'text', and 'mask' keys.
333 344 """
334   -
335   - # content_changed is True iff either material_date or text were changed
336   - content_changed = False
337   - # create_new is True iff the user editing this card is the author of this card
338   - # and there are no other users with this card in their decks
339   - create_new = user != self.author or \
340   - UserFlashcard.objects.filter(flashcard=self).exclude(user=user).exists()
341   - if 'material_date' in new_data and self.material_date != new_data['material_date']:
342   - content_changed = True
343   - self.material_date = new_data['material_date']
344   - if 'text' in new_data and self.text != new_data['text']:
345   - content_changed = True
346   - self.text = new_data['text']
347   - if create_new and content_changed:
348   - if self.is_in_deck(user): user.unpull(self)
349   - self.previous_id = self.pk
350   - self.pk = None
351   - self.mask = new_data.get('mask', self.mask)
352   - self.save()
353   - Flashcard.objects.get(pk=self.previous_id).hide_by_user(user)
354   - import flashcards.pushes
355   -
356   - flashcards.pushes.push_feed_event('new_card', self)
357   - user.pull(self)
  345 + material_date_changed = ('material_date' in new_data and self.material_date != new_data['material_date'])
  346 + text_changed = ('text' in new_data and self.text != new_data['text'])
  347 + mask_changed = ('mask' in new_data and self.mask != new_data['mask'])
  348 + new_mask = FlashcardMask(new_data['mask']) if mask_changed else self.mask
  349 + content_changed = text_changed or material_date_changed
  350 + create_new = (text_changed or material_date_changed) and (
  351 + user != self.author or UserFlashcard.objects.filter(flashcard=self).exclude(user=user).exists())
  352 + if create_new:
  353 + self.hide_by_user(user, 'replaced by new card')
  354 + Flashcard.push(text=new_data.get('text', self.text),
  355 + mask=new_mask,
  356 + material_date=new_data.get('material_date', self.material_date),
  357 + section=self.section,
  358 + previous=self,
  359 + author=user)
358 360 else:
359   - user_card, created = UserFlashcard.objects.get_or_create(user=user, flashcard=self)
360   - user_card.mask = new_data.get('mask', user_card.mask)
361   - user_card.save()
362   - if not create_new:
  361 + self.mask = FlashcardMask(new_data['mask'])
  362 + if text_changed: self.text = new_data['text']
  363 + if material_date_changed: self.material_date = new_data['material_date']
363 364 self.save()
  365 + if not self.is_in_deck(user): user.pull(self)
  366 + if not content_changed:
  367 + user_card = UserFlashcard.objects.get(user=user, flashcard=self)
  368 + user_card.mask = new_mask
  369 + user_card.save()
  370 +
364 371 import flashcards.pushes
365 372  
366 373 flashcards.pushes.push_deck_event('card_fixed', self, user)
flashcards/serializers.py View file @ a3ae545
... ... @@ -3,7 +3,7 @@
3 3  
4 4 from django.utils.datetime_safe import datetime
5 5 from django.utils.timezone import now
6   -from flashcards.models import Section, LecturePeriod, User, Flashcard, UserFlashcardQuiz
  6 +from flashcards.models import Section, LecturePeriod, User, Flashcard, UserFlashcardQuiz, UserFlashcard
7 7 from flashcards.validators import FlashcardMask, OverlapIntervalException
8 8 from rest_framework import serializers
9 9 from rest_framework.fields import EmailField, BooleanField, CharField, IntegerField, DateTimeField, empty, \
... ... @@ -145,6 +145,7 @@
145 145 material_week_num = IntegerField(read_only=True)
146 146 material_date = DateTimeField(default=now)
147 147 mask = MaskFieldSerializer(allow_null=True)
  148 + display_mask = SerializerMethodField()
148 149 score = FloatField(read_only=True)
149 150  
150 151 def validate_material_date(self, value):
... ... @@ -178,6 +179,12 @@
178 179 if 'user' not in self.context: return False
179 180 return obj.author == self.context['user']
180 181  
  182 + def get_display_mask(self, obj):
  183 + if 'user' in self.context:
  184 + userflashcard = UserFlashcard.objects.filter(flashcard=obj, user=self.context['user'])
  185 + if userflashcard.exists() and userflashcard.get().mask:
  186 + return MaskFieldSerializer().to_representation(userflashcard.get().mask)
  187 + return MaskFieldSerializer().to_representation(obj.mask)
181 188  
182 189 class Meta:
183 190 model = Flashcard