Commit 932e054f28dea9e4dc84dffa2b57d8e0fac5703d

Authored by Antonio Terceiro
1 parent ab8dc0f5

Add support for base plugins

Base plugins are enanbed by default and cannot be disabled at the system
level, but can be disabled per-environment at the web UI.

A part of the required changes also fix the Noosfero plugin
infrastructure, in special migrations, on Rails 3.
app/models/environment.rb
@@ -286,7 +286,7 @@ class Environment < ActiveRecord::Base @@ -286,7 +286,7 @@ class Environment < ActiveRecord::Base
286 www.youtube.com 286 www.youtube.com
287 ] + ('a' .. 'z').map{|i| "#{i}.yimg.com"} 287 ] + ('a' .. 'z').map{|i| "#{i}.yimg.com"}
288 288
289 - settings_items :enabled_plugins, :type => Array, :default => [] 289 + settings_items :enabled_plugins, :type => Array, :default => Noosfero::Plugin.available_plugin_names
290 290
291 settings_items :search_hints, :type => Hash, :default => {} 291 settings_items :search_hints, :type => Hash, :default => {}
292 292
baseplugins/README 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +Plugins in this directory are enabled by default, and cannot be disabled at the
  2 +system level. Each environment admistrator can still disable it in the web UI,
  3 +though.
baseplugins/people_block 0 → 120000
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +../plugins/people_block
0 \ No newline at end of file 2 \ No newline at end of file
config/plugins/people_block
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -../../plugins/people_block  
2 \ No newline at end of file 0 \ No newline at end of file
debian/noosfero.install
@@ -21,6 +21,7 @@ config/locales usr/share/noosfero/config @@ -21,6 +21,7 @@ config/locales usr/share/noosfero/config
21 config.ru usr/share/noosfero 21 config.ru usr/share/noosfero
22 22
23 plugins usr/share/noosfero 23 plugins usr/share/noosfero
  24 +baseplugins usr/share/noosfero
24 25
25 debian/dbinstall usr/lib/noosfero 26 debian/dbinstall usr/lib/noosfero
26 debian/dbupgrade usr/lib/noosfero 27 debian/dbupgrade usr/lib/noosfero
lib/noosfero/plugin.rb
@@ -104,7 +104,7 @@ class Noosfero::Plugin @@ -104,7 +104,7 @@ class Noosfero::Plugin
104 104
105 def available_plugins 105 def available_plugins
106 unless @available_plugins 106 unless @available_plugins
107 - path = File.join(Rails.root, 'config', 'plugins', '*') 107 + path = File.join(Rails.root, '{baseplugins,config/plugins}', '*')
108 @available_plugins = Dir.glob(path).select{ |i| File.directory?(i) } 108 @available_plugins = Dir.glob(path).select{ |i| File.directory?(i) }
109 if Rails.env.test? && !@available_plugins.include?(File.join(Rails.root, 'config', 'plugins', 'foo')) 109 if Rails.env.test? && !@available_plugins.include?(File.join(Rails.root, 'config', 'plugins', 'foo'))
110 @available_plugins << File.join(Rails.root, 'plugins', 'foo') 110 @available_plugins << File.join(Rails.root, 'plugins', 'foo')
@@ -113,6 +113,10 @@ class Noosfero::Plugin @@ -113,6 +113,10 @@ class Noosfero::Plugin
113 @available_plugins 113 @available_plugins
114 end 114 end
115 115
  116 + def available_plugin_names
  117 + available_plugins.map { |f| File.basename(f).camelize }
  118 + end
  119 +
116 def all 120 def all
117 @all ||= available_plugins.map{ |dir| (File.basename(dir) + "_plugin").camelize } 121 @all ||= available_plugins.map{ |dir| (File.basename(dir) + "_plugin").camelize }
118 end 122 end
lib/tasks/plugins.rake
1 require 'active_record' 1 require 'active_record'
2 #require_dependency 'active_record/migration' 2 #require_dependency 'active_record/migration'
3 3
4 -class ActiveRecord::Migrator  
5 - alias_method :orig_initialize, :initialize  
6 - def initialize *args  
7 - orig_initialize *args  
8 - @migrations_paths = ["db/migrate", "config/plugins/*/db/migrate"]  
9 - end  
10 -end  
11 -  
12 namespace :noosfero do 4 namespace :noosfero do
13 namespace :plugins do 5 namespace :plugins do
14 - plugin_migration_dirs = Dir.glob(Rails.root.join('config', 'plugins', '*', 'db', 'migrate')) 6 +
  7 + plugin_migration_dirs = Dir.glob(Rails.root.join('{baseplugins,config/plugins}', '*', 'db', 'migrate'))
  8 +
  9 + task :load_config do
  10 + dirs = Dir.glob("{baseplugins,config/plugins}/*/db/migrate")
  11 + dirs.each do |dir|
  12 + ActiveRecord::Migrator.migrations_paths << dir
  13 + end
  14 + end
  15 +
15 task :migrate do 16 task :migrate do
16 plugin_migration_dirs.each do |path| 17 plugin_migration_dirs.each do |path|
17 ActiveRecord::Migrator.migrate(path, ENV["VERSION"] ? 18 ActiveRecord::Migrator.migrate(path, ENV["VERSION"] ?
@@ -20,3 +21,6 @@ namespace :noosfero do @@ -20,3 +21,6 @@ namespace :noosfero do
20 end 21 end
21 end 22 end
22 end 23 end
  24 +
  25 +task 'db:migrate' => 'noosfero:plugins:load_config'
  26 +task 'db:schema:load' => 'noosfero:plugins:load_config'
lib/tasks/plugins_tests.rake
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 @all_tasks = [:units, :functionals, :integration, :cucumber, :selenium] 3 @all_tasks = [:units, :functionals, :integration, :cucumber, :selenium]
4 4
5 def enabled_plugins 5 def enabled_plugins
6 - Dir.glob('config/plugins/*').map { |f| File.basename(f) } - ['README'] 6 + Dir.glob('{baseplugins,config/plugins}/*').map { |f| File.basename(f) } - ['README']
7 end 7 end
8 8
9 @original_enabled_plugins = enabled_plugins 9 @original_enabled_plugins = enabled_plugins
@@ -51,7 +51,7 @@ def plugin_name(plugin) @@ -51,7 +51,7 @@ def plugin_name(plugin)
51 end 51 end
52 52
53 def plugin_enabled?(plugin) 53 def plugin_enabled?(plugin)
54 - File.exist?(File.join('config', 'plugins', plugin)) 54 + File.exist?(File.join('config', 'plugins', plugin)) || File.exist?(File.join('baseplugins', plugin))
55 end 55 end
56 56
57 def plugin_disabled_warning(plugin) 57 def plugin_disabled_warning(plugin)
plugins/people_block/before_disable.rb
@@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
1 -raise "\nPeopleBlockPlugin shouldn't be enabled/disabled by hand, Noosfero" +  
2 - "\ninstallation already comes with it enabled by default!\n"  
script/noosfero-plugins
@@ -14,9 +14,10 @@ fi @@ -14,9 +14,10 @@ fi
14 # data 14 # data
15 available_plugins_dir="$NOOSFERO_DIR/plugins" 15 available_plugins_dir="$NOOSFERO_DIR/plugins"
16 enabled_plugins_dir="$NOOSFERO_DIR/config/plugins" 16 enabled_plugins_dir="$NOOSFERO_DIR/config/plugins"
  17 +base_plugins_dir="$NOOSFERO_DIR/baseplugins"
17 available_plugins=$(find "$available_plugins_dir" -maxdepth 1 -mindepth 1 -type d -not -name 'template' -printf '%f\n' | sort) 18 available_plugins=$(find "$available_plugins_dir" -maxdepth 1 -mindepth 1 -type d -not -name 'template' -printf '%f\n' | sort)
18 enabled_plugins=$(find -L "$enabled_plugins_dir" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort) 19 enabled_plugins=$(find -L "$enabled_plugins_dir" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort)
19 -disabled_plugins=$(printf "%s\n" $available_plugins $enabled_plugins_dir | sort | uniq -u) 20 +base_plugins=$(find -L "$base_plugins_dir" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort)
20 21
21 # operation defaults 22 # operation defaults
22 quiet=false 23 quiet=false
@@ -32,7 +33,7 @@ _list() { @@ -32,7 +33,7 @@ _list() {
32 33
33 _status() { 34 _status() {
34 for plugin in $available_plugins; do 35 for plugin in $available_plugins; do
35 - if [ -h "$enabled_plugins_dir/$plugin" ]; then 36 + if [ -h "$enabled_plugins_dir/$plugin" -o -h "$base_plugins_dir/$plugin" ]; then
36 status="*" 37 status="*"
37 else 38 else
38 status=" " 39 status=" "
@@ -79,8 +80,9 @@ _enable(){ @@ -79,8 +80,9 @@ _enable(){
79 cd $enabled_plugins_dir 80 cd $enabled_plugins_dir
80 source="../../plugins/$plugin" 81 source="../../plugins/$plugin"
81 target="$enabled_plugins_dir/$plugin" 82 target="$enabled_plugins_dir/$plugin"
  83 + base="$base_plugins_dir/$plugin"
82 run "$source/before_enable.rb" 84 run "$source/before_enable.rb"
83 - if [ -h "$target" ]; then 85 + if [ -h "$target" -o -h "$base" ]; then
84 _say "$plugin already enabled" 86 _say "$plugin already enabled"
85 else 87 else
86 if [ ! -d "$source" ]; then 88 if [ ! -d "$source" ]; then
@@ -127,19 +129,20 @@ _disable(){ @@ -127,19 +129,20 @@ _disable(){
127 target="$enabled_plugins_dir/$plugin" 129 target="$enabled_plugins_dir/$plugin"
128 plugins_public_dir="$NOOSFERO_DIR/public/plugins" 130 plugins_public_dir="$NOOSFERO_DIR/public/plugins"
129 plugins_features_dir="$NOOSFERO_DIR/features/plugins" 131 plugins_features_dir="$NOOSFERO_DIR/features/plugins"
130 - if ! run "$source/before_disable.rb"; then  
131 - echo "W: failed to disabling $plugin"  
132 - echo 132 +
  133 + if [ -h "$base_plugins_dir/$plugin" ]; then
  134 + _say "$plugin is a base plugin and cannot be disabled"
  135 + return
  136 + fi
  137 +
  138 + if [ -h "$target" ]; then
  139 + rm "$target"
  140 + test -h "$plugins_public_dir/$plugin" && rm "$plugins_public_dir/$plugin"
  141 + test -h "$plugins_features_dir/$plugin" && rm "$plugins_features_dir/$plugin"
  142 + _say "$plugin disabled"
  143 + run "$source/after_disable.rb"
133 else 144 else
134 - if [ -h "$target" ]; then  
135 - rm "$target"  
136 - test -h "$plugins_public_dir/$plugin" && rm "$plugins_public_dir/$plugin"  
137 - test -h "$plugins_features_dir/$plugin" && rm "$plugins_features_dir/$plugin"  
138 - _say "$plugin disabled"  
139 - run "$source/after_disable.rb"  
140 - else  
141 - _say "$plugin already disabled"  
142 - fi 145 + _say "$plugin already disabled"
143 fi 146 fi
144 } 147 }
145 148