jumps.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from django.core.urlresolvers import reverse
  2. from django.db import transaction
  3. from django.shortcuts import redirect
  4. from django.utils.translation import ugettext as _
  5. from misago import messages
  6. from misago.acl.exceptions import ACLError403, ACLError404
  7. from misago.decorators import check_csrf
  8. from misago.models import Poll, PollVote
  9. from misago.apps.threadtype.jumps import *
  10. from misago.apps.threads.forms import PollVoteForm
  11. from misago.apps.threads.mixins import TypeMixin
  12. class LastReplyView(LastReplyBaseView, TypeMixin):
  13. pass
  14. class FindReplyView(FindReplyBaseView, TypeMixin):
  15. pass
  16. class NewReplyView(NewReplyBaseView, TypeMixin):
  17. pass
  18. class FirstModeratedView(FirstModeratedBaseView, TypeMixin):
  19. pass
  20. class FirstReportedView(FirstReportedBaseView, TypeMixin):
  21. pass
  22. class ShowHiddenRepliesView(ShowHiddenRepliesBaseView, TypeMixin):
  23. pass
  24. class WatchThreadView(WatchThreadBaseView, TypeMixin):
  25. pass
  26. class WatchEmailThreadView(WatchEmailThreadBaseView, TypeMixin):
  27. pass
  28. class UnwatchThreadView(UnwatchThreadBaseView, TypeMixin):
  29. pass
  30. class UnwatchEmailThreadView(UnwatchEmailThreadBaseView, TypeMixin):
  31. pass
  32. class UpvotePostView(UpvotePostBaseView, TypeMixin):
  33. pass
  34. class DownvotePostView(DownvotePostBaseView, TypeMixin):
  35. pass
  36. class ReportPostView(ReportPostBaseView, TypeMixin):
  37. pass
  38. class ShowPostReportView(ShowPostReportBaseView, TypeMixin):
  39. pass
  40. class VoteInPollView(JumpView, TypeMixin):
  41. def check_permissions(self):
  42. if self.request.method != 'POST':
  43. raise ACLError404()
  44. if not self.request.user.is_authenticated():
  45. raise ACLError403(_("Only registered users can vote in polls."))
  46. def make_jump(self):
  47. @check_csrf
  48. @transaction.commit_on_success
  49. def view(request):
  50. self.fetch_poll()
  51. form = PollVoteForm(self.request.POST, request=self.request, poll=self.poll)
  52. if form.is_valid():
  53. if self.poll.user_votes:
  54. self.poll.retract_votes(self.poll.user_votes)
  55. self.poll.make_vote(self.request, form.cleaned_data['options'])
  56. self.poll.save()
  57. messages.success(self.request, _("Your vote has been cast."), 'poll_%s' % self.poll.pk)
  58. else:
  59. messages.error(self.request, form.errors['__all__'][0], 'poll_%s' % self.poll.pk)
  60. return redirect(self.request.POST.get('retreat', reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug})) + '#poll')
  61. return view(self.request)
  62. def fetch_poll(self):
  63. self.poll = Poll.objects.select_for_update().get(thread=self.thread.pk)
  64. if not self.poll:
  65. raise ACLError404(_("Poll could not be found."))
  66. self.poll.option_set.all()
  67. self.poll.user_votes = self.request.user.pollvote_set.filter(poll=self.poll)
  68. self.request.acl.threads.allow_vote_in_polls(self.forum, self.thread, self.poll)