def test_poll_vote_signal(self):
        """
        POST, poll_vote
        """
        def topic_poll_pre_vote_handler(sender, poll, user, **kwargs):
            self._poll = poll
            self._user = user._wrapped
        topic_poll_pre_vote.connect(topic_poll_pre_vote_handler)

        def topic_poll_post_vote_handler(sender, poll, user, **kwargs):
            self._poll2 = poll
            self._user2 = user._wrapped
        topic_poll_post_vote.connect(topic_poll_post_vote_handler)

        utils.login(self)
        poll = TopicPoll.objects.create(topic=self.topic)
        choice = TopicPollChoice.objects.create(poll=poll, description="op1")
        form_data = {'choices': choice.pk, }
        response = self.client.post(reverse('foro:poll-vote', kwargs={'pk': poll.pk, }),
                                    form_data)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(repr(self._poll), repr(poll))
        self.assertEqual(repr(self._user), repr(self.user))
        self.assertEqual(repr(self._poll2), repr(poll))
        self.assertEqual(repr(self._user2), repr(self.user))
    def test_poll_vote_signal(self):
        """
        POST, poll_vote
        """
        def topic_poll_pre_vote_handler(sender, poll, user, **kwargs):
            self._poll = poll
            self._user = user._wrapped

        topic_poll_pre_vote.connect(topic_poll_pre_vote_handler)

        def topic_poll_post_vote_handler(sender, poll, user, **kwargs):
            self._poll2 = poll
            self._user2 = user._wrapped

        topic_poll_post_vote.connect(topic_poll_post_vote_handler)

        utils.login(self)
        poll = TopicPoll.objects.create(topic=self.topic)
        choice = TopicPollChoice.objects.create(poll=poll, description="op1")
        form_data = {
            'choices': choice.pk,
        }
        response = self.client.post(
            reverse('foro:poll-vote', kwargs={
                'pk': poll.pk,
            }), form_data)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(repr(self._poll), repr(poll))
        self.assertEqual(repr(self._user), repr(self.user))
        self.assertEqual(repr(self._poll2), repr(poll))
        self.assertEqual(repr(self._user2), repr(self.user))
@python_2_unicode_compatible
class TopicPollVote(models.Model):

    choice = models.ForeignKey(TopicPollChoice, verbose_name=_("poll choice"), related_name='votes')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("voter"))

    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('user', 'choice')
        verbose_name = _("poll vote")
        verbose_name_plural = _("poll votes")

    def __str__(self):
        return "poll vote %s" % self.pk


def poll_pre_vote(sender, poll, user, **kwargs):
    TopicPollChoice.objects.filter(poll=poll, votes__user=user)\
        .update(vote_count=F('vote_count') - 1)


def poll_post_vote(sender, poll, user, **kwargs):
    TopicPollChoice.objects.filter(poll=poll, votes__user=user)\
        .update(vote_count=F('vote_count') + 1)


topic_poll_pre_vote.connect(poll_pre_vote, dispatch_uid=__name__)
topic_poll_post_vote.connect(poll_post_vote, dispatch_uid=__name__)