pollvote.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from django.urls import reverse
  2. from django.utils.translation import gettext as _
  3. from django.utils.translation import ngettext
  4. from rest_framework import serializers
  5. __all__ = ["NewVoteSerializer", "PollVoteSerializer"]
  6. class NewVoteSerializer(serializers.Serializer):
  7. choices = serializers.ListField(child=serializers.CharField())
  8. def validate_choices(self, data):
  9. if len(data) > self.context["allowed_choices"]:
  10. message = ngettext(
  11. "This poll disallows voting for more than %(choices)s choice.",
  12. "This poll disallows voting for more than %(choices)s choices.",
  13. self.context["allowed_choices"],
  14. )
  15. raise serializers.ValidationError(
  16. message % {"choices": self.context["allowed_choices"]}
  17. )
  18. valid_choices = [c["hash"] for c in self.context["choices"]]
  19. clean_choices = []
  20. for choice in data:
  21. if choice in valid_choices and choice not in clean_choices:
  22. clean_choices.append(choice)
  23. if len(clean_choices) != len(data):
  24. raise serializers.ValidationError(
  25. _("One or more of poll choices were invalid.")
  26. )
  27. if not clean_choices:
  28. raise serializers.ValidationError(_("You have to make a choice."))
  29. return clean_choices
  30. class PollVoteSerializer(serializers.Serializer):
  31. voted_on = serializers.DateTimeField()
  32. username = serializers.SerializerMethodField()
  33. url = serializers.SerializerMethodField()
  34. class Meta:
  35. fields = ["voted_on", "username", "url"]
  36. def get_username(self, obj):
  37. return obj["voter_name"]
  38. def get_url(self, obj):
  39. if obj["voter_id"]:
  40. return reverse(
  41. "misago:user", kwargs={"pk": obj["voter_id"], "slug": obj["voter_slug"]}
  42. )