Просмотр исходного кода

Hackish implementation of warnings restrictions. #37

Rafał Pitoń 11 лет назад
Родитель
Сommit
1cb4a7a499

+ 16 - 1
misago/apps/threads/posting.py

@@ -3,9 +3,10 @@ from django.shortcuts import redirect
 from django.utils import timezone
 from django.utils.translation import ugettext as _
 from misago import messages
+from misago.acl.exceptions import ACLError403
 from misago.apps.threads.forms import NewThreadForm, EditThreadForm
 from misago.apps.threadtype.posting import NewThreadBaseView, EditThreadBaseView, NewReplyBaseView, EditReplyBaseView
-from misago.models import Forum, Thread, Post, Poll, PollOption
+from misago.models import Forum, Thread, Post, Poll, PollOption, WarnLevel
 from misago.apps.threads.mixins import TypeMixin
 
 
@@ -86,6 +87,13 @@ class NewThreadView(NewThreadBaseView, TypeMixin, PollFormMixin, PrefixFormMixin
     def set_forum_context(self):
         self.forum = Forum.objects.get(pk=self.kwargs.get('forum'), type='forum')
 
+    def check_permissions(self):
+        if self.request.user.warning_level_disallows_writing_threads:
+            raise ACLError403(_("You can't start new threads due to your warning level."))
+
+    def force_moderation(self):
+        return self.request.user.warning_level_moderate_new_threads
+
     def after_form(self, form):
         if form.cleaned_data.get('poll_question'):
             self.create_poll(form)
@@ -123,6 +131,13 @@ class EditThreadView(EditThreadBaseView, TypeMixin, PollFormMixin, PrefixFormMix
 
 
 class NewReplyView(NewReplyBaseView, TypeMixin):
+    def check_permissions(self):
+        if self.request.user.warning_level_disallows_writing_replies:
+            raise ACLError403(_("You can't reply to threads due to your warning level."))
+
+    def force_moderation(self):
+        return self.request.user.warning_level_moderate_new_replies
+
     def response(self):
         if self.post.moderated:
             messages.success(self.request, _("Your reply has been posted. It will be hidden from other members until moderator reviews it."), 'threads_%s' % self.post.pk)

+ 3 - 0
misago/apps/threadtype/posting/base.py

@@ -25,6 +25,9 @@ class PostingBaseView(ViewBase):
         if self.forum.level:
             self.parents = Forum.objects.forum_parents(self.forum.pk)
 
+    def force_moderation(self):
+        return False
+
     def record_edit(self, form, old_name, old_post):
         self.post.edits += 1
         self.post.edit_user = self.request.user

+ 1 - 1
misago/apps/threadtype/posting/editthread.py

@@ -14,7 +14,7 @@ class EditThreadBaseView(PostingBaseView):
         self.post = self.thread.start_post
         self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
         self.request.acl.threads.allow_thread_edit(self.request.user, self.proxy, self.thread, self.post)
-        
+
     def form_initial_data(self):
         return {
                 'thread_name': self.thread.name,

+ 6 - 2
misago/apps/threadtype/posting/newreply.py

@@ -29,8 +29,12 @@ class NewReplyBaseView(PostingBaseView):
 
     def post_form(self, form):
         now = timezone.now()
-        moderation = (not self.request.acl.threads.acl[self.forum.pk]['can_approve']
-                      and self.request.acl.threads.acl[self.forum.pk]['can_start_threads'] == 1)
+
+        if self.force_moderation():
+            moderation = True
+        else:
+            moderation = (not self.request.acl.threads.acl[self.forum.pk]['can_approve']
+                          and self.request.acl.threads.acl[self.forum.pk]['can_start_threads'] == 1)
 
         self.thread.previous_last = self.thread.last_post
         self.md, post_preparsed = post_markdown(form.cleaned_data['post'])

+ 6 - 2
misago/apps/threadtype/posting/newthread.py

@@ -20,8 +20,12 @@ class NewThreadBaseView(PostingBaseView):
 
     def post_form(self, form):
         now = timezone.now()
-        moderation = (not self.request.acl.threads.acl[self.forum.pk]['can_approve']
-                      and self.request.acl.threads.acl[self.forum.pk]['can_start_threads'] == 1)
+
+        if self.force_moderation():
+            moderation = True
+        else:
+            moderation = (not self.request.acl.threads.acl[self.forum.pk]['can_approve']
+                          and self.request.acl.threads.acl[self.forum.pk]['can_start_threads'] == 1)
 
         # Create empty thread
         self.thread = Thread.objects.create(

+ 36 - 0
misago/models/usermodel.py

@@ -616,6 +616,42 @@ class User(models.Model):
                     return True
         return False
 
+    @property
+    def warning_level_moderate_new_threads(self):
+        warning_level = self.get_current_warning_level()
+        if warning_level:
+            restriction_level = warning_level.restrict_posting_threads
+            return restriction_level == warning_level.RESTRICT_MODERATOR_REVIEW
+        else:
+            return False
+
+    @property
+    def warning_level_disallows_writing_threads(self):
+        warning_level = self.get_current_warning_level()
+        if warning_level:
+            restriction_level = warning_level.restrict_posting_threads
+            return restriction_level == warning_level.RESTRICT_DISALLOW
+        else:
+            return False
+
+    @property
+    def warning_level_moderate_new_replies(self):
+        warning_level = self.get_current_warning_level()
+        if warning_level:
+            restriction_level = warning_level.restrict_posting_replies
+            return restriction_level == warning_level.RESTRICT_MODERATOR_REVIEW
+        else:
+            return False
+
+    @property
+    def warning_level_disallows_writing_replies(self):
+        warning_level = self.get_current_warning_level()
+        if warning_level:
+            restriction_level = warning_level.restrict_posting_replies
+            return restriction_level == warning_level.RESTRICT_DISALLOW
+        else:
+            return False
+
     def timeline(self, qs, length=100):
         posts = {}
         now = tz_util.now()

+ 2 - 2
templates/cranefly/threads/thread.html

@@ -556,7 +556,7 @@
     {% endif %}
   </div>
 
-  {% if user.is_authenticated() and acl.threads.can_reply(forum, thread) %}
+  {% if user.is_authenticated() and acl.threads.can_reply(forum, thread) and not user.warning_level_disallows_writing_replies %}
   <div class="thread-quick-reply">
     <form action="{{ url('thread_reply', thread=thread.pk, slug=thread.slug) }}"{% if acl.threads.can_upload_attachments(forum) %} enctype="multipart/form-data"{% endif %} method="post">
       <input type="hidden" name="{{ csrf_id }}" value="{{ csrf_token }}">
@@ -627,7 +627,7 @@
     });
     {% endif %}
   </script>
-  {% if user.is_authenticated() and acl.threads.can_reply(forum, thread) %}
+  {% if user.is_authenticated() and acl.threads.can_reply(forum, thread) and not user.warning_level_disallows_writing_replies %}
   {{ editor.js() }}
   {% endif %}
 {%- endblock %}