posting.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.utils import timezone
  4. from django.utils.translation import ugettext as _
  5. from misago import messages
  6. from misago.acl.exceptions import ACLError403
  7. from misago.apps.threads.forms import NewThreadForm, EditThreadForm
  8. from misago.apps.threadtype.posting import NewThreadBaseView, EditThreadBaseView, NewReplyBaseView, EditReplyBaseView
  9. from misago.models import Forum, Thread, Post, Poll, PollOption, WarnLevel
  10. from misago.apps.threads.mixins import TypeMixin
  11. class PollFormMixin(object):
  12. def create_poll(self, form):
  13. poll = Poll(forum=self.forum,
  14. thread=self.thread,
  15. user=self.request.user,
  16. user_name=self.request.user.username,
  17. user_slug=self.request.user.username_slug,
  18. start_date=timezone.now(),
  19. length=form.cleaned_data['poll_length'],
  20. question=form.cleaned_data['poll_question'],
  21. max_choices=form.cleaned_data['poll_max_choices'],
  22. vote_changing=form.cleaned_data['poll_changing_votes'],
  23. public=form.cleaned_data['poll_max_choices'])
  24. poll.save()
  25. choices = []
  26. for name in form.clean_choices:
  27. option = PollOption.objects.create(
  28. poll=poll,
  29. forum=self.forum,
  30. thread=self.thread,
  31. name=name,
  32. )
  33. choices.append(option)
  34. poll.choices_cache = choices
  35. poll.save()
  36. self.thread.has_poll = True
  37. self.thread.save()
  38. def update_poll(self, form):
  39. poll = self.thread.poll
  40. poll.question = form.cleaned_data['poll_question']
  41. poll.max_choices = form.cleaned_data['poll_max_choices']
  42. poll.length = form.cleaned_data['poll_length']
  43. poll.vote_changing = form.cleaned_data['poll_changing_votes']
  44. self.update_poll_choices(poll, form)
  45. poll.save()
  46. def update_poll_choices(self, poll, form):
  47. choices = []
  48. for option in form.changed_choices:
  49. option.save()
  50. choices.append(option)
  51. for option in form.deleted_choices:
  52. poll.votes -= option.votes
  53. option.delete()
  54. for name in set(form.clean_choices) - set([x.name for x in form.changed_choices]):
  55. option = PollOption.objects.create(
  56. poll=poll,
  57. forum=self.forum,
  58. thread=self.thread,
  59. name=name,
  60. )
  61. choices.append(option)
  62. poll.choices_cache = choices
  63. def delete_poll(self):
  64. self.thread.poll.delete()
  65. class PrefixFormMixin(object):
  66. def set_prefix(self, form):
  67. if form.cleaned_data['thread_prefix']:
  68. self.thread.prefix_id = form.cleaned_data['thread_prefix']
  69. else:
  70. self.thread.prefix = None
  71. self.thread.save()
  72. class NewThreadView(NewThreadBaseView, TypeMixin, PollFormMixin, PrefixFormMixin):
  73. form_type = NewThreadForm
  74. def set_forum_context(self):
  75. self.forum = Forum.objects.get(pk=self.kwargs.get('forum'), type='forum')
  76. def check_permissions(self):
  77. if self.request.user.warning_level_disallows_writing_threads:
  78. raise ACLError403(_("You can't start new threads due to your warning level."))
  79. def force_moderation(self):
  80. return self.request.user.warning_level_moderate_new_threads
  81. def after_form(self, form):
  82. if form.cleaned_data.get('poll_question'):
  83. self.create_poll(form)
  84. if form.cleaned_data.get('thread_prefix') != None:
  85. self.set_prefix(form)
  86. def response(self):
  87. if self.post.moderated:
  88. messages.success(self.request, _("New thread has been posted. It will be hidden from other members until moderator reviews it."), 'threads')
  89. else:
  90. messages.success(self.request, _("New thread has been posted."), 'threads')
  91. return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))
  92. class EditThreadView(EditThreadBaseView, TypeMixin, PollFormMixin, PrefixFormMixin):
  93. form_type = EditThreadForm
  94. def after_form(self, form):
  95. if self.thread.poll:
  96. if form.cleaned_data.get('poll_delete'):
  97. self.delete_poll()
  98. self.thread.save()
  99. else:
  100. self.update_poll(form)
  101. elif form.cleaned_data.get('poll_question'):
  102. self.create_poll(form)
  103. if form.cleaned_data.get('thread_prefix') != None:
  104. self.set_prefix(form)
  105. def response(self):
  106. messages.success(self.request, _("Your thread has been edited."), 'threads_%s' % self.post.pk)
  107. return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))
  108. class NewReplyView(NewReplyBaseView, TypeMixin):
  109. def check_permissions(self):
  110. if self.request.user.warning_level_disallows_writing_replies:
  111. raise ACLError403(_("You can't reply to threads due to your warning level."))
  112. def force_moderation(self):
  113. return self.request.user.warning_level_moderate_new_replies
  114. def response(self):
  115. if self.post.moderated:
  116. messages.success(self.request, _("Your reply has been posted. It will be hidden from other members until moderator reviews it."), 'threads_%s' % self.post.pk)
  117. else:
  118. messages.success(self.request, _("Your reply has been posted."), 'threads_%s' % self.post.pk)
  119. return self.redirect_to_post(self.post)
  120. class EditReplyView(EditReplyBaseView, TypeMixin):
  121. def response(self):
  122. messages.success(self.request, _("Your reply has been changed."), 'threads_%s' % self.post.pk)
  123. return self.redirect_to_post(self.post)