poll.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. return self.posted_on - timedelta(days=self.length) < timezone.now()
  30. return False
  31. @property
  32. def thread_type(self):
  33. return self.category.thread_type
  34. def get_api_url(self):
  35. return self.thread_type.get_poll_api_url(self)
  36. def make_choices_votes_aware(self, user, choices):
  37. if user.is_anonymous():
  38. for choice in choices:
  39. choice['selected'] = False
  40. return
  41. queryset = self.pollvote_set.filter(voter=user).values('choice_hash')
  42. user_votes = [v['choice_hash'] for v in queryset]
  43. for choice in choices:
  44. choice['selected'] = choice['hash'] in user_votes