jumps.py 5.0 KB

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