Browse Source

Continue movement to new permission system

Alec Nikolas Reiter 9 years ago
parent
commit
7fc63d6697
3 changed files with 41 additions and 22 deletions
  1. 24 19
      flaskbb/forum/views.py
  2. 16 2
      flaskbb/utils/requirements.py
  3. 1 1
      tests/fixtures/forum.py

+ 24 - 19
flaskbb/forum/views.py

@@ -12,17 +12,21 @@
 import datetime
 
 from flask import (Blueprint, redirect, url_for, current_app,
-                   request, flash, jsonify)
+                   request, flash)
 from flask_login import login_required, current_user
 from flask_babelex import gettext as _
-
+from flask_allows import Permission, Or
 from flaskbb.extensions import db
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.helpers import (get_online_users, time_diff, format_quote,
                                    render_template, do_topic_action)
-from flaskbb.utils.permissions import (can_post_reply, can_post_topic,
-                                       can_delete_topic, can_delete_post,
-                                       can_edit_post, can_moderate)
+
+from flaskbb.utils.requirements import (CanPostReply, CanPostTopic,
+                                        IsAtleastModeratorInForum,
+                                        CanDeleteTopic, CanEditPost,
+                                        CanDeletePost)
+
+
 from flaskbb.forum.models import (Category, Forum, Topic, Post, ForumsRead,
                                   TopicsRead)
 from flaskbb.forum.forms import (QuickreplyForm, ReplyForm, NewTopicForm,
@@ -125,7 +129,7 @@ def view_topic(topic_id, slug=None):
     topic.update_read(current_user, topic.forum, forumsread)
 
     form = None
-    if can_post_reply(user=current_user, topic=topic):
+    if Permission(CanPostReply):
         form = QuickreplyForm()
         if form.validate_on_submit():
             post = form.save(current_user, topic)
@@ -155,7 +159,7 @@ def view_post(post_id):
 def new_topic(forum_id, slug=None):
     forum_instance = Forum.query.filter_by(id=forum_id).first_or_404()
 
-    if not can_post_topic(user=current_user, forum=forum_instance):
+    if not Permission(CanPostTopic):
         flash(_("You do not have the permissions to create a new topic."),
               "danger")
         return redirect(forum.url)
@@ -183,7 +187,7 @@ def new_topic(forum_id, slug=None):
 def delete_topic(topic_id=None, slug=None):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
 
-    if not can_delete_topic(user=current_user, topic=topic):
+    if not Permission(CanDeleteTopic):
         flash(_("You do not have the permissions to delete this topic."),
               "danger")
         return redirect(topic.forum.url)
@@ -200,7 +204,7 @@ def delete_topic(topic_id=None, slug=None):
 def lock_topic(topic_id=None, slug=None):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
 
-    if not can_moderate(user=current_user, forum=topic.forum):
+    if not Permission(IsAtleastModeratorInForum(topic.forum.id)):
         flash(_("You do not have the permissions to lock this topic."),
               "danger")
         return redirect(topic.url)
@@ -216,7 +220,7 @@ def lock_topic(topic_id=None, slug=None):
 def unlock_topic(topic_id=None, slug=None):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
 
-    if not can_moderate(user=current_user, forum=topic.forum):
+    if not Permission(IsAtleastModeratorInForum(topic.forum.id)):
         flash(_("You do not have the permissions to unlock this topic."),
               "danger")
         return redirect(topic.url)
@@ -232,7 +236,7 @@ def unlock_topic(topic_id=None, slug=None):
 def highlight_topic(topic_id=None, slug=None):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
 
-    if not can_moderate(user=current_user, forum=topic.forum):
+    if not Permission(IsAtleastModeratorInForum(topic.forum.id)):
         flash(_("You do not have the permissions to highlight this topic."),
               "danger")
         return redirect(topic.url)
@@ -249,7 +253,7 @@ def trivialize_topic(topic_id=None, slug=None):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
 
     # Unlock is basically the same as lock
-    if not can_moderate(user=current_user, forum=topic.forum):
+    if not Permission(IsAtleastModeratorInForum(topic.forum.id)):
         flash(_("You do not have the permissions to trivialize this topic."),
               "danger")
         return redirect(topic.url)
@@ -272,7 +276,7 @@ def manage_forum(forum_id, slug=None):
     available_forums = Forum.query.order_by(Forum.position).all()
     available_forums.remove(forum_instance)
 
-    if not can_moderate(current_user, forum=forum_instance):
+    if not Permission(IsAtleastModeratorInForum()):
         flash(_("You do not have the permissions to moderate this forum."),
               "danger")
         return redirect(forum_instance.url)
@@ -338,8 +342,9 @@ def manage_forum(forum_id, slug=None):
 
             new_forum = Forum.query.filter_by(id=new_forum_id).first_or_404()
             # check the permission in the current forum and in the new forum
-            if not can_moderate(current_user, forum_instance) or \
-                    not can_moderate(current_user, new_forum):
+
+            if not Permission(Or(IsAtleastModeratorInForum(new_forum_id),
+                                 IsAtleastModeratorInForum(forum_instance.id))):
                 flash(_("You do not have the permissions to move this topic."),
                       "danger")
                 return redirect(mod_forum_url)
@@ -359,7 +364,7 @@ def manage_forum(forum_id, slug=None):
 def new_post(topic_id, slug=None):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
 
-    if not can_post_reply(user=current_user, topic=topic):
+    if not Permission(CanPostReply):
         flash(_("You do not have the permissions to post in this topic."),
               "danger")
         return redirect(topic.forum.url)
@@ -386,7 +391,7 @@ def reply_post(topic_id, post_id):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
     post = Post.query.filter_by(id=post_id).first_or_404()
 
-    if not can_post_reply(user=current_user, topic=topic):
+    if not Permission(CanPostReply):
         flash(_("You do not have the permissions to post in this topic."),
               "danger")
         return redirect(topic.forum.url)
@@ -412,7 +417,7 @@ def reply_post(topic_id, post_id):
 def edit_post(post_id):
     post = Post.query.filter_by(id=post_id).first_or_404()
 
-    if not can_edit_post(user=current_user, post=post):
+    if not Permission(CanEditPost):
         flash(_("You do not have the permissions to edit this post."),
               "danger")
         return redirect(post.topic.url)
@@ -443,7 +448,7 @@ def delete_post(post_id):
 
     # TODO: Bulk delete
 
-    if not can_delete_post(user=current_user, post=post):
+    if not Permission(CanDeletePost):
         flash(_("You do not have the permissions to delete this post."),
               "danger")
         return redirect(post.topic.url)

+ 16 - 2
flaskbb/utils/requirements.py

@@ -27,6 +27,9 @@ class IsAuthed(Requirement):
 
 
 class IsModeratorInForum(IsAuthed):
+    def __init__(self, forum_id=None):
+        self.forum_id = forum_id
+
     def fulfill(self, user, request):
         moderators = self._get_forum_moderators(request)
         return (super(IsModeratorInForum, self).fulfill(user, request) and
@@ -36,7 +39,15 @@ class IsModeratorInForum(IsAuthed):
         return user in moderators
 
     def _get_forum_moderators(self, request):
-        return self._get_forum_from_request(request).moderators
+        return self._get_forum(request).moderators
+
+    def _get_forum(self, request):
+        if self.forum_id is not None:
+            return self._get_forum_from_id()
+        return self._get_forum_from_request()
+
+    def _get_forum_from_id(self):
+        return Forum.query.get(self.forum_id)
 
     def _get_forum_from_request(self, request):
         view_args = request.view_args
@@ -100,6 +111,9 @@ class ForumNotLocked(Requirement):
             return Forum.query.get(view_args['forum_id'])
 
 
+def IsAtleastModeratorInForum(forum_id=None):
+    return Or(IsAtleastSuperModerator, IsModeratorInForum(forum_id))
+
 IsMod = And(IsAuthed(), Has('mod'))
 IsSuperMod = And(IsAuthed(), Has('super_mod'))
 IsAdmin = And(IsAuthed(), Has('admin'))
@@ -130,4 +144,4 @@ CanPostTopic = Or(And(Has('posttopic'), ForumNotLocked()),
 
 CanDeleteTopic = Or(And(IsSameUser(), Has('deletetopic'), TopicNotLocked()),
                     IsAtleastSuperModerator,
-                    And(IsModeratorInForum, Has('deletetopic')))
+                    And(IsModeratorInForum(), Has('deletetopic')))

+ 1 - 1
tests/fixtures/forum.py

@@ -18,7 +18,7 @@ def category(database):
 def forum(category, default_settings, default_groups):
     """A single forum in a category."""
     forum = Forum(title="Test Forum", category_id=category.id)
-    forum.groups  = default_groups
+    forum.groups = default_groups
     forum.save()
     return forum