Browse Source

permission for excluding users from flood protection

Rafał Pitoń 8 years ago
parent
commit
56c4f8b405

+ 1 - 0
misago/acl/migrations/0003_default_roles.py

@@ -115,6 +115,7 @@ def create_default_roles(apps, schema_editor):
             'misago.threads.permissions.threads': {
             'misago.threads.permissions.threads': {
                 'can_see_unapproved_content_lists': True,
                 'can_see_unapproved_content_lists': True,
                 'can_see_reported_content_lists': True,
                 'can_see_reported_content_lists': True,
+                'can_omit_flood_protection': True,
             },
             },
             'misago.users.permissions.moderation': {
             'misago.users.permissions.moderation': {
                 'can_warn_users': 1,
                 'can_warn_users': 1,

+ 1 - 1
misago/threads/api/postingendpoint/floodprotection.py

@@ -12,7 +12,7 @@ MIN_POSTING_PAUSE = 3
 
 
 class FloodProtectionMiddleware(PostingMiddleware):
 class FloodProtectionMiddleware(PostingMiddleware):
     def use_this_middleware(self):
     def use_this_middleware(self):
-        return self.mode != PostingEndpoint.EDIT
+        return not self.user.acl['can_omit_flood_protection'] and self.mode != PostingEndpoint.EDIT
 
 
     def interrupt_posting(self, serializer):
     def interrupt_posting(self, serializer):
         now = timezone.now()
         now = timezone.now()

+ 7 - 1
misago/threads/permissions/threads.py

@@ -48,6 +48,10 @@ class RolePermissionsForm(forms.Form):
                     "categories in which the user has permission to see posts "
                     "categories in which the user has permission to see posts "
                     "reports.")
                     "reports.")
     )
     )
+    can_omit_flood_protection = forms.YesNoSwitch(
+        label=_("Can omit flood protection"),
+        help_text=_("Allows posting more frequently than flood protection would.")
+    )
 
 
 
 
 class CategoryPermissionsForm(forms.Form):
 class CategoryPermissionsForm(forms.Form):
@@ -205,6 +209,7 @@ def build_acl(acl, roles, key_name):
         'can_delete_other_users_attachments': False,
         'can_delete_other_users_attachments': False,
         'can_see_unapproved_content_lists': False,
         'can_see_unapproved_content_lists': False,
         'can_see_reported_content_lists': False,
         'can_see_reported_content_lists': False,
+        'can_omit_flood_protection': False,
         'can_approve_content': [],
         'can_approve_content': [],
         'can_see_reports': [],
         'can_see_reports': [],
     })
     })
@@ -214,7 +219,8 @@ def build_acl(acl, roles, key_name):
         max_attachment_size=algebra.greater,
         max_attachment_size=algebra.greater,
         can_delete_other_users_attachments=algebra.greater,
         can_delete_other_users_attachments=algebra.greater,
         can_see_unapproved_content_lists=algebra.greater,
         can_see_unapproved_content_lists=algebra.greater,
-        can_see_reported_content_lists=algebra.greater
+        can_see_reported_content_lists=algebra.greater,
+        can_omit_flood_protection=algebra.greater
     )
     )
 
 
     categories_roles = get_categories_roles(roles)
     categories_roles = get_categories_roles(roles)

+ 12 - 2
misago/threads/tests/test_floodprotection_middleware.py

@@ -2,6 +2,7 @@ from datetime import timedelta
 
 
 from django.utils import timezone
 from django.utils import timezone
 
 
+from misago.acl.testutils import override_acl
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 from ..api.postingendpoint import PostingInterrupt
 from ..api.postingendpoint import PostingInterrupt
@@ -20,7 +21,7 @@ class FloodProtectionMiddlewareTests(AuthenticatedUserTestCase):
         self.assertIsNotNone(self.user.last_posted_on)
         self.assertIsNotNone(self.user.last_posted_on)
 
 
     def test_flood_protection_middleware_old_posts(self):
     def test_flood_protection_middleware_old_posts(self):
-        """middleware is not complaining about old post"""
+        """middleware is not interrupting if previous post is old"""
         self.user.update_fields = []
         self.user.update_fields = []
 
 
         original_last_posted_on = timezone.now() - timedelta(days=1)
         original_last_posted_on = timezone.now() - timedelta(days=1)
@@ -32,9 +33,18 @@ class FloodProtectionMiddlewareTests(AuthenticatedUserTestCase):
         self.assertTrue(self.user.last_posted_on > original_last_posted_on)
         self.assertTrue(self.user.last_posted_on > original_last_posted_on)
 
 
     def test_flood_protection_middleware_on_flood(self):
     def test_flood_protection_middleware_on_flood(self):
-        """middleware is complaining about flood"""
+        """middleware is interrupting flood"""
         self.user.last_posted_on = timezone.now()
         self.user.last_posted_on = timezone.now()
 
 
         with self.assertRaises(PostingInterrupt):
         with self.assertRaises(PostingInterrupt):
             middleware = FloodProtectionMiddleware(user=self.user)
             middleware = FloodProtectionMiddleware(user=self.user)
             middleware.interrupt_posting(None)
             middleware.interrupt_posting(None)
+
+    def test_flood_permission(self):
+        """middleware is respects permission to flood for team members"""
+        override_acl(self.user, {
+            'can_omit_flood_protection': True
+        })
+
+        middleware = FloodProtectionMiddleware(user=self.user)
+        self.assertFalse(middleware.use_this_middleware())