@@ -33,50 +33,22 @@ namespace :crm do
end

namespace :settings do
desc "Load default application settings"
task :load => :environment do
plugin = ENV["PLUGIN"]
yaml = File.join(Rails.root, (plugin ? "/vendor/plugins/#{plugin}" : "") + "/config/settings.yml")

puts "== Loading settings#{plugin ? (' from ' << plugin) : ''}..."
desc "Clear settings from database (reset to default)"
task :clear => :environment do
puts "== Clearing settings table..."

begin
settings = YAML.load_file(yaml)
rescue
puts "Couldn't load #{yaml} configuration file."
exit
end

# Truncate settings table if loading Fat Free CRM settings.
# Truncate settings table
ActiveRecord::Base.establish_connection(Rails.env)
unless plugin
if ActiveRecord::Base.connection.adapter_name.downcase == "sqlite"
ActiveRecord::Base.connection.execute("DELETE FROM settings")
else # mysql and postgres
ActiveRecord::Base.connection.execute("TRUNCATE settings")
end
end

settings.keys.each do |key|
if plugin # Delete existing plugin setting if any (since we haven't truncated the whole table).
sql = [ "DELETE FROM settings WHERE name = ?", key.to_s ]
Rake::Task.sanitize_and_execute(sql)
end
sql = [ "INSERT INTO settings (name, default_value, created_at, updated_at) VALUES(?, ?, ?, ?)", key.to_s, Base64.encode64(Marshal.dump(settings[key])), Time.now, Time.now ]
Rake::Task.sanitize_and_execute(sql)
end

# Change default access on models, as specified in settings.yml
%w(leads opportunities contacts campaigns accounts).each do |table|
ActiveRecord::Migration.change_column_default(table, 'access', settings[:default_access])
if ActiveRecord::Base.connection.adapter_name.downcase == "sqlite"
ActiveRecord::Base.connection.execute("DELETE FROM settings")
else # mysql and postgres
ActiveRecord::Base.connection.execute("TRUNCATE settings")
end
# Re-dump the schema in case default access has changed (Critical for RSpec)
Rake::Task["db:schema:dump"].invoke

puts "===== Settings have been loaded."
puts "===== Settings table has been cleared."
end

desc "Show current application settings"
desc "Show current settings in the database"
task :show => :environment do
ActiveRecord::Base.establish_connection(Rails.env)
names = ActiveRecord::Base.connection.select_values("SELECT name FROM settings ORDER BY name")
@@ -18,14 +18,17 @@
Setting.create!(:name => "name", :value => "value", :default_value => nil)
end

it "should find existing setting by its name using [] or method notations" do
it "should find existing setting by its name using [] or method notations, and cache settings" do
@setting = Factory(:setting, :name => "thingymabob", :value => Base64.encode64(Marshal.dump("magoody")))
Setting.cache.has_key?("thingymabob").should == false
Setting[:thingymabob].should == "magoody"
Setting.cache.has_key?("thingymabob").should == true
Setting.thingymabob.should == "magoody"
end

it "should use :default_value if the value is missing" do
@setting = Factory(:setting, :name => "magoody", :value => nil, :default_value => Base64.encode64(Marshal.dump("thingymabob")))
it "should use value from YAML if setting is missing from database" do
@setting = Factory(:setting, :name => "magoody", :value => nil)
Setting.yaml_settings.merge!(:magoody => "thingymabob")
Setting[:magoody].should == "thingymabob"
Setting.magoody.should == "thingymabob"
end
@@ -45,6 +48,5 @@
Setting[:hello].should == false
Setting.hello.should == false
end

end