annotate app/models/enumeration.rb @ 8:0c83d98252d9 yuya

* Add custom repo prefix and proper auth realm, remove auth cache (seems like an unwise feature), pass DB handle around, various other bits of tidying
author Chris Cannam
date Thu, 12 Aug 2010 15:31:37 +0100
parents 513646585e45
children 0c939c159af4
rev   line source
Chris@0 1 # redMine - project management software
Chris@0 2 # Copyright (C) 2006 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@0 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@0 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
Chris@0 18 class Enumeration < ActiveRecord::Base
Chris@0 19 default_scope :order => "#{Enumeration.table_name}.position ASC"
Chris@0 20
Chris@0 21 belongs_to :project
Chris@0 22
Chris@0 23 acts_as_list :scope => 'type = \'#{type}\''
Chris@0 24 acts_as_customizable
Chris@0 25 acts_as_tree :order => 'position ASC'
Chris@0 26
Chris@0 27 before_destroy :check_integrity
Chris@0 28
Chris@0 29 validates_presence_of :name
Chris@0 30 validates_uniqueness_of :name, :scope => [:type, :project_id]
Chris@0 31 validates_length_of :name, :maximum => 30
Chris@0 32
Chris@0 33 named_scope :shared, :conditions => { :project_id => nil }
Chris@0 34 named_scope :active, :conditions => { :active => true }
Chris@0 35
Chris@0 36 def self.default
Chris@0 37 # Creates a fake default scope so Enumeration.default will check
Chris@0 38 # it's type. STI subclasses will automatically add their own
Chris@0 39 # types to the finder.
Chris@0 40 if self.descends_from_active_record?
Chris@0 41 find(:first, :conditions => { :is_default => true, :type => 'Enumeration' })
Chris@0 42 else
Chris@0 43 # STI classes are
Chris@0 44 find(:first, :conditions => { :is_default => true })
Chris@0 45 end
Chris@0 46 end
Chris@0 47
Chris@0 48 # Overloaded on concrete classes
Chris@0 49 def option_name
Chris@0 50 nil
Chris@0 51 end
Chris@0 52
Chris@0 53 def before_save
Chris@0 54 if is_default? && is_default_changed?
Chris@0 55 Enumeration.update_all("is_default = #{connection.quoted_false}", {:type => type})
Chris@0 56 end
Chris@0 57 end
Chris@0 58
Chris@0 59 # Overloaded on concrete classes
Chris@0 60 def objects_count
Chris@0 61 0
Chris@0 62 end
Chris@0 63
Chris@0 64 def in_use?
Chris@0 65 self.objects_count != 0
Chris@0 66 end
Chris@0 67
Chris@0 68 # Is this enumeration overiding a system level enumeration?
Chris@0 69 def is_override?
Chris@0 70 !self.parent.nil?
Chris@0 71 end
Chris@0 72
Chris@0 73 alias :destroy_without_reassign :destroy
Chris@0 74
Chris@0 75 # Destroy the enumeration
Chris@0 76 # If a enumeration is specified, objects are reassigned
Chris@0 77 def destroy(reassign_to = nil)
Chris@0 78 if reassign_to && reassign_to.is_a?(Enumeration)
Chris@0 79 self.transfer_relations(reassign_to)
Chris@0 80 end
Chris@0 81 destroy_without_reassign
Chris@0 82 end
Chris@0 83
Chris@0 84 def <=>(enumeration)
Chris@0 85 position <=> enumeration.position
Chris@0 86 end
Chris@0 87
Chris@0 88 def to_s; name end
Chris@0 89
Chris@0 90 # Returns the Subclasses of Enumeration. Each Subclass needs to be
Chris@0 91 # required in development mode.
Chris@0 92 #
Chris@0 93 # Note: subclasses is protected in ActiveRecord
Chris@0 94 def self.get_subclasses
Chris@0 95 @@subclasses[Enumeration]
Chris@0 96 end
Chris@0 97
Chris@0 98 # Does the +new+ Hash override the previous Enumeration?
Chris@0 99 def self.overridding_change?(new, previous)
Chris@0 100 if (same_active_state?(new['active'], previous.active)) && same_custom_values?(new,previous)
Chris@0 101 return false
Chris@0 102 else
Chris@0 103 return true
Chris@0 104 end
Chris@0 105 end
Chris@0 106
Chris@0 107 # Does the +new+ Hash have the same custom values as the previous Enumeration?
Chris@0 108 def self.same_custom_values?(new, previous)
Chris@0 109 previous.custom_field_values.each do |custom_value|
Chris@0 110 if custom_value.value != new["custom_field_values"][custom_value.custom_field_id.to_s]
Chris@0 111 return false
Chris@0 112 end
Chris@0 113 end
Chris@0 114
Chris@0 115 return true
Chris@0 116 end
Chris@0 117
Chris@0 118 # Are the new and previous fields equal?
Chris@0 119 def self.same_active_state?(new, previous)
Chris@0 120 new = (new == "1" ? true : false)
Chris@0 121 return new == previous
Chris@0 122 end
Chris@0 123
Chris@0 124 private
Chris@0 125 def check_integrity
Chris@0 126 raise "Can't delete enumeration" if self.in_use?
Chris@0 127 end
Chris@0 128
Chris@0 129 end
Chris@0 130
Chris@0 131 # Force load the subclasses in development mode
Chris@0 132 require_dependency 'time_entry_activity'
Chris@0 133 require_dependency 'document_category'
Chris@0 134 require_dependency 'issue_priority'