File: app/models/setting.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: Setting#18
inherits from
  Base ( ActiveRecord )
has properties
constant: DATE_FORMATS #20
constant: TIME_FORMATS #32
constant: ENCODINGS #37
method: value #92
method: value= / 1 #100
class method: [] / 1 #106
class method: []= / 2 #111
class method: per_page_options_array #140
class method: openid? #144
class method: check_cache #151
class method: clear_cache #159
class method: find_or_default / 1 #168

Class Hierarchy

Object ( Builtin-Module )
Base ( ActiveRecord )
  Setting    #18

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2011  Jean-Philippe Lang
   3  #
   4  # This program is free software; you can redistribute it and/or
   5  # modify it under the terms of the GNU General Public License
   6  # as published by the Free Software Foundation; either version 2
   7  # of the License, or (at your option) any later version.
   8  #
   9  # This program is distributed in the hope that it will be useful,
  10  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  # GNU General Public License for more details.
  13  #
  14  # You should have received a copy of the GNU General Public License
  15  # along with this program; if not, write to the Free Software
  16  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 
  18  class Setting < ActiveRecord::Base
  19 
  20    DATE_FORMATS = [
  21          '%Y-%m-%d',
  22          '%d/%m/%Y',
  23          '%d.%m.%Y',
  24          '%d-%m-%Y',
  25          '%m/%d/%Y',
  26          '%d %b %Y',
  27          '%d %B %Y',
  28          '%b %d, %Y',
  29          '%B %d, %Y'
  30      ]
  31 
  32    TIME_FORMATS = [
  33      '%H:%M',
  34      '%I:%M %p'
  35      ]
  36 
  37    ENCODINGS = %w(US-ASCII
  38                    windows-1250
  39                    windows-1251
  40                    windows-1252
  41                    windows-1253
  42                    windows-1254
  43                    windows-1255
  44                    windows-1256
  45                    windows-1257
  46                    windows-1258
  47                    windows-31j
  48                    ISO-2022-JP
  49                    ISO-2022-KR
  50                    ISO-8859-1
  51                    ISO-8859-2
  52                    ISO-8859-3
  53                    ISO-8859-4
  54                    ISO-8859-5
  55                    ISO-8859-6
  56                    ISO-8859-7
  57                    ISO-8859-8
  58                    ISO-8859-9
  59                    ISO-8859-13
  60                    ISO-8859-15
  61                    KOI8-R
  62                    UTF-8
  63                    UTF-16
  64                    UTF-16BE
  65                    UTF-16LE
  66                    EUC-JP
  67                    Shift_JIS
  68                    CP932
  69                    GB18030
  70                    GBK
  71                    ISCII91
  72                    EUC-KR
  73                    Big5
  74                    Big5-HKSCS
  75                    TIS-620)
  76 
  77    cattr_accessor :available_settings
  78    @@available_settings = YAML::load(File.open("#{Rails.root}/config/settings.yml"))
  79    Redmine::Plugin.all.each do |plugin|
  80      next unless plugin.settings
  81      @@available_settings["plugin_#{plugin.id}"] = {'default' => plugin.settings[:default], 'serialized' => true}
  82    end
  83 
  84    validates_uniqueness_of :name
  85    validates_inclusion_of :name, :in => @@available_settings.keys
  86    validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting| @@available_settings[setting.name]['format'] == 'int' }
  87 
  88    # Hash used to cache setting values
  89    @cached_settings = {}
  90    @cached_cleared_on = Time.now
  91 
  92    def value
  93      v = read_attribute(:value)
  94      # Unserialize serialized settings
  95      v = YAML::load(v) if @@available_settings[name]['serialized'] && v.is_a?(String)
  96      v = v.to_sym if @@available_settings[name]['format'] == 'symbol' && !v.blank?
  97      v
  98    end
  99 
 100    def value=(v)
 101      v = v.to_yaml if v && @@available_settings[name] && @@available_settings[name]['serialized']
 102      write_attribute(:value, v.to_s)
 103    end
 104 
 105    # Returns the value of the setting named name
 106    def self.[](name)
 107      v = @cached_settings[name]
 108      v ? v : (@cached_settings[name] = find_or_default(name).value)
 109    end
 110 
 111    def self.[]=(name, v)
 112      setting = find_or_default(name)
 113      setting.value = (v ? v : "")
 114      @cached_settings[name] = nil
 115      setting.save
 116      setting.value
 117    end
 118 
 119    # Defines getter and setter for each setting
 120    # Then setting values can be read using: Setting.some_setting_name
 121    # or set using Setting.some_setting_name = "some value"
 122    @@available_settings.each do |name, params|
 123      src = <<-END_SRC
 124      def self.#{name}
 125        self[:#{name}]
 126      end
 127 
 128      def self.#{name}?
 129        self[:#{name}].to_i > 0
 130      end
 131 
 132      def self.#{name}=(value)
 133        self[:#{name}] = value
 134      end
 135      END_SRC
 136      class_eval src, __FILE__, __LINE__
 137    end
 138 
 139    # Helper that returns an array based on per_page_options setting
 140    def self.per_page_options_array
 141      per_page_options.split(%r{[\s,]}).collect(&:to_i).select {|n| n > 0}.sort
 142    end
 143 
 144    def self.openid?
 145      Object.const_defined?(:OpenID) && self[:openid].to_i > 0
 146    end
 147 
 148    # Checks if settings have changed since the values were read
 149    # and clears the cache hash if it's the case
 150    # Called once per request
 151    def self.check_cache
 152      settings_updated_on = Setting.maximum(:updated_on)
 153      if settings_updated_on && @cached_cleared_on <= settings_updated_on
 154        clear_cache
 155      end
 156    end
 157    
 158    # Clears the settings cache
 159    def self.clear_cache
 160      @cached_settings.clear
 161      @cached_cleared_on = Time.now
 162      logger.info "Settings cache cleared." if logger
 163    end
 164 
 165  private
 166    # Returns the Setting instance for the setting named name
 167    # (record found in database or new record with default value)
 168    def self.find_or_default(name)
 169      name = name.to_s
 170      raise "There's no setting named #{name}" unless @@available_settings.has_key?(name)
 171      setting = find_by_name(name)
 172      unless setting
 173        setting = new(:name => name)
 174        setting.value = @@available_settings[name]['default']
 175      end
 176      setting
 177    end
 178  end