posting.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.utils.translation import ugettext as _
  4. from misago import messages
  5. from misago.acl.exceptions import ACLError403, ACLError404
  6. from misago.apps.threadtype.posting import NewThreadBaseView, EditThreadBaseView, NewReplyBaseView, EditReplyBaseView
  7. from misago.models import Forum, Thread, Post, User
  8. from misago.apps.privatethreads.forms import (NewThreadForm, EditThreadForm,
  9. NewReplyForm, EditReplyForm)
  10. from misago.apps.privatethreads.mixins import TypeMixin
  11. class NewThreadView(NewThreadBaseView, TypeMixin):
  12. form_type = NewThreadForm
  13. def set_forum_context(self):
  14. self.forum = Forum.objects.get(special='private_threads')
  15. def form_initial_data(self):
  16. if self.kwargs.get('user'):
  17. try:
  18. user = User.objects.get(id=self.kwargs.get('user'))
  19. acl = user.acl()
  20. if not acl.private_threads.can_participate():
  21. raise ACLError403(_("This member can not participate in private threads."))
  22. if (not self.request.acl.private_threads.can_invite_ignoring() and
  23. not user.allow_pd_invite(self.request.user)):
  24. raise ACLError403(_('%(user)s restricts who can invite him to private threads.') % {'user': user.username})
  25. return {'invite_users': user.username}
  26. except User.DoesNotExist:
  27. raise ACLError404()
  28. return {}
  29. def after_form(self, form):
  30. self.thread.participants.add(self.request.user)
  31. self.invite_users(form.users_list)
  32. self.whitelist_mentions()
  33. self.force_stats_sync()
  34. def response(self):
  35. if self.post.moderated:
  36. messages.success(self.request, _("New thread has been posted. It will be hidden from other members until moderator reviews it."), 'threads')
  37. else:
  38. messages.success(self.request, _("New thread has been posted."), 'threads')
  39. return redirect(reverse('private_thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))
  40. class EditThreadView(EditThreadBaseView, TypeMixin):
  41. form_type = EditThreadForm
  42. def after_form(self, form):
  43. self.whitelist_mentions()
  44. def response(self):
  45. messages.success(self.request, _("Your thread has been edited."), 'threads_%s' % self.post.pk)
  46. return redirect(reverse('private_thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))
  47. class NewReplyView(NewReplyBaseView, TypeMixin):
  48. form_type = NewReplyForm
  49. def set_context(self):
  50. super(NewReplyView, self).set_context()
  51. if not (self.request.acl.private_threads.is_mod() or self.thread.participants.count() > 1):
  52. raise ACLError403(_("This thread needs to have more than one participant to allow new replies."))
  53. def after_form(self, form):
  54. try:
  55. self.invite_users(form.users_list)
  56. except AttributeError:
  57. pass
  58. self.whitelist_mentions()
  59. self.force_stats_sync()
  60. def response(self):
  61. if self.post.moderated:
  62. 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)
  63. else:
  64. messages.success(self.request, _("Your reply has been posted."), 'threads_%s' % self.post.pk)
  65. return self.redirect_to_post(self.post)
  66. class EditReplyView(EditReplyBaseView, TypeMixin):
  67. form_type = EditReplyForm
  68. def after_form(self, form):
  69. self.whitelist_mentions()
  70. def response(self):
  71. messages.success(self.request, _("Your reply has been changed."), 'threads_%s' % self.post.pk)
  72. return self.redirect_to_post(self.post)