Browse Source

Load user routes from plugin hook

Alec Nikolas Reiter 7 years ago
parent
commit
cf827bae04
2 changed files with 69 additions and 37 deletions
  1. 18 15
      flaskbb/app.py
  2. 51 22
      flaskbb/user/views.py

+ 18 - 15
flaskbb/app.py

@@ -27,17 +27,12 @@ from flaskbb._compat import iteritems, string_types
 from flaskbb.extensions import (alembic, allows, babel, cache, celery, csrf,
                                 db, debugtoolbar, limiter, login_manager, mail,
                                 redis_store, themes, whooshee)
-from .auth import views as auth_views
-from .forum import views as forum_views
-from .management import views as management_views
 from flaskbb.plugins import spec
 from flaskbb.plugins.manager import FlaskBBPluginManager
 from flaskbb.plugins.models import PluginRegistry
 from flaskbb.plugins.utils import remove_zombie_plugins_from_db, template_hook
 # models
 from flaskbb.user.models import Guest, User
-# views
-from flaskbb.user.views import user
 # various helpers
 from flaskbb.utils.helpers import (app_config_from_env, crop_title,
                                    format_date, forum_is_unread,
@@ -58,6 +53,10 @@ from flaskbb.utils.search import (ForumWhoosheer, PostWhoosheer,
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.translations import FlaskBBDomain
 
+from .auth import views as auth_views
+from .forum import views as forum_views
+from .management import views as management_views
+from .user import views as user_views
 
 logger = logging.getLogger(__name__)
 
@@ -78,9 +77,7 @@ def create_app(config=None, instance_path=None):
     """
 
     app = Flask(
-        "flaskbb",
-        instance_path=instance_path,
-        instance_relative_config=True
+        "flaskbb", instance_path=instance_path, instance_relative_config=True
     )
 
     # instance folders are not automatically created by flask
@@ -149,14 +146,15 @@ def configure_celery_app(app, celery):
     TaskBase = celery.Task
 
     class ContextTask(TaskBase):
+
         def __call__(self, *args, **kwargs):
             with app.app_context():
                 return TaskBase.__call__(self, *args, **kwargs)
+
     celery.Task = ContextTask
 
 
 def configure_blueprints(app):
-    app.register_blueprint(user, url_prefix=app.config["USER_URL_PREFIX"])
     app.pluggy.hook.flaskbb_load_blueprints(app=app)
 
 
@@ -243,9 +241,9 @@ def configure_template_filters(app):
         ('can_ban_user', CanBanUser),
     ]
 
-    filters.update([
-        (name, partial(perm, request=request)) for name, perm in permissions
-    ])
+    filters.update(
+        [(name, partial(perm, request=request)) for name, perm in permissions]
+    )
 
     # these create closures
     filters['can_moderate'] = TplCanModerate(request)
@@ -291,6 +289,7 @@ def configure_before_handlers(app):
             db.session.commit()
 
     if app.config["REDIS_ENABLED"]:
+
         @app.before_request
         def mark_current_user_online():
             if current_user.is_authenticated:
@@ -417,8 +416,11 @@ def load_plugins(app):
             plugins = PluginRegistry.query.all()
 
     except (OperationalError, ProgrammingError) as exc:
-        logger.debug("Database is not setup correctly or has not been "
-                     "setup yet.", exc_info=exc)
+        logger.debug(
+            "Database is not setup correctly or has not been "
+            "setup yet.",
+            exc_info=exc
+        )
         # load plugins even though the database isn't setup correctly
         # i.e. when creating the initial database and wanting to install
         # the plugins migration as well
@@ -435,7 +437,8 @@ def load_plugins(app):
     loaded_names = set([p[0] for p in app.pluggy.list_name_plugin()])
     registered_names = set([p.name for p in plugins])
     unregistered = [
-        PluginRegistry(name=name) for name in loaded_names - registered_names
+        PluginRegistry(name=name)
+        for name in loaded_names - registered_names
         # ignore internal FlaskBB modules
         if not name.startswith('flaskbb.') and name != 'flaskbb'
     ]

+ 51 - 22
flaskbb/user/views.py

@@ -10,10 +10,12 @@
     :license: BSD, see LICENSE for more details.
 """
 import logging
+
 from flask import Blueprint, flash, request
 from flask.views import MethodView
 from flask_babelplus import gettext as _
 from flask_login import current_user, login_required
+from pluggy import HookimplMarker
 
 from flaskbb.user.forms import (ChangeEmailForm, ChangePasswordForm,
                                 ChangeUserDetailsForm, GeneralSettingsForm)
@@ -22,10 +24,9 @@ from flaskbb.utils.helpers import (get_available_languages,
                                    get_available_themes, register_view,
                                    render_template)
 
-logger = logging.getLogger(__name__)
-
+impl = HookimplMarker('flaskbb')
 
-user = Blueprint("user", __name__)
+logger = logging.getLogger(__name__)
 
 
 class UserSettings(MethodView):
@@ -36,7 +37,7 @@ class UserSettings(MethodView):
         form = self.form()
 
         form.theme.choices = get_available_themes()
-        form.theme.choices.insert(0,('', 'Default'))
+        form.theme.choices.insert(0, ('', 'Default'))
         form.language.choices = get_available_languages()
         form.theme.data = current_user.theme
         form.language.data = current_user.language
@@ -47,7 +48,7 @@ class UserSettings(MethodView):
         form = self.form()
 
         form.theme.choices = get_available_themes()
-        form.theme.choices.insert(0,('', 'Default'))
+        form.theme.choices.insert(0, ('', 'Default'))
         form.language.choices = get_available_languages()
 
         if form.validate_on_submit():
@@ -85,7 +86,9 @@ class ChangeEmail(MethodView):
     form = ChangeEmailForm
 
     def get(self):
-        return render_template("user/change_email.html", form=self.form(current_user))
+        return render_template(
+            "user/change_email.html", form=self.form(current_user)
+        )
 
     def post(self):
         form = self.form(current_user)
@@ -102,7 +105,9 @@ class ChangeUserDetails(MethodView):
     form = ChangeUserDetailsForm
 
     def get(self):
-        return render_template("user/change_user_details.html", form=self.form(obj=current_user))
+        return render_template(
+            "user/change_user_details.html", form=self.form(obj=current_user)
+        )
 
     def post(self):
         form = self.form(obj=current_user)
@@ -141,18 +146,42 @@ class UserProfile(MethodView):
         return render_template("user/profile.html", user=user)
 
 
-register_view(user, routes=['/settings/email'], view_func=ChangeEmail.as_view('change_email'))
-register_view(user, routes=['/settings/general'], view_func=UserSettings.as_view('settings'))
-register_view(
-    user, routes=['/settings/password'], view_func=ChangePassword.as_view('change_password')
-)
-register_view(
-    user,
-    routes=["/settings/user-details"],
-    view_func=ChangeUserDetails.as_view('change_user_details')
-)
-register_view(user, routes=['/<username>/posts'], view_func=AllUserPosts.as_view('view_all_posts'))
-register_view(
-    user, routes=['/<username>/topics'], view_func=AllUserTopics.as_view('view_all_topics')
-)
-register_view(user, routes=['/<username>'], view_func=UserProfile.as_view('profile'))
+@impl
+def flaskbb_load_blueprints(app):
+    user = Blueprint("user", __name__)
+    register_view(
+        user,
+        routes=['/settings/email'],
+        view_func=ChangeEmail.as_view('change_email')
+    )
+    register_view(
+        user,
+        routes=['/settings/general'],
+        view_func=UserSettings.as_view('settings')
+    )
+    register_view(
+        user,
+        routes=['/settings/password'],
+        view_func=ChangePassword.as_view('change_password')
+    )
+    register_view(
+        user,
+        routes=["/settings/user-details"],
+        view_func=ChangeUserDetails.as_view('change_user_details')
+    )
+    register_view(
+        user,
+        routes=['/<username>/posts'],
+        view_func=AllUserPosts.as_view('view_all_posts')
+    )
+    register_view(
+        user,
+        routes=['/<username>/topics'],
+        view_func=AllUserTopics.as_view('view_all_topics')
+    )
+
+    register_view(
+        user, routes=['/<username>'], view_func=UserProfile.as_view('profile')
+    )
+
+    app.register_blueprint(user, url_prefix=app.config["USER_URL_PREFIX"])