Module: Redmine::Acts::Customizable::InstanceMethods

Defined in:
lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



42
43
44
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 42

def self.included(base)
  base.extend ClassMethods
end

Instance Method Details

#available_custom_fieldsObject



46
47
48
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 46

def available_custom_fields
  CustomField.where("type = '#{self.class.name}CustomField'").sorted.to_a
end

#custom_field_value(c) ⇒ Object



111
112
113
114
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 111

def custom_field_value(c)
  field_id = (c.is_a?(CustomField) ? c.id : c.to_i)
  custom_field_values.detect {|v| v.custom_field_id == field_id }.try(:value)
end

#custom_field_valuesObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 77

def custom_field_values
  @custom_field_values ||= available_custom_fields.collect do |field|
    x = CustomFieldValue.new
    x.custom_field = field
    x.customized = self
    if field.multiple?
      values = custom_values.select { |v| v.custom_field == field }
      if values.empty?
        values << custom_values.build(:customized => self, :custom_field => field)
      end
      x.instance_variable_set("@value", values.map(&:value))
    else
      cv = custom_values.detect { |v| v.custom_field == field }
      cv ||= custom_values.build(:customized => self, :custom_field => field)
      x.instance_variable_set("@value", cv.value)
    end
    x.value_was = x.value.dup if x.value
    x
  end
end

#custom_field_values=(values) ⇒ Object

Sets the values of the object's custom fields values is a hash like => 'foo', 2 => 'bar'



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 65

def custom_field_values=(values)
  values = values.stringify_keys

  custom_field_values.each do |custom_field_value|
    key = custom_field_value.custom_field_id.to_s
    if values.has_key?(key)
      custom_field_value.value = values[key]
    end
  end
  @custom_field_values_changed = true
end

#custom_field_values_changed?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 102

def custom_field_values_changed?
  @custom_field_values_changed == true
end

#custom_fields=(values) ⇒ Object

Sets the values of the object's custom fields values is an array like [=> 1, 'value' => 'foo', => 2, 'value' => 'bar']



52
53
54
55
56
57
58
59
60
61
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 52

def custom_fields=(values)
  values_to_hash = values.inject({}) do |hash, v|
    v = v.stringify_keys
    if v['id'] && v.has_key?('value')
      hash[v['id']] = v['value']
    end
    hash
  end
  self.custom_field_values = values_to_hash
end

#custom_value_for(c) ⇒ Object



106
107
108
109
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 106

def custom_value_for(c)
  field_id = (c.is_a?(CustomField) ? c.id : c.to_i)
  custom_values.detect {|v| v.custom_field_id == field_id }
end

#reassign_custom_field_valuesObject



144
145
146
147
148
149
150
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 144

def reassign_custom_field_values
  if @custom_field_values
    values = @custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h}
    @custom_field_values = nil
    self.custom_field_values = values
  end
end

#reload(*args) ⇒ Object



157
158
159
160
161
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 157

def reload(*args)
  @custom_field_values = nil
  @custom_field_values_changed = false
  super
end

#reset_custom_values!Object



152
153
154
155
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 152

def reset_custom_values!
  @custom_field_values = nil
  @custom_field_values_changed = true
end

#save_custom_field_valuesObject



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 122

def save_custom_field_values
  target_custom_values = []
  custom_field_values.each do |custom_field_value|
    if custom_field_value.value.is_a?(Array)
      custom_field_value.value.each do |v|
        target = custom_values.detect {|cv| cv.custom_field == custom_field_value.custom_field && cv.value == v}
        target ||= custom_values.build(:customized => self, :custom_field => custom_field_value.custom_field, :value => v)
        target_custom_values << target
      end
    else
      target = custom_values.detect {|cv| cv.custom_field == custom_field_value.custom_field}
      target ||= custom_values.build(:customized => self, :custom_field => custom_field_value.custom_field)
      target.value = custom_field_value.value
      target_custom_values << target
    end
  end
  self.custom_values = target_custom_values
  custom_values.each(&:save)
  @custom_field_values_changed = false
  true
end

#validate_custom_field_valuesObject



116
117
118
119
120
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 116

def validate_custom_field_values
  if new_record? || custom_field_values_changed?
    custom_field_values.each(&:validate_value)
  end
end

#visible_custom_field_valuesObject



98
99
100
# File 'lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb', line 98

def visible_custom_field_values
  custom_field_values.select(&:visible?)
end