mixins.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.utils.translation import ugettext as _
  4. from misago.conf import settings
  5. from misago.acl.exceptions import ACLError404
  6. from misago.utils.translation import ugettext_lazy
  7. class TypeMixin(object):
  8. type_prefix = 'private_thread'
  9. def type_available(self):
  10. return settings.enable_private_threads
  11. def check_permissions(self):
  12. try:
  13. if self.thread.pk:
  14. if not ((self.thread.replies_reported > 0 and self.request.acl.private_threads.is_mod())
  15. or (self.request.user in self.thread.participants.all())):
  16. raise ACLError404()
  17. except AttributeError:
  18. pass
  19. def invite_users(self, users):
  20. for user in users:
  21. if not user in self.thread.participants.all():
  22. self.thread.participants.add(user)
  23. 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})
  24. alert = user.alert(ugettext_lazy("%(username)s has invited you to the %(thread)s private thread").message)
  25. alert.profile('username', self.request.user)
  26. alert.post('thread', self.type_prefix, self.thread, self.post)
  27. alert.save_all()
  28. self.post.mentions.add(user)
  29. if self.action == 'new_reply':
  30. self.thread.set_checkpoint(self.request, 'invited', user)
  31. def force_stats_sync(self):
  32. self.thread.participants.exclude(id=self.request.user.id).update(sync_pds=True)
  33. def whitelist_mentions(self):
  34. try:
  35. if self.md.mentions:
  36. participants = self.thread.participants.all()
  37. for slug, user in self.md.mentions.items():
  38. user_acl = user.acl()
  39. if not (user in participants or (user_acl.private_threads.can_participate() and user_acl.private_threads.is_mod() and self.thread.replies_reported > 0)):
  40. del self.md.mentions[slug]
  41. except AttributeError:
  42. pass
  43. def threads_list_redirect(self):
  44. return redirect(reverse('private_threads'))