pollvotecreateendpoint.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from copy import deepcopy
  2. from rest_framework.response import Response
  3. from misago.acl import add_acl
  4. from misago.threads.permissions import allow_vote_poll
  5. from misago.threads.serializers import PollSerializer, NewVoteSerializer
  6. def poll_vote_create(request, thread, poll):
  7. poll.make_choices_votes_aware(request.user)
  8. allow_vote_poll(request.user, poll)
  9. serializer = NewVoteSerializer(
  10. data={
  11. 'choices': request.data,
  12. },
  13. context={
  14. 'allowed_choices': poll.allowed_choices,
  15. 'choices': poll.choices,
  16. },
  17. )
  18. if not serializer.is_valid():
  19. return Response(
  20. {'detail': serializer.errors}, status=400)
  21. remove_user_votes(request.user, poll, serializer.data['choices'])
  22. set_new_votes(request, poll, serializer.data['choices'])
  23. add_acl(request.user, poll)
  24. serialized_poll = PollSerializer(poll).data
  25. poll.choices = list(map(presave_clean_choice, deepcopy(poll.choices)))
  26. poll.save()
  27. return Response(serialized_poll)
  28. def presave_clean_choice(choice):
  29. del choice['selected']
  30. return choice
  31. def remove_user_votes(user, poll, final_votes):
  32. removed_votes = []
  33. for choice in poll.choices:
  34. if choice['selected'] and choice['hash'] not in final_votes:
  35. poll.votes -= 1
  36. choice['votes'] -= 1
  37. choice['selected'] = False
  38. removed_votes.append(choice['hash'])
  39. if removed_votes:
  40. poll.pollvote_set.filter(
  41. voter=user,
  42. choice_hash__in=removed_votes,
  43. ).delete()
  44. def set_new_votes(request, poll, final_votes):
  45. for choice in poll.choices:
  46. if not choice['selected'] and choice['hash'] in final_votes:
  47. poll.votes += 1
  48. choice['votes'] += 1
  49. choice['selected'] = True
  50. poll.pollvote_set.create(
  51. category=poll.category,
  52. thread=poll.thread,
  53. voter=request.user,
  54. voter_name=request.user.username,
  55. voter_slug=request.user.slug,
  56. choice_hash=choice['hash'],
  57. voter_ip=request.user_ip,
  58. )