poll.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from datetime import timedelta
  2. from django.conf import settings
  3. from django.contrib.postgres.fields import JSONField
  4. from django.db import models
  5. from django.utils import timezone
  6. class Poll(models.Model):
  7. category = models.ForeignKey('misago_categories.Category')
  8. thread = models.OneToOneField('misago_threads.Thread')
  9. poster = models.ForeignKey(
  10. settings.AUTH_USER_MODEL,
  11. blank=True,
  12. null=True,
  13. on_delete=models.SET_NULL,
  14. )
  15. poster_name = models.CharField(max_length=255)
  16. poster_slug = models.CharField(max_length=255)
  17. poster_ip = models.GenericIPAddressField()
  18. posted_on = models.DateTimeField(default=timezone.now)
  19. length = models.PositiveIntegerField(default=0)
  20. question = models.CharField(max_length=255)
  21. choices = JSONField()
  22. allowed_choices = models.PositiveIntegerField(default=1)
  23. allow_revotes = models.BooleanField(default=False)
  24. votes = models.PositiveIntegerField(default=0)
  25. is_public = models.BooleanField(default=False)
  26. @property
  27. def is_over(self):
  28. if self.length:
  29. poll_cutoff = self.posted_on + timedelta(days=self.length)
  30. return timezone.now() > poll_cutoff
  31. return False
  32. @property
  33. def thread_type(self):
  34. return self.category.thread_type
  35. def get_api_url(self):
  36. return self.thread_type.get_poll_api_url(self)
  37. def make_choices_votes_aware(self, user, choices):
  38. if user.is_anonymous():
  39. for choice in choices:
  40. choice['selected'] = False
  41. return
  42. queryset = self.pollvote_set.filter(voter=user).values('choice_hash')
  43. user_votes = [v['choice_hash'] for v in queryset]
  44. for choice in choices:
  45. choice['selected'] = choice['hash'] in user_votes