pollvote.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from rest_framework import serializers
  2. from django.urls import reverse
  3. from django.utils.translation import gettext as _
  4. from django.utils.translation import ngettext
  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 len(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. )