jumps.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from django.utils.translation import ugettext as _
  2. from misago.acl.exceptions import ACLError403, ACLError404
  3. from misago.apps.threadtype.jumps import *
  4. from misago.models import User
  5. from misago.utils.strings import slugify
  6. from misago.apps.privatethreads.mixins import TypeMixin
  7. class LastReplyView(LastReplyBaseView, TypeMixin):
  8. pass
  9. class FindReplyView(FindReplyBaseView, TypeMixin):
  10. pass
  11. class NewReplyView(NewReplyBaseView, TypeMixin):
  12. pass
  13. class ShowHiddenRepliesView(ShowHiddenRepliesBaseView, TypeMixin):
  14. pass
  15. class WatchThreadView(WatchThreadBaseView, TypeMixin):
  16. pass
  17. class WatchEmailThreadView(WatchEmailThreadBaseView, TypeMixin):
  18. pass
  19. class UnwatchThreadView(UnwatchThreadBaseView, TypeMixin):
  20. pass
  21. class UnwatchEmailThreadView(UnwatchEmailThreadBaseView, TypeMixin):
  22. pass
  23. class UpvotePostView(UpvotePostBaseView, TypeMixin):
  24. pass
  25. class DownvotePostView(DownvotePostBaseView, TypeMixin):
  26. pass
  27. class InviteUserView(JumpView, TypeMixin):
  28. def make_jump(self):
  29. username = slugify(self.request.POST.get('username', '').strip())
  30. if not username:
  31. self.request.messages.set_flash(Message(_('You have to enter name of user you want to invite to thread.')), 'error', 'threads')
  32. return self.retreat_redirect()
  33. try:
  34. user = User.objects.get(username_slug=username)
  35. acl = user.acl(self.request)
  36. if user in self.thread.participants.all():
  37. if user.pk == self.request.user.pk:
  38. self.request.messages.set_flash(Message(_('You cannot add yourself to this thread.')), 'error', 'threads')
  39. else:
  40. self.request.messages.set_flash(Message(_('%(user)s is already participating in this thread.') % {'user': user.username}), 'info', 'threads')
  41. if not acl.private_threads.can_participate():
  42. self.request.messages.set_flash(Message(_('%(user)s cannot participate in private threads.') % {'user': user.username}), 'info', 'threads')
  43. elif (not self.request.acl.private_threads.can_invite_ignoring() and
  44. user.is_ignoring(self.request.user)):
  45. self.request.messages.set_flash(Message(_('%(user)s does not wish to participate in your private threads.') % {'user': user.username}), 'info', 'threads')
  46. else:
  47. self.thread.participants.add(user)
  48. user.sync_pds = True
  49. user.save(force_update=True)
  50. user.email_user(self.request, 'private_thread_invite', _("You've been invited to private thread \"%(thread)s\" by %(user)s") % {'thread': self.thread.name, 'user': self.request.user.username}, {'author': self.request.user, 'thread': self.thread})
  51. self.thread.last_post.set_checkpoint(self.request, 'invited', user)
  52. self.thread.last_post.save(force_update=True)
  53. self.request.messages.set_flash(Message(_('%(user)s has been added to this thread.') % {'user': user.username}), 'success', 'threads')
  54. return self.retreat_redirect()
  55. except User.DoesNotExist:
  56. self.request.messages.set_flash(Message(_('User with requested username could not be found.')), 'error', 'threads')
  57. return self.retreat_redirect()
  58. class RemoveUserView(JumpView, TypeMixin):
  59. def make_jump(self):
  60. target_user = int(self.request.POST.get('user', 0))
  61. if (not (self.request.user.pk == self.thread.start_poster_id or
  62. self.request.acl.private_threads.is_mod()) and
  63. target_user != self.request.user.pk):
  64. raise ACLError403(_("You don't have permission to remove discussion participants."))
  65. try:
  66. user = self.thread.participants.get(id=target_user)
  67. self.thread.participants.remove(user)
  68. self.thread.threadread_set.filter(id=user.pk).delete()
  69. self.thread.watchedthread_set.filter(id=user.pk).delete()
  70. user.sync_pds = True
  71. user.save(force_update=True)
  72. # If there are no more participants in thread, remove it
  73. if self.thread.participants.count() == 0:
  74. self.thread.delete()
  75. self.request.messages.set_flash(Message(_('Thread has been deleted because last participant left it.')), 'info', 'threads')
  76. return self.threads_list_redirect()
  77. # Nope, see if we removed ourselves
  78. if user.pk == self.request.user.pk:
  79. self.thread.last_post.set_checkpoint(self.request, 'left')
  80. self.thread.last_post.save(force_update=True)
  81. self.request.messages.set_flash(Message(_('You have left the "%(thread)s" thread.') % {'thread': self.thread.name}), 'info', 'threads')
  82. return self.threads_list_redirect()
  83. # Nope, somebody else removed user
  84. self.thread.last_post.set_checkpoint(self.request, 'removed', user)
  85. self.thread.last_post.save(force_update=True)
  86. self.request.messages.set_flash(Message(_('Selected participant was removed from thread.')), 'info', 'threads')
  87. return self.retreat_redirect()
  88. except User.DoesNotExist:
  89. self.request.messages.set_flash(Message(_('Requested thread participant does not exist.')), 'error', 'threads')
  90. return self.retreat_redirect()