Class: Tracker

Inherits:
ApplicationRecord show all
Includes:
Redmine::SafeAttributes
Defined in:
app/models/tracker.rb

Overview

Redmine - project management software Copyright © 2006- Jean-Philippe Lang

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Constant Summary collapse

CORE_FIELDS_UNDISABLABLE =
%w(project_id tracker_id subject is_private).freeze
CORE_FIELDS =

Fields that can be disabled Other (future) fields should be appended, not inserted!

%w(assigned_to_id category_id fixed_version_id parent_issue_id
start_date due_date estimated_hours done_ratio description priority_id).freeze
CORE_FIELDS_ALL =
(CORE_FIELDS_UNDISABLABLE + CORE_FIELDS).freeze

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Redmine::SafeAttributes

#delete_unsafe_attributes, included, #safe_attribute?, #safe_attribute_names, #safe_attributes=

Methods inherited from ApplicationRecord

human_attribute_name

Class Method Details

.core_fields(trackers) ⇒ Object

Returns the fields that are enabled for one tracker at least



159
160
161
162
163
164
165
# File 'app/models/tracker.rb', line 159

def self.core_fields(trackers)
  if trackers.present?
    trackers.uniq.map(&:core_fields).reduce(:|)
  else
    CORE_FIELDS.dup
  end
end

.disabled_core_fields(trackers) ⇒ Object

Returns the fields that are disabled for all the given trackers



150
151
152
153
154
155
156
# File 'app/models/tracker.rb', line 150

def self.disabled_core_fields(trackers)
  if trackers.present?
    trackers.map(&:disabled_core_fields).reduce(:&)
  else
    []
  end
end

Instance Method Details

#<=>(tracker) ⇒ Object



95
96
97
98
99
# File 'app/models/tracker.rb', line 95

def <=>(tracker)
  return nil unless tracker.is_a?(Tracker)

  position <=> tracker.position
end

#copy_from(arg, options = {}) ⇒ Object



83
84
85
86
87
88
89
90
91
# File 'app/models/tracker.rb', line 83

def copy_from(arg, options={})
  return if arg.blank?

  tracker = arg.is_a?(Tracker) ? arg : Tracker.find_by_id(arg.to_s)
  self.attributes = tracker.attributes.dup.except("id", "name", "position")
  self.custom_field_ids = tracker.custom_field_ids.dup
  self.project_ids = tracker.project_ids.dup
  self
end

#copy_workflow_rules(source_tracker) ⇒ Object



145
146
147
# File 'app/models/tracker.rb', line 145

def copy_workflow_rules(source_tracker)
  WorkflowRule.copy(source_tracker, nil, self, nil)
end

#core_fieldsObject



127
128
129
# File 'app/models/tracker.rb', line 127

def core_fields
  CORE_FIELDS - disabled_core_fields
end

#core_fields=(fields) ⇒ Object

Raises:

  • (ArgumentError)


131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'app/models/tracker.rb', line 131

def core_fields=(fields)
  raise ArgumentError.new("Tracker.core_fields takes an array") unless fields.is_a?(Array)

  bits = 0
  CORE_FIELDS.each_with_index do |field, i|
    unless fields.include?(field)
      bits |= 1 << i
    end
  end
  self.fields_bits = bits
  @disabled_core_fields = nil
  core_fields
end

#disabled_core_fieldsObject



118
119
120
121
122
123
124
125
# File 'app/models/tracker.rb', line 118

def disabled_core_fields
  i = -1
  @disabled_core_fields ||=
    CORE_FIELDS.select do
      i += 1
      (fields_bits || 0) & (1 << i) != 0
    end
end

#issue_status_idsObject



107
108
109
110
111
112
113
114
115
116
# File 'app/models/tracker.rb', line 107

def issue_status_ids
  if new_record?
    []
  else
    @issue_status_ids ||=
      WorkflowTransition.where(:tracker_id => id).
        where('old_status_id <> new_status_id').
        distinct.pluck(:old_status_id, :new_status_id).flatten.uniq
  end
end

#issue_statusesObject

Returns an array of IssueStatus that are used in the tracker’s workflows



103
104
105
# File 'app/models/tracker.rb', line 103

def issue_statuses
  @issue_statuses ||= IssueStatus.where(:id => issue_status_ids).to_a.sort
end

#to_sObject



93
# File 'app/models/tracker.rb', line 93

def to_s; name end