Project

General

Profile

Defect #44610 » 0001-Keep-values-of-spent-time-custom-fields-not-visible-.patch

Go MAEDA, 2026-10-16 11:43

View differences:

app/models/time_entry.rb
126 126

  
127 127
  def safe_attributes=(attrs, user=User.current)
128 128
    if attrs
129
      previous_custom_field_values = custom_field_values.map(&:dup)
129 130
      attrs = super(attrs)
130 131
      if issue_id_changed? && issue
131 132
        if issue.visible?(user) && user.allowed_to?(:log_time, issue.project)
......
150 151
        @invalid_user_id = nil
151 152
      end
152 153

  
153
      # Delete assigned custom fields not visible by the user
154
      editable_custom_field_ids = editable_custom_field_values(user).map {|v| v.custom_field_id.to_s}
155
      self.custom_field_values.delete_if do |c|
156
        !editable_custom_field_ids.include?(c.custom_field.id.to_s)
154
      # Restore custom field values not visible by the user
155
      editable_custom_field_ids = editable_custom_field_values(user).map(&:custom_field_id)
156
      custom_field_values.map!.with_index do |custom_field_value, i|
157
        if editable_custom_field_ids.include?(custom_field_value.custom_field_id)
158
          custom_field_value
159
        else
160
          previous_custom_field_values[i]
161
        end
157 162
      end
158 163
    end
159 164

  
test/unit/time_entry_custom_field_test.rb
70 70
    assert_equal 'valuea', time_entry.custom_field_value(cf1)
71 71
    assert_nil time_entry.custom_field_value(cf2)
72 72
  end
73

  
74
  def test_safe_attributes_should_keep_values_of_custom_fields_not_visible_to_user
75
    field = TimeEntryCustomField.create!(:name => 'Non visible field',
76
                                         :field_format => 'string',
77
                                         :visible => false, :role_ids => [1])
78
    time_entry = TimeEntry.generate!(:project_id => 1, :user_id => 3, :author_id => 3)
79
    time_entry.custom_field_values = {field.id.to_s => 'Foo'}
80
    time_entry.save!
81

  
82
    time_entry.send :safe_attributes=, {
83
      'comments' => 'Updated',
84
      'custom_field_values' => {field.id.to_s => 'Bar'}
85
    }, User.find(3)
86
    time_entry.save!
87

  
88
    assert_equal 'Foo', time_entry.reload.custom_field_value(field)
89
  end
73 90
end
(2-2/2)