Browse Source

Convert multihttp management views to CBV

Alec Nikolas Reiter 7 years ago
parent
commit
2579e052d7
1 changed files with 419 additions and 251 deletions
  1. 419 251
      flaskbb/management/views.py

+ 419 - 251
flaskbb/management/views.py

@@ -13,6 +13,7 @@ import sys
 from celery import __version__ as celery_version
 from celery import __version__ as celery_version
 from flask import (Blueprint, current_app, request, redirect, url_for, flash,
 from flask import (Blueprint, current_app, request, redirect, url_for, flash,
                    jsonify, __version__ as flask_version)
                    jsonify, __version__ as flask_version)
+from flask.views import MethodView
 from flask_login import current_user, login_fresh
 from flask_login import current_user, login_fresh
 from flask_plugins import get_all_plugins, get_plugin, get_plugin_from_all
 from flask_plugins import get_all_plugins, get_plugin, get_plugin_from_all
 from flask_babelplus import gettext as _
 from flask_babelplus import gettext as _
@@ -26,8 +27,8 @@ from flaskbb.utils.requirements import (IsAtleastModerator, IsAdmin,
                                         CanBanUser, CanEditUser,
                                         CanBanUser, CanEditUser,
                                         IsAtleastSuperModerator)
                                         IsAtleastSuperModerator)
 from flaskbb.extensions import db, allows, celery
 from flaskbb.extensions import db, allows, celery
-from flaskbb.utils.helpers import (render_template, time_diff, time_utcnow,
-                                   get_online_users)
+from flaskbb.utils.helpers import (get_online_users, register_view,
+                                   render_template, time_diff, time_utcnow)
 from flaskbb.user.models import Guest, User, Group
 from flaskbb.user.models import Guest, User, Group
 from flaskbb.forum.models import Post, Topic, Forum, Category, Report
 from flaskbb.forum.models import Post, Topic, Forum, Category, Report
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.management.models import Setting, SettingsGroup
@@ -102,115 +103,7 @@ def overview():
     return render_template("management/overview.html", **stats)
     return render_template("management/overview.html", **stats)
 
 
 
 
-@management.route("/settings", methods=["GET", "POST"])
-@management.route("/settings/<path:slug>", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def settings(slug=None):
-    slug = slug if slug else "general"
-
-    # get the currently active group
-    active_group = SettingsGroup.query.filter_by(key=slug).first_or_404()
-    # get all groups - used to build the navigation
-    all_groups = SettingsGroup.query.all()
-
-    SettingsForm = Setting.get_form(active_group)
-
-    old_settings = Setting.get_settings(active_group)
-    new_settings = {}
-
-    form = SettingsForm()
-
-    if form.validate_on_submit():
-        for key, values in iteritems(old_settings):
-            try:
-                # check if the value has changed
-                if values['value'] == form[key].data:
-                    continue
-                else:
-                    new_settings[key] = form[key].data
-            except KeyError:
-                pass
-        Setting.update(settings=new_settings, app=current_app)
-        flash(_("Settings saved."), "success")
-    else:
-        for key, values in iteritems(old_settings):
-            try:
-                form[key].data = values['value']
-            except (KeyError, ValueError):
-                pass
-
-    return render_template("management/settings.html", form=form,
-                           all_groups=all_groups, active_group=active_group)
-
-
 # Users
 # Users
-@management.route("/users", methods=['GET', 'POST'])
-@allows.requires(IsAtleastModerator)
-def users():
-    page = request.args.get("page", 1, type=int)
-    search_form = UserSearchForm()
-
-    if search_form.validate():
-        users = search_form.get_results().\
-            paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
-        return render_template("management/users.html", users=users,
-                               search_form=search_form)
-
-    users = User.query. \
-        order_by(User.id.asc()).\
-        paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
-
-    return render_template("management/users.html", users=users,
-                           search_form=search_form)
-
-
-@management.route("/users/<int:user_id>/edit", methods=["GET", "POST"])
-@allows.requires(IsAtleastModerator)
-def edit_user(user_id):
-    user = User.query.filter_by(id=user_id).first_or_404()
-
-    if not Permission(CanEditUser, identity=current_user):
-        flash(_("You are not allowed to edit this user."), "danger")
-        return redirect(url_for("management.users"))
-
-    member_group = db.and_(*[db.not_(getattr(Group, p)) for p in
-                             ['admin', 'mod', 'super_mod', 'banned', 'guest']])
-
-    filt = db.or_(
-        Group.id.in_(g.id for g in current_user.groups), member_group
-    )
-
-    if Permission(IsAtleastSuperModerator, identity=current_user):
-        filt = db.or_(filt, Group.mod)
-
-    if Permission(IsAdmin, identity=current_user):
-        filt = db.or_(filt, Group.admin, Group.super_mod)
-
-    if Permission(CanBanUser, identity=current_user):
-        filt = db.or_(filt, Group.banned)
-
-    group_query = Group.query.filter(filt)
-
-    form = EditUserForm(user)
-    form.primary_group.query = group_query
-    form.secondary_groups.query = group_query
-    if form.validate_on_submit():
-        form.populate_obj(user)
-        user.primary_group_id = form.primary_group.data.id
-
-        # Don't override the password
-        if form.password.data:
-            user.password = form.password.data
-
-        user.save(groups=form.secondary_groups.data)
-
-        flash(_("User updated."), "success")
-        return redirect(url_for("management.edit_user", user_id=user.id))
-
-    return render_template("management/user_form.html", form=form,
-                           title=_("Edit User"))
-
-
 @management.route("/users/delete", methods=["POST"])
 @management.route("/users/delete", methods=["POST"])
 @management.route("/users/<int:user_id>/delete", methods=["POST"])
 @management.route("/users/<int:user_id>/delete", methods=["POST"])
 @allows.requires(IsAdmin)
 @allows.requires(IsAdmin)
@@ -251,41 +144,6 @@ def delete_user(user_id=None):
     return redirect(url_for("management.users"))
     return redirect(url_for("management.users"))
 
 
 
 
-@management.route("/users/add", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def add_user():
-    form = AddUserForm()
-    if form.validate_on_submit():
-        form.save()
-        flash(_("User added."), "success")
-        return redirect(url_for("management.users"))
-
-    return render_template("management/user_form.html", form=form,
-                           title=_("Add User"))
-
-
-@management.route("/users/banned", methods=["GET", "POST"])
-@allows.requires(IsAtleastModerator)
-def banned_users():
-    page = request.args.get("page", 1, type=int)
-    search_form = UserSearchForm()
-
-    users = User.query.filter(
-        Group.banned == True,
-        Group.id == User.primary_group_id
-    ).paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
-
-    if search_form.validate():
-        users = search_form.get_results().\
-            paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
-
-        return render_template("management/banned_users.html", users=users,
-                               search_form=search_form)
-
-    return render_template("management/banned_users.html", users=users,
-                           search_form=search_form)
-
-
 @management.route("/users/ban", methods=["POST"])
 @management.route("/users/ban", methods=["POST"])
 @management.route("/users/<int:user_id>/ban", methods=["POST"])
 @management.route("/users/<int:user_id>/ban", methods=["POST"])
 @allows.requires(IsAtleastModerator)
 @allows.requires(IsAtleastModerator)
@@ -511,27 +369,6 @@ def groups():
     return render_template("management/groups.html", groups=groups)
     return render_template("management/groups.html", groups=groups)
 
 
 
 
-@management.route("/groups/<int:group_id>/edit", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def edit_group(group_id):
-    group = Group.query.filter_by(id=group_id).first_or_404()
-
-    form = EditGroupForm(group)
-
-    if form.validate_on_submit():
-        form.populate_obj(group)
-        group.save()
-
-        if group.guest:
-            Guest.invalidate_cache()
-
-        flash(_("Group updated."), "success")
-        return redirect(url_for("management.groups", group_id=group.id))
-
-    return render_template("management/group_form.html", form=form,
-                           title=_("Edit Group"))
-
-
 @management.route("/groups/<int:group_id>/delete", methods=["POST"])
 @management.route("/groups/<int:group_id>/delete", methods=["POST"])
 @management.route("/groups/delete", methods=["POST"])
 @management.route("/groups/delete", methods=["POST"])
 @allows.requires(IsAdmin)
 @allows.requires(IsAdmin)
@@ -578,19 +415,6 @@ def delete_group(group_id=None):
     return redirect(url_for("management.groups"))
     return redirect(url_for("management.groups"))
 
 
 
 
-@management.route("/groups/add", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def add_group():
-    form = AddGroupForm()
-    if form.validate_on_submit():
-        form.save()
-        flash(_("Group added."), "success")
-        return redirect(url_for("management.groups"))
-
-    return render_template("management/group_form.html", form=form,
-                           title=_("Add Group"))
-
-
 # Forums and Categories
 # Forums and Categories
 @management.route("/forums")
 @management.route("/forums")
 @allows.requires(IsAdmin)
 @allows.requires(IsAdmin)
@@ -599,28 +423,6 @@ def forums():
     return render_template("management/forums.html", categories=categories)
     return render_template("management/forums.html", categories=categories)
 
 
 
 
-@management.route("/forums/<int:forum_id>/edit", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def edit_forum(forum_id):
-    forum = Forum.query.filter_by(id=forum_id).first_or_404()
-
-    form = EditForumForm(forum)
-    if form.validate_on_submit():
-        form.save()
-        flash(_("Forum updated."), "success")
-        return redirect(url_for("management.edit_forum", forum_id=forum.id))
-    else:
-        if forum.moderators:
-            form.moderators.data = ",".join([
-                user.username for user in forum.moderators
-            ])
-        else:
-            form.moderators.data = None
-
-    return render_template("management/forum_form.html", form=form,
-                           title=_("Edit Forum"))
-
-
 @management.route("/forums/<int:forum_id>/delete", methods=["POST"])
 @management.route("/forums/<int:forum_id>/delete", methods=["POST"])
 @allows.requires(IsAdmin)
 @allows.requires(IsAdmin)
 def delete_forum(forum_id):
 def delete_forum(forum_id):
@@ -635,56 +437,6 @@ def delete_forum(forum_id):
     return redirect(url_for("management.forums"))
     return redirect(url_for("management.forums"))
 
 
 
 
-@management.route("/forums/add", methods=["GET", "POST"])
-@management.route("/forums/<int:category_id>/add", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def add_forum(category_id=None):
-    form = AddForumForm()
-
-    if form.validate_on_submit():
-        form.save()
-        flash(_("Forum added."), "success")
-        return redirect(url_for("management.forums"))
-    else:
-        form.groups.data = Group.query.order_by(Group.id.asc()).all()
-        if category_id:
-            category = Category.query.filter_by(id=category_id).first()
-            form.category.data = category
-
-    return render_template("management/forum_form.html", form=form,
-                           title=_("Add Forum"))
-
-
-@management.route("/category/add", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def add_category():
-    form = CategoryForm()
-
-    if form.validate_on_submit():
-        form.save()
-        flash(_("Category added."), "success")
-        return redirect(url_for("management.forums"))
-
-    return render_template("management/category_form.html", form=form,
-                           title=_("Add Category"))
-
-
-@management.route("/category/<int:category_id>/edit", methods=["GET", "POST"])
-@allows.requires(IsAdmin)
-def edit_category(category_id):
-    category = Category.query.filter_by(id=category_id).first_or_404()
-
-    form = CategoryForm(obj=category)
-
-    if form.validate_on_submit():
-        form.populate_obj(category)
-        flash(_("Category updated."), "success")
-        category.save()
-
-    return render_template("management/category_form.html", form=form,
-                           title=_("Edit Category"))
-
-
 @management.route("/category/<int:category_id>/delete", methods=["POST"])
 @management.route("/category/<int:category_id>/delete", methods=["POST"])
 @allows.requires(IsAdmin)
 @allows.requires(IsAdmin)
 def delete_category(category_id):
 def delete_category(category_id):
@@ -778,3 +530,419 @@ def install_plugin(plugin):
         flash(_("Cannot install plugin."), "danger")
         flash(_("Cannot install plugin."), "danger")
 
 
     return redirect(url_for("management.plugins"))
     return redirect(url_for("management.plugins"))
+
+
+class ManagementSettings(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+
+    def get(self, slug=None):
+        slug = slug if slug else 'general'
+
+        # get the currently active group
+        active_group = SettingsGroup.query.filter_by(key=slug).first_or_404()
+        # get all groups - used to build the navigation
+        all_groups = SettingsGroup.query.all()
+
+        SettingsForm = Setting.get_form(active_group)
+
+        old_settings = Setting.get_settings(active_group)
+
+        form = SettingsForm()
+        for key, values in iteritems(old_settings):
+            try:
+                form[key].data = values['value']
+            except (KeyError, ValueError):
+                pass
+
+        return render_template(
+            'management/settings.html',
+            form=form,
+            all_groups=all_groups,
+            active_group=active_group
+        )
+
+    def post(self, slug=None):
+        slug = slug if slug else 'general'
+
+        # get the currently active group
+        active_group = SettingsGroup.query.filter_by(key=slug).first_or_404()
+        # get all groups - used to build the navigation
+        all_groups = SettingsGroup.query.all()
+
+        SettingsForm = Setting.get_form(active_group)
+
+        old_settings = Setting.get_settings(active_group)
+        new_settings = {}
+
+        form = SettingsForm()
+
+        if form.validate_on_submit():
+            for key, values in iteritems(old_settings):
+                try:
+                    # check if the value has changed
+                    if values['value'] == form[key].data:
+                        continue
+                    else:
+                        new_settings[key] = form[key].data
+                except KeyError:
+                    pass
+            Setting.update(settings=new_settings, app=current_app)
+            flash(_('Settings saved.'), 'success')
+        else:
+            for key, values in iteritems(old_settings):
+                try:
+                    form[key].data = values['value']
+                except (KeyError, ValueError):
+                    pass
+
+        return render_template(
+            'management/settings.html',
+            form=form,
+            all_groups=all_groups,
+            active_group=active_group
+        )
+
+
+class ManageUsers(MethodView):
+    decorators = [allows.requires(IsAtleastModerator)]
+    form = UserSearchForm
+
+    def get(self):
+        page = request.args.get('page', 1, type=int)
+        form = self.form()
+
+        users = User.query.order_by(User.id.asc()).paginate(
+            page, flaskbb_config['USERS_PER_PAGE'], False
+        )
+
+        return render_template('management/users.html', users=users, form=form)
+
+    def post(self):
+        page = request.args.get('page', 1, type=int)
+        form = self.form()
+
+        if form.validate():
+            users = form.get_results().\
+                paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
+            return render_template('management/users.html', users=users, form=form)
+
+        users = User.query.order_by(User.id.asc()).paginate(
+            page, flaskbb_config['USERS_PER_PAGE'], False
+        )
+
+        return render_template('management/users.html', users=users, form=form)
+
+
+class EditUser(MethodView):
+    decorators = [allows.requires(IsAtleastModerator & CanEditUser)]
+    form = EditUserForm
+
+    def get(self, user_id):
+        user = User.query.filter_by(id=user_id).first_or_404()
+        form = self.form(user)
+        member_group = db.and_(
+            * [
+                db.not_(getattr(Group, p))
+                for p in ['admin', 'mod', 'super_mod', 'banned', 'guest']
+            ]
+        )
+
+        filt = db.or_(Group.id.in_(g.id for g in current_user.groups), member_group)
+
+        if Permission(IsAtleastSuperModerator, identity=current_user):
+            filt = db.or_(filt, Group.mod)
+
+        if Permission(IsAdmin, identity=current_user):
+            filt = db.or_(filt, Group.admin, Group.super_mod)
+
+        if Permission(CanBanUser, identity=current_user):
+            filt = db.or_(filt, Group.banned)
+
+        group_query = Group.query.filter(filt)
+
+        form.primary_group.query = group_query
+        form.secondary_groups.query = group_query
+
+        return render_template('management/user_form.html', form=form, title=_('Edit User'))
+
+    def post(self, user_id):
+        user = User.query.filter_by(id=user_id).first_or_404()
+
+        member_group = db.and_(
+            * [
+                db.not_(getattr(Group, p))
+                for p in ['admin', 'mod', 'super_mod', 'banned', 'guest']
+            ]
+        )
+
+        filt = db.or_(Group.id.in_(g.id for g in current_user.groups), member_group)
+
+        if Permission(IsAtleastSuperModerator, identity=current_user):
+            filt = db.or_(filt, Group.mod)
+
+        if Permission(IsAdmin, identity=current_user):
+            filt = db.or_(filt, Group.admin, Group.super_mod)
+
+        if Permission(CanBanUser, identity=current_user):
+            filt = db.or_(filt, Group.banned)
+
+        group_query = Group.query.filter(filt)
+
+        form = EditUserForm(user)
+        form.primary_group.query = group_query
+        form.secondary_groups.query = group_query
+        if form.validate_on_submit():
+            form.populate_obj(user)
+            user.primary_group_id = form.primary_group.data.id
+
+            # Don't override the password
+            if form.password.data:
+                user.password = form.password.data
+
+            user.save(groups=form.secondary_groups.data)
+
+            flash(_('User updated.'), 'success')
+            return redirect(url_for('management.edit_user', user_id=user.id))
+
+        return render_template('management/user_form.html', form=form, title=_('Edit User'))
+
+
+class AddUser(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+    form = AddUserForm
+
+    def get(self):
+        return render_template('management/user_form.html', form=self.form(), title=_('Add User'))
+
+    def post(self):
+        form = self.form()
+        if form.validate_on_submit():
+            form.save()
+            flash(_('User added.'), 'success')
+            return redirect(url_for('management.users'))
+
+        return render_template('management/user_form.html', form=form, title=_('Add User'))
+
+
+class BannedUsers(MethodView):
+    decorators = [allows.requires(IsAtleastModerator)]
+    form = UserSearchForm
+
+    def get(self):
+        page = request.args.get('page', 1, type=int)
+        search_form = self.form()
+
+        users = User.query.filter(Group.banned == True, Group.id == User.primary_group_id
+                                  ).paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
+
+        return render_template(
+            'management/banned_users.html', users=users, search_form=search_form
+        )
+
+    def post(self):
+        page = request.args.get('page', 1, type=int)
+        search_form = self.form()
+
+        users = User.query.filter(Group.banned == True, Group.id == User.primary_group_id
+                                  ).paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
+
+        if search_form.validate():
+            users = search_form.get_results().\
+                paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
+
+            return render_template(
+                'management/banned_users.html', users=users, search_form=search_form
+            )
+
+        return render_template(
+            'management/banned_users.html', users=users, search_form=search_form
+        )
+
+
+class AddGroup(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+    form = AddGroupForm
+
+    def get(self):
+        return render_template(
+            'management/group_form.html', form=self.form(), title=_('Add Group')
+        )
+
+    def post(self):
+        form = AddGroupForm()
+        if form.validate_on_submit():
+            form.save()
+            flash(_('Group added.'), 'success')
+            return redirect(url_for('management.groups'))
+
+        return render_template('management/group_form.html', form=form, title=_('Add Group'))
+
+
+class EditGroup(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+    form = EditGroupForm
+
+    def get(self, group_id):
+        group = Group.query.filter_by(id=group_id).first_or_404()
+        form = self.form(group)
+        return render_template('management/group_form.html', form=form, title=_('Edit Group'))
+
+    def post(self, group_id):
+        group = Group.query.filter_by(id=group_id).first_or_404()
+        form = EditGroupForm(group)
+
+        if form.validate_on_submit():
+            form.populate_obj(group)
+            group.save()
+
+            if group.guest:
+                Guest.invalidate_cache()
+
+            flash(_('Group updated.'), 'success')
+            return redirect(url_for('management.groups', group_id=group.id))
+
+        return render_template('management/group_form.html', form=form, title=_('Edit Group'))
+
+
+class EditForum(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+    form = EditForumForm
+
+    def get(self, forum_id):
+        forum = Forum.query.filter_by(id=forum_id).first_or_404()
+
+        form = self.form(forum)
+
+        if forum.moderators:
+            form.moderators.data = ','.join([user.username for user in forum.moderators])
+        else:
+            form.moderators.data = None
+
+        return render_template('management/forum_form.html', form=form, title=_('Edit Forum'))
+
+    def post(self, forum_id):
+        forum = Forum.query.filter_by(id=forum_id).first_or_404()
+
+        form = self.form(forum)
+        if form.validate_on_submit():
+            form.save()
+            flash(_('Forum updated.'), 'success')
+            return redirect(url_for('management.edit_forum', forum_id=forum.id))
+        else:
+            if forum.moderators:
+                form.moderators.data = ','.join([user.username for user in forum.moderators])
+            else:
+                form.moderators.data = None
+
+        return render_template('management/forum_form.html', form=form, title=_('Edit Forum'))
+
+
+class AddForum(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+    form = AddForumForm
+
+    def get(self, category_id=None):
+        form = self.form()
+
+        form.groups.data = Group.query.order_by(Group.id.asc()).all()
+
+        if category_id:
+            category = Category.query.filter_by(id=category_id).first()
+            form.category.data = category
+
+        return render_template('management/forum_form.html', form=form, title=_('Add Forum'))
+
+    def post(self, category_id=None):
+        form = self.form()
+
+        if form.validate_on_submit():
+            form.save()
+            flash(_('Forum added.'), 'success')
+            return redirect(url_for('management.forums'))
+        else:
+            form.groups.data = Group.query.order_by(Group.id.asc()).all()
+            if category_id:
+                category = Category.query.filter_by(id=category_id).first()
+                form.category.data = category
+
+        return render_template('management/forum_form.html', form=form, title=_('Add Forum'))
+
+
+class AddCategory(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+    form = CategoryForm
+
+    def get(self):
+        return render_template(
+            'management/category_form.html', form=self.form(), title=_('Add Category')
+        )
+
+    def post(self):
+        form = self.form()
+
+        if form.validate_on_submit():
+            form.save()
+            flash(_('Category added.'), 'success')
+            return redirect(url_for('management.forums'))
+
+        return render_template('management/category_form.html', form=form, title=_('Add Category'))
+
+
+class EditCategory(MethodView):
+    decorators = [allows.requires(IsAdmin)]
+    form = CategoryForm
+
+    def get(self, category_id):
+        category = Category.query.filter_by(id=category_id).first_or_404()
+
+        form = self.form(obj=category)
+
+        return render_template(
+            'management/category_form.html', form=form, title=_('Edit Category')
+        )
+
+    def post(self, category_id):
+        category = Category.query.filter_by(id=category_id).first_or_404()
+
+        form = self.form(obj=category)
+
+        if form.validate_on_submit():
+            form.populate_obj(category)
+            flash(_('Category updated.'), 'success')
+            category.save()
+
+        return render_template(
+            'management/category_form.html', form=form, title=_('Edit Category')
+        )
+
+
+register_view(
+    management,
+    routes=['/settings', '/settings/<path:slug>'],
+    view_func=ManagementSettings.as_view('settings')
+)
+register_view(management, routes=['/users'], view_func=ManageUsers.as_view('users'))
+register_view(
+    management, routes=['/users/<int:user_id>/edit'], view_func=EditUser.as_view('edit_user')
+)
+register_view(management, routes=['/users/add'], view_func=AddUser.as_view('add_user'))
+register_view(management, routes=['/users/banned'], view_func=BannedUsers.as_view('banned_users'))
+register_view(management, routes=['/groups/add'], view_func=AddGroup.as_view('add_groups'))
+register_view(
+    management, routes=['/groups/<int:group_id>/edit'], view_func=EditGroup.as_view('edit_group')
+)
+register_view(
+    management, routes=['/forums/<int:forum_id>/edit'], view_func=EditForum.as_view('edit_forum')
+)
+
+register_view(
+    management,
+    routes=['/forums/add', '/forums/<int:category_id>/add'],
+    view_func=AddForum.as_view('add_forum')
+)
+register_view(management, routes=['/category/add'], view_func=AddCategory.as_view('add_category'))
+register_view(
+    management,
+    routes=['/category/<int:category_id>/edit'],
+    view_func=EditCategory.as_view('edit_category')
+)