diff --git a/flashcards/models.py b/flashcards/models.py index cd6b492..7043494 100644 --- a/flashcards/models.py +++ b/flashcards/models.py @@ -20,6 +20,9 @@ from cached_property import cached_property + + + # Hack to fix AbstractUser before subclassing it AbstractUser._meta.get_field('email')._unique = True @@ -347,7 +350,10 @@ class Flashcard(Model): self.pk = None self.mask = new_data.get('mask', self.mask) self.save() - self.hide_by_user(user) + 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) else: user_card, created = UserFlashcard.objects.get_or_create(user=user, flashcard=self) @@ -361,13 +367,15 @@ class Flashcard(Model): return self def hide_by_user(self, user, reason=None): - import flashcards.pushes - flashcards.pushes.push_deck_event('card_hidden', self, user) if self.is_in_deck(user): user.unpull(self) hide, created = FlashcardHide.objects.get_or_create(user=user, flashcard=self) hide.reason = reason hide.save() + if not created: return + import flashcards.pushes + + flashcards.pushes.push_deck_event('card_hidden', self, user) def unhide_by_user(self, user, reason=None): import flashcards.pushes diff --git a/flashcards/pushes.py b/flashcards/pushes.py index 94aa074..d664d5b 100644 --- a/flashcards/pushes.py +++ b/flashcards/pushes.py @@ -14,5 +14,6 @@ def push_feed_event(event_type, flashcard): def push_deck_event(event_type, flashcard, user): redis_publisher = RedisPublisher(facility='deck/%d' % flashcard.section_id, users=[user]) redis_publisher.publish_message(RedisMessage(JSONRenderer().render( - {'event_type': event_type, 'flashcard': serializers.FlashcardSerializer(flashcard).data} + {'event_type': event_type, + 'flashcard': serializers.FlashcardSerializer(flashcard, context={'user': user}).data} ))) diff --git a/flashcards/serializers.py b/flashcards/serializers.py index f2f6f48..d16fc4f 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -141,6 +141,7 @@ class MaskFieldSerializer(serializers.Field): class FlashcardSerializer(ModelSerializer): is_hidden = SerializerMethodField() is_in_deck = SerializerMethodField() + is_authored_by_user = SerializerMethodField() material_week_num = IntegerField(read_only=True) material_date = DateTimeField(default=now) mask = MaskFieldSerializer(allow_null=True) @@ -173,6 +174,11 @@ class FlashcardSerializer(ModelSerializer): if 'user' not in self.context: return False return obj.is_in_deck(self.context['user']) + def get_is_authored_by_user(self, obj): + if 'user' not in self.context: return False + return obj.author == self.context['user'] + + class Meta: model = Flashcard exclude = 'author', 'previous', 'hide_reason' diff --git a/flashcards/views.py b/flashcards/views.py index 69c6142..6a22da8 100644 --- a/flashcards/views.py +++ b/flashcards/views.py @@ -118,7 +118,7 @@ class SectionViewSet(ReadOnlyModelViewSet): Gets the contents of a user's deck for a given section. """ qs = request.user.get_deck(self.get_object()) - serializer = FlashcardSerializer(qs, many=True) + serializer = FlashcardSerializer(qs, context={'user': request.user}, many=True) log_event(request, str(self.get_object())) return Response(serializer.data) @@ -349,7 +349,7 @@ class FlashcardViewSet(GenericViewSet, CreateModelMixin, RetrieveModelMixin): raise PermissionDenied('The user is not enrolled in that section') data['author'] = request.user flashcard = Flashcard.push(**data) - response_data = FlashcardSerializer(flashcard).data + response_data = FlashcardSerializer(flashcard, context={'user': request.user}).data log_event(request, response_data) headers = self.get_success_headers(data) return Response(response_data, status=HTTP_201_CREATED, headers=headers)