pollvotecreateendpoint.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. # FIXME: lets use {'choices': []} JSON instead!
  11. data={'choices': request.data},
  12. context={
  13. 'allowed_choices': poll.allowed_choices,
  14. 'choices': poll.choices,
  15. },
  16. )
  17. serializer.is_valid(raise_exception=True)
  18. validated_choices = serializer.validated_data['choices']
  19. remove_user_votes(request.user, poll, validated_choices)
  20. set_new_votes(request, poll, validated_choices)
  21. add_acl(request.user, poll)
  22. serialized_poll = PollSerializer(poll).data
  23. poll.choices = list(map(presave_clean_choice, deepcopy(poll.choices)))
  24. poll.save()
  25. return Response(serialized_poll)
  26. def presave_clean_choice(choice):
  27. del choice['selected']
  28. return choice
  29. def remove_user_votes(user, poll, final_votes):
  30. removed_votes = []
  31. for choice in poll.choices:
  32. if choice['selected'] and choice['hash'] not in final_votes:
  33. poll.votes -= 1
  34. choice['votes'] -= 1
  35. choice['selected'] = False
  36. removed_votes.append(choice['hash'])
  37. if removed_votes:
  38. poll.pollvote_set.filter(
  39. voter=user,
  40. choice_hash__in=removed_votes,
  41. ).delete()
  42. def set_new_votes(request, poll, final_votes):
  43. for choice in poll.choices:
  44. if not choice['selected'] and choice['hash'] in final_votes:
  45. poll.votes += 1
  46. choice['votes'] += 1
  47. choice['selected'] = True
  48. poll.pollvote_set.create(
  49. category=poll.category,
  50. thread=poll.thread,
  51. voter=request.user,
  52. voter_name=request.user.username,
  53. voter_slug=request.user.slug,
  54. choice_hash=choice['hash'],
  55. voter_ip=request.user_ip,
  56. )