privatethreads.py 5.1 KB

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