diff --git a/app/models/profile.rb b/app/models/profile.rb index b0bd67d..02b1778 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -140,6 +140,10 @@ class Profile < ActiveRecord::Base acts_as_having_settings :field => :data + def settings + data + end + settings_items :redirect_l10n, :type => :boolean, :default => false settings_items :public_content, :type => :boolean, :default => true settings_items :description diff --git a/config/initializers/plugins.rb b/config/initializers/plugins.rb index 56188fa..7c95396 100644 --- a/config/initializers/plugins.rb +++ b/config/initializers/plugins.rb @@ -3,4 +3,5 @@ require 'noosfero/plugin/hot_spot' require 'noosfero/plugin/manager' require 'noosfero/plugin/active_record' require 'noosfero/plugin/mailer_base' +require 'noosfero/plugin/settings' Noosfero::Plugin.init_system if $NOOSFERO_LOAD_PLUGINS diff --git a/lib/noosfero/plugin/settings.rb b/lib/noosfero/plugin/settings.rb new file mode 100644 index 0000000..ab6f8e7 --- /dev/null +++ b/lib/noosfero/plugin/settings.rb @@ -0,0 +1,45 @@ +class Noosfero::Plugin::Settings + + def initialize(base, plugin, attributes = nil) + @base = base + @plugin = plugin + attributes ||= {} + attributes.each do |k,v| + self.send("#{k}=", v) + end + end + + def settings + @base.settings["#{@plugin.public_name}_plugin".to_sym] ||= {} + end + + def method_missing(method, *args, &block) + if method.to_s =~ /^(.+)=$/ + set_setting($1, args.first) + elsif method.to_s =~ /^(.+)$/ + get_setting($1) + end + end + + def get_setting(name) + if settings[name.to_sym].nil? + if @plugin.respond_to?("#{name}_default_setting") + @plugin.send("#{name}_default_setting") + else + nil + end + else + settings[name.to_sym] + end + end + + def set_setting(name, value) + settings[name.to_sym] = value + end + + def save! + @base.save! + end + +end + diff --git a/test/unit/plugin_settings_test.rb b/test/unit/plugin_settings_test.rb new file mode 100644 index 0000000..e7f34a1 --- /dev/null +++ b/test/unit/plugin_settings_test.rb @@ -0,0 +1,51 @@ +require 'test_helper' + +class SolarSystemPlugin < Noosfero::Plugin + def self.secret_default_setting + 42 + end +end + +class PluginSettingsTest < ActiveSupport::TestCase + + def setup + @environment = Environment.new + @profile = Profile.new + @plugin = SolarSystemPlugin + end + + attr_accessor :environment, :profile, :plugin, :settings + + should 'store setttings on any model that offers settings' do + base = environment + settings = Noosfero::Plugin::Settings.new(base, plugin) + settings.star = 'sun' + settings.planets = 8 + assert_equal 'sun', base.settings[:solar_system_plugin][:star] + assert_equal 8, base.settings[:solar_system_plugin][:planets] + assert_equal 'sun', settings.star + assert_equal 8, settings.planets + + base = profile + settings = Noosfero::Plugin::Settings.new(base, plugin) + settings.star = 'sun' + settings.planets = 8 + assert_equal 'sun', base.settings[:solar_system_plugin][:star] + assert_equal 8, base.settings[:solar_system_plugin][:planets] + assert_equal 'sun', settings.star + assert_equal 8, settings.planets + end + + should 'save base on save' do + environment.expects(:save!) + settings = Noosfero::Plugin::Settings.new(environment, plugin) + settings.save! + end + + should 'use default value defined on the plugin class' do + settings = Noosfero::Plugin::Settings.new(profile, plugin) + assert_equal 42, settings.secret + end + +end + -- libgit2 0.21.2