poll.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 get_votes_api_url(self):
  38. return self.thread_type.get_poll_votes_api_url(self)
  39. def make_choices_votes_aware(self, user):
  40. if user.is_anonymous():
  41. for choice in self.choices:
  42. choice['selected'] = False
  43. return
  44. queryset = self.pollvote_set.filter(voter=user).values('choice_hash')
  45. user_votes = [v['choice_hash'] for v in queryset]
  46. for choice in self.choices:
  47. choice['selected'] = choice['hash'] in user_votes
  48. @property
  49. def has_selected_choices(self):
  50. for choice in self.choices:
  51. if choice.get('selected'):
  52. return True
  53. return False