threadpoll.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from django.db import transaction
  2. from django.http import Http404
  3. from rest_framework import viewsets
  4. from rest_framework.decorators import detail_route, list_route
  5. from rest_framework.response import Response
  6. from misago.acl import add_acl
  7. from misago.core.shortcuts import get_int_or_404
  8. from ..models import Poll, PollVote
  9. from ..permissions.polls import allow_start_poll
  10. from ..serializers import PollSerializer, NewPollSerializer, EditPollSerializer
  11. from ..viewmodels.thread import ForumThread
  12. class ViewSet(viewsets.ViewSet):
  13. thread = None
  14. def get_thread(self, request, thread_pk, select_for_update=False):
  15. return self.thread(
  16. request,
  17. get_int_or_404(thread_pk),
  18. select_for_update=select_for_update,
  19. )
  20. def get_thread_for_update(self, request, thread_pk):
  21. return self.get_thread(request, thread_pk, select_for_update=True)
  22. def get_poll(self, thread):
  23. try:
  24. return thread.poll
  25. except Poll.DoesNotExist:
  26. raise Http404()
  27. @transaction.atomic
  28. def create(self, request, thread_pk):
  29. thread = self.get_thread_for_update(request, thread_pk).model
  30. allow_start_poll(request.user, thread)
  31. instance = Poll(
  32. thread=thread,
  33. category=thread.category,
  34. poster=request.user,
  35. poster_name=request.user.username,
  36. poster_slug=request.user.slug,
  37. poster_ip=request.user_ip,
  38. )
  39. serializer = NewPollSerializer(instance, data=request.data)
  40. if serializer.is_valid():
  41. serializer.save()
  42. add_acl(request.user, instance)
  43. return Response(PollSerializer(instance).data)
  44. else:
  45. return Response(serializer.errors, status=400)
  46. # create poll
  47. # edit poll
  48. # delete poll
  49. # vote in poll
  50. # see voters
  51. class ThreadPollViewSet(ViewSet):
  52. thread = ForumThread