Bug 22053: ability to enable/disable some plugins
authorAlex Arnaud <alex.arnaud@biblibre.com>
Fri, 28 Dec 2018 16:50:14 +0000 (17:50 +0100)
committerNick Clemens <nick@bywatersolutions.com>
Thu, 9 May 2019 18:54:44 +0000 (18:54 +0000)
Test plan:

  - apply this patch(es),
  - launch an updatedabase,
  - go to plugins/plugins-home.pl
    and deal with enable/disable method
  - install a plugin like KitchenSink
    https://github.com/bywatersolutions/koha-plugin-kitchen-sink
  - once installed, the plugin change the background color
    of the staff client to orange.
  - disable the plugin,
  - background color should be set back to the original one

Rebased-on: 2019-03-25 Alex Arnaud <alex.arnaud@biblibre.com>

Signed-off-by: Claire Gravely <claire.gravely@bsz-bw.de>
Signed-off-by: Agustin Moyano <agustinmoyano@theke.io>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Koha/Plugins.pm
Koha/Plugins/Base.pm
koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss
koha-tmpl/intranet-tmpl/prog/en/modules/plugins/plugins-home.tt
plugins/plugins-enable.pl [new file with mode: 0755]
plugins/plugins-home.pl

index c0aaa9c..be6bf33 100644 (file)
@@ -79,6 +79,16 @@ sub GetPlugins {
 
             my $plugin = $plugin_class->new({ enable_plugins => $self->{'enable_plugins'} });
 
+            my $plugin_enabled = $plugin->retrieve_data('__ENABLED__');
+            $plugin->{enabled} = $plugin_enabled;
+
+            # Want all plugins. Not only enabled ones.
+            if ( defined($params->{all}) && $params->{all} ) {
+                $plugin_enabled = 1;
+            }
+
+            next unless $plugin_enabled;
+
             # Limit results by method or metadata
             next if $method && !$plugin->can($method);
             my $plugin_metadata = $plugin->get_metadata;
index 2cebe63..20d8b79 100644 (file)
@@ -50,7 +50,7 @@ sub new {
     ## Run the installation method if it exists and hasn't been run before
     if ( $self->can('install') && !$self->retrieve_data('__INSTALLED__') ) {
         if ( $self->install() ) {
-            $self->store_data( { '__INSTALLED__' => 1 } );
+            $self->store_data( { '__INSTALLED__' => 1, '__ENABLED__' => 1 } );
             if ( my $version = $plugin_version ) {
                 $self->store_data({ '__INSTALLED_VERSION__' => $version });
             }
@@ -272,6 +272,36 @@ sub _version_compare {
     return 0;
 }
 
+=head2 enable
+
+Method for enabling plugin
+
+$plugin->enable
+
+=cut
+
+sub enable {
+    my ($self) = @_;
+
+    $self->store_data( {'__ENABLED__' => 1}  );
+
+    return $self;
+}
+
+=head2 disable
+
+Method for disabling plugin
+
+$plugin->disable
+
+=cut
+
+sub disable {
+    my ($self) = @_;
+
+    $self->store_data( {'__ENABLED__' => 0}  );
+}
+
 1;
 __END__
 
index 1dd3c6c..0ac6b70 100644 (file)
@@ -524,7 +524,7 @@ input {
 }
 
 label,
-.label {
+.label:not(.label-primary):not(.label-default) {
     color: #000;
     display: inline;
     font-size: inherit;
index 7d5d89c..2c2d556 100644 (file)
 
                             [% FOREACH plugin IN plugins %]
                                 <tr>
-                                    <td><strong>[% plugin.metadata.name | html %]</strong></td>
+                                    <td>
+                                        [% IF ( plugin.enabled ) %]
+                                            <span class="label label-primary">ENABLED</span>
+                                        [% ELSE %]
+                                            <span class="label label-default">DISABLED</span>
+                                        [% END %]
+                                        <strong>[% plugin.metadata.name | html %]</strong>
+                                    </td>
                                     <td>
                                         [% plugin.metadata.description | html %]
 
                                                     [% END %]
                                                     [% IF ( CAN_user_plugins_manage ) %]
                                                             <li><a class="uninstall_plugin" data-plugin-name="[% plugin.metadata.name | html %]" href="/cgi-bin/koha/plugins/plugins-uninstall.pl?class=[% plugin.class | html %]"><i class="fa fa-trash"></i> Uninstall</a></li>
+                                                        [% IF ( plugin.enabled ) %]
+                                                                <li><a class="enable_plugin" data-plugin-name="[% plugin.metadata.name | html %]" href="/cgi-bin/koha/plugins/plugins-enable.pl?class=[% plugin.class | html %]&method=disable"><i class="fa fa-pause"></i> Disable</a></li>
+                                                        [% ELSE %]
+                                                                <li><a class="enable_plugin" data-plugin-name="[% plugin.metadata.name | html %]" href="/cgi-bin/koha/plugins/plugins-enable.pl?class=[% plugin.class | html %]&method=enable"><i class="fa fa-play"></i> Enable</a></li>
+                                                        [% END %]
                                                     [% END %]
                                                 </ul>
                                             </div>
diff --git a/plugins/plugins-enable.pl b/plugins/plugins-enable.pl
new file mode 100755 (executable)
index 0000000..30d1e3e
--- /dev/null
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use CGI qw ( -utf8 );
+
+use C4::Context;
+use C4::Auth qw(check_cookie_auth);
+use Koha::Plugins::Handler;
+
+die("Koha plugins are disabled!")
+  unless C4::Context->preference('UseKohaPlugins');
+
+my $input = new CGI;
+
+my ( $auth_status, $sessionID ) =
+  check_cookie_auth( $input->cookie('CGISESSID'), { plugins => 'manage' } );
+
+my $class = $input->param('class');
+my $method = $input->param('method');
+
+Koha::Plugins::Handler->run({
+    class => $class,
+    method => $method
+});
+
+print $input->redirect("/cgi-bin/koha/plugins/plugins-home.pl");
index a7d4ce0..1136a2c 100755 (executable)
@@ -51,6 +51,7 @@ if ($plugins_enabled) {
 
     my @plugins = Koha::Plugins->new()->GetPlugins({
         method => $method,
+        all    => 1,
     });
 
     $template->param( plugins => \@plugins, );