Browse Source

Use PluginRegistry to get all the needed info for a plugin

Peter Justin 7 years ago
parent
commit
2ea0f92091
3 changed files with 45 additions and 18 deletions
  1. 4 5
      flaskbb/management/views.py
  2. 18 0
      flaskbb/plugins/models.py
  3. 23 13
      flaskbb/templates/management/plugins.html

+ 4 - 5
flaskbb/management/views.py

@@ -29,9 +29,9 @@ from flaskbb.management.forms import (AddForumForm, AddGroupForm, AddUserForm,
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.plugins.models import PluginRegistry, PluginStore
 from flaskbb.plugins.models import PluginRegistry, PluginStore
 from flaskbb.user.models import Group, Guest, User
 from flaskbb.user.models import Group, Guest, User
+from flaskbb.plugins.utils import validate_plugin
 from flaskbb.utils.helpers import (get_online_users, register_view,
 from flaskbb.utils.helpers import (get_online_users, register_view,
-                                   render_template, time_diff, time_utcnow,
-                                   validate_plugin)
+                                   render_template, time_diff, time_utcnow)
 from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin,
 from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin,
                                         IsAtleastModerator,
                                         IsAtleastModerator,
                                         IsAtleastSuperModerator)
                                         IsAtleastSuperModerator)
@@ -840,8 +840,7 @@ class PluginsView(MethodView):
     decorators = [allows.requires(IsAdmin)]
     decorators = [allows.requires(IsAdmin)]
 
 
     def get(self):
     def get(self):
-        plugins = current_app.pluggy.list_plugin_metadata()
-        print(plugins)
+        plugins = PluginRegistry.query.all()
         return render_template("management/plugins.html", plugins=plugins)
         return render_template("management/plugins.html", plugins=plugins)
 
 
 
 
@@ -880,6 +879,7 @@ class DisablePlugin(MethodView):
         plugin.save()
         plugin.save()
         flash(_("Plugin %(plugin)s disabled. Please restart FlaskBB now.",
         flash(_("Plugin %(plugin)s disabled. Please restart FlaskBB now.",
                 plugin=plugin.name), "success")
                 plugin=plugin.name), "success")
+        return redirect(url_for("management.plugins"))
 
 
 
 
 class UninstallPlugin(MethodView):
 class UninstallPlugin(MethodView):
@@ -892,7 +892,6 @@ class UninstallPlugin(MethodView):
         plugin.delete()
         plugin.delete()
         flash(_("Plugin has been uninstalled."), "success")
         flash(_("Plugin has been uninstalled."), "success")
         return redirect(url_for("management.plugins"))
         return redirect(url_for("management.plugins"))
-        return redirect(url_for("management.plugins"))
 
 
 
 
 class InstallPlugin(MethodView):
 class InstallPlugin(MethodView):

+ 18 - 0
flaskbb/plugins/models.py

@@ -9,6 +9,7 @@
     :copyright: (c) 2017 by the FlaskBB Team.
     :copyright: (c) 2017 by the FlaskBB Team.
     :license: BSD, see LICENSE for more details.
     :license: BSD, see LICENSE for more details.
 """
 """
+from flask import current_app
 from sqlalchemy import UniqueConstraint
 from sqlalchemy import UniqueConstraint
 from sqlalchemy.orm.collections import attribute_mapped_collection
 from sqlalchemy.orm.collections import attribute_mapped_collection
 
 
@@ -58,6 +59,23 @@ class PluginRegistry(CRUDMixin, db.Model):
     def settings(self):
     def settings(self):
         return {kv.key: kv.value for kv in itervalues(self.values)}
         return {kv.key: kv.value for kv in itervalues(self.values)}
 
 
+    @property
+    def info(self):
+        return current_app.pluggy.list_plugin_metadata().get(self.name, {})
+
+    @property
+    def is_installable(self):
+        """Returns True if the plugin has settings that can be installed."""
+        plugin_module = current_app.pluggy.get_plugin(self.name)
+        return True if plugin_module.SETTINGS else False
+
+    @property
+    def is_installed(self):
+        """Returns True if the plugin is installed."""
+        if self.settings:
+            return True
+        return False
+
     def get_settings_form(self):
     def get_settings_form(self):
         """Generates a settings form based on the settings."""
         """Generates a settings form based on the settings."""
         return generate_settings_form(self.values.values())()
         return generate_settings_form(self.values.values())()

+ 23 - 13
flaskbb/templates/management/plugins.html

@@ -27,40 +27,50 @@
                         <div class="col-md-4 col-sm-4 col-xs-4 meta-item">{% trans %}Manage{% endtrans %}</div>
                         <div class="col-md-4 col-sm-4 col-xs-4 meta-item">{% trans %}Manage{% endtrans %}</div>
                     </div>
                     </div>
                 </div>
                 </div>
-                {% for plugin_name, plugin_info in plugins.items() %}
+                {% for plugin in plugins %}
                 <div class="row settings-row hover with-border-bottom">
                 <div class="row settings-row hover with-border-bottom">
                     <div class="col-md-4 col-sm-4 col-xs-4">
                     <div class="col-md-4 col-sm-4 col-xs-4">
-                    {% if plugin_info.get('home_page') %}
-                      <a href="{{ plugin_info.get('home_page') }}">{{ plugin_name.title() }}</a>
+                    {% if plugin.info.get('home_page') %}
+                      <a href="{{ plugin.info.get('home_page') }}">{{ plugin.name.title() }}</a>
                     {% else %}
                     {% else %}
-                      {{ plugin_name.title() }}
+                      {{ plugin.name.title() }}
                     {% endif %}
                     {% endif %}
                     </div>
                     </div>
                     <div class="col-md-4 col-sm-4 col-xs-4">
                     <div class="col-md-4 col-sm-4 col-xs-4">
-                        <div class="plugin-version">{% trans %}Version{% endtrans %}: {{ plugin_info.get('version') }}</div>
-                        <div class="plugin-description">{{ plugin_info.get('summary') }}</div>
-                        <div class="plugin-author">{% trans %}by{% endtrans %} {{ plugin_info.get('author') }}</div>
+                        {% if plugin.enabled %}
+                        <div class="plugin-version">{% trans %}Version{% endtrans %}: {{ plugin.info.get('version') }}</div>
+                        <div class="plugin-description">{{ plugin.info.get('summary') }}</div>
+                        <div class="plugin-author">{% trans %}by{% endtrans %} {{ plugin.info.get('author') }}</div>
+                        {% else %}
+                        <div class="plugin-description"><em>Disabled</em></div>
+                        {% endif %}
                     </div>
                     </div>
                     <div class="col-md-4 col-sm-4 col-xs-4">
                     <div class="col-md-4 col-sm-4 col-xs-4">
-                        <form class="inline-form" method="post" action="{{ url_for('management.enable_plugin', name=plugin_name) }}">
+                        {% if not plugin.enabled %}
+                        <form class="inline-form" method="post" action="{{ url_for('management.enable_plugin', name=plugin.name) }}">
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <button class="btn btn-success">{% trans %}Enable{% endtrans %}</button>
                             <button class="btn btn-success">{% trans %}Enable{% endtrans %}</button>
                         </form>
                         </form>
-                        <form class="inline-form" method="post" action="{{ url_for('management.disable_plugin', name=plugin_name) }}">
+                        {% else %}
+                        <form class="inline-form" method="post" action="{{ url_for('management.disable_plugin', name=plugin.name) }}">
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <button class="btn btn-warning">{% trans %}Disable{% endtrans %}</button>
                             <button class="btn btn-warning">{% trans %}Disable{% endtrans %}</button>
                         </form>
                         </form>
+                        {% endif %}
 
 
-                        <form class="inline-form" method="post" action="{{ url_for('management.install_plugin', name=plugin_name) }}">
+                        {% if plugin.is_installable and not plugin.is_installed %}
+                        <form class="inline-form" method="post" action="{{ url_for('management.install_plugin', name=plugin.name) }}">
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <button class="btn btn-info">{% trans %}Install{% endtrans %}</button>
                             <button class="btn btn-info">{% trans %}Install{% endtrans %}</button>
                         </form>
                         </form>
-
-                        <form class="inline-form" method="post" action="{{ url_for('management.uninstall_plugin', name=plugin_name) }}">
+                        {% elif plugin.is_installable and plugin.is_installed %}
+                        <form class="inline-form" method="post" action="{{ url_for('management.uninstall_plugin', name=plugin.name) }}">
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                             <button class="btn btn-danger">{% trans %}Uninstall{% endtrans %}</button>
                             <button class="btn btn-danger">{% trans %}Uninstall{% endtrans %}</button>
                         </form>
                         </form>
-                        <a class="btn btn-info" href="{{ url_for('management.settings', plugin=plugin_name) }}">Settings</a>
+
+                        <a class="btn btn-info" href="{{ url_for('management.settings', plugin=plugin.name) }}">Settings</a>
+                        {% endif %}
                     </div>
                     </div>
                     </div>
                     </div>
                 </div>
                 </div>