Commit a3ae545efed1c233e89ff9d803a03c85ceee6ee2
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 |