privatethreads.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. from django.http import Http404
  2. from django.shortcuts import get_object_or_404
  3. from django.utils.translation import ugettext as _
  4. from misago.acl import add_acl
  5. from misago.forums.models import Forum
  6. from misago.threads.models import Thread, ThreadParticipant
  7. from misago.threads.permissions import (allow_use_private_threads,
  8. allow_see_private_thread,
  9. allow_see_private_post,
  10. exclude_invisible_private_threads)
  11. from misago.threads.views import generic
  12. def private_threads_view(klass):
  13. """
  14. decorator for making views check allow_use_private_threads
  15. """
  16. def dispatch(self, request, *args, **kwargs):
  17. allow_use_private_threads(request.user)
  18. return super(self.__class__, self).dispatch(
  19. request, *args, **kwargs)
  20. klass.dispatch = dispatch
  21. return klass
  22. class PrivateThreadsMixin(object):
  23. """
  24. Mixin is used to make views use different permission tests
  25. """
  26. def get_forum(self, request, lock=False, **kwargs):
  27. forum = Forum.objects.private_threads()
  28. add_acl(request.user, forum)
  29. return forum
  30. def check_forum_permissions(self, request, forum):
  31. add_acl(request.user, forum)
  32. allow_use_private_threads(request.user)
  33. def fetch_thread(self, request, lock=False, select_related=None,
  34. queryset=None, **kwargs):
  35. queryset = queryset or Thread.objects
  36. if lock:
  37. queryset = queryset.select_for_update()
  38. select_related = select_related or []
  39. if not 'forum' in select_related:
  40. select_related.append('forum')
  41. queryset = queryset.select_related(*select_related)
  42. where = {'id': kwargs.get('thread_id')}
  43. thread = get_object_or_404(queryset, **where)
  44. if thread.forum.special_role != 'private_threads':
  45. raise Http404()
  46. return thread
  47. def fetch_thread_participants(self, thread):
  48. thread.participants_list = []
  49. participants_qs = ThreadParticipant.objects.filter(thread=thread)
  50. participants_qs = participants_qs.select_related('user')
  51. for participant in participants_qs:
  52. participant.thread = thread
  53. thread.participants_list.append(participant)
  54. def check_thread_permissions(self, request, thread):
  55. add_acl(request.user, thread.forum)
  56. add_acl(request.user, thread)
  57. self.fetch_thread_participants(thread)
  58. allow_see_private_thread(request.user, thread)
  59. allow_use_private_threads(request.user)
  60. def check_post_permissions(self, request, post):
  61. add_acl(request.user, post.forum)
  62. add_acl(request.user, post.thread)
  63. add_acl(request.user, post)
  64. self.fetch_thread_participants(post.thread)
  65. allow_see_private_post(request.user, post)
  66. allow_see_private_thread(request.user, post.thread)
  67. allow_use_private_threads(request.user)
  68. class PrivateThreads(generic.Threads):
  69. def get_queryset(self):
  70. threads_qs = Forum.objects.private_threads().thread_set
  71. return exclude_invisible_private_threads(threads_qs, self.user)
  72. class PrivateThreadsFiltering(generic.ThreadsFiltering):
  73. def get_available_filters(self):
  74. filters = super(PrivateThreadsFiltering, self).get_available_filters()
  75. if self.user.acl['can_moderate_private_threads']:
  76. filters.append({
  77. 'type': 'reported',
  78. 'name': _("With reported posts"),
  79. 'is_label': False,
  80. })
  81. return filters
  82. @private_threads_view
  83. class PrivateThreadsView(generic.ThreadsView):
  84. link_name = 'misago:private_threads'
  85. template = 'misago/privatethreads/list.html'
  86. Threads = PrivateThreads
  87. Filtering = PrivateThreadsFiltering
  88. @private_threads_view
  89. class ThreadView(PrivateThreadsMixin, generic.ThreadView):
  90. pass
  91. @private_threads_view
  92. class GotoLastView(PrivateThreadsMixin, generic.GotoLastView):
  93. pass
  94. @private_threads_view
  95. class GotoNewView(PrivateThreadsMixin, generic.GotoNewView):
  96. pass
  97. @private_threads_view
  98. class GotoPostView(PrivateThreadsMixin, generic.GotoPostView):
  99. pass
  100. @private_threads_view
  101. class ReportedPostsListView(PrivateThreadsMixin, generic.ReportedPostsListView):
  102. pass
  103. @private_threads_view
  104. class QuotePostView(PrivateThreadsMixin, generic.QuotePostView):
  105. pass
  106. @private_threads_view
  107. class UnhidePostView(PrivateThreadsMixin, generic.UnhidePostView):
  108. pass
  109. @private_threads_view
  110. class HidePostView(PrivateThreadsMixin, generic.HidePostView):
  111. pass
  112. @private_threads_view
  113. class DeletePostView(PrivateThreadsMixin, generic.DeletePostView):
  114. pass
  115. @private_threads_view
  116. class EventsView(PrivateThreadsMixin, generic.EventsView):
  117. pass
  118. @private_threads_view
  119. class PostingView(PrivateThreadsMixin, generic.PostingView):
  120. pass