Просмотр исходного кода

Use PluginRegistry to get all the needed info for a plugin

Peter Justin 7 лет назад
Родитель
Сommit
2ea0f92091
3 измененных файлов с 45 добавлено и 18 удалено
  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.plugins.models import PluginRegistry, PluginStore
 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,
-                                   render_template, time_diff, time_utcnow,
-                                   validate_plugin)
+                                   render_template, time_diff, time_utcnow)
 from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin,
                                         IsAtleastModerator,
                                         IsAtleastSuperModerator)
@@ -840,8 +840,7 @@ class PluginsView(MethodView):
     decorators = [allows.requires(IsAdmin)]
 
     def get(self):
-        plugins = current_app.pluggy.list_plugin_metadata()
-        print(plugins)
+        plugins = PluginRegistry.query.all()
         return render_template("management/plugins.html", plugins=plugins)
 
 
@@ -880,6 +879,7 @@ class DisablePlugin(MethodView):
         plugin.save()
         flash(_("Plugin %(plugin)s disabled. Please restart FlaskBB now.",
                 plugin=plugin.name), "success")
+        return redirect(url_for("management.plugins"))
 
 
 class UninstallPlugin(MethodView):
@@ -892,7 +892,6 @@ class UninstallPlugin(MethodView):
         plugin.delete()
         flash(_("Plugin has been uninstalled."), "success")
         return redirect(url_for("management.plugins"))
-        return redirect(url_for("management.plugins"))
 
 
 class InstallPlugin(MethodView):

+ 18 - 0
flaskbb/plugins/models.py

@@ -9,6 +9,7 @@
     :copyright: (c) 2017 by the FlaskBB Team.
     :license: BSD, see LICENSE for more details.
 """
+from flask import current_app
 from sqlalchemy import UniqueConstraint
 from sqlalchemy.orm.collections import attribute_mapped_collection
 
@@ -58,6 +59,23 @@ class PluginRegistry(CRUDMixin, db.Model):
     def settings(self):
         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):
         """Generates a settings form based on the settings."""
         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>
                 </div>
-                {% for plugin_name, plugin_info in plugins.items() %}
+                {% for plugin in plugins %}
                 <div class="row settings-row hover with-border-bottom">
                     <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 %}
-                      {{ plugin_name.title() }}
+                      {{ plugin.name.title() }}
                     {% endif %}
                     </div>
                     <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 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() }}" />
                             <button class="btn btn-success">{% trans %}Enable{% endtrans %}</button>
                         </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() }}" />
                             <button class="btn btn-warning">{% trans %}Disable{% endtrans %}</button>
                         </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() }}" />
                             <button class="btn btn-info">{% trans %}Install{% endtrans %}</button>
                         </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() }}" />
                             <button class="btn btn-danger">{% trans %}Uninstall{% endtrans %}</button>
                         </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>