##// END OF EJS Templates
Introduce virtual MenuNodes (#15880)....
Introduce virtual MenuNodes (#15880). They are characterized by having a blank url. they will only be rendered if the user is authorized to see at least one of its children. they render as links which do nothing when clicked. Patch by Jan Schulz-Hofen. git-svn-id: http://svn.redmine.org/redmine/trunk@15501 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14856:cda9c63d9c21
r15119:53710d80fc88
Show More
issue_relation.rb
248 lines | 7.8 KiB | text/x-ruby | RubyLexer
/ app / models / issue_relation.rb
Jean-Philippe Lang
Set a default value for relation type....
r6057 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 Jean-Philippe Lang
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 #
# 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.
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385 #
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 # 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.
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385 #
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 # 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.
Jean-Philippe Lang
Moved IssueRelations to IssueRelation::Relations....
r10750 class IssueRelation < ActiveRecord::Base
# Class used to represent the relations of an issue
class Relations < Array
include Redmine::I18n
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb...
r10831
Jean-Philippe Lang
Moved IssueRelations to IssueRelation::Relations....
r10750 def initialize(issue, *args)
@issue = issue
super(*args)
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb...
r10831
Jean-Philippe Lang
Moved IssueRelations to IssueRelation::Relations....
r10750 def to_s(*args)
Jean-Philippe Lang
Use IssueRelation#to_s....
r13183 map {|relation| relation.to_s(@issue)}.join(', ')
Jean-Philippe Lang
Moved IssueRelations to IssueRelation::Relations....
r10750 end
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 end
Jean-Philippe Lang
Warning "Can't mass-assign protected attributes for IssueRelation: issue_to_id" (#21695)....
r14681 include Redmine::SafeAttributes
Jean-Philippe Lang
Removed unneeded :foreign_key option on belongs_to associations....
r13102 belongs_to :issue_from, :class_name => 'Issue'
belongs_to :issue_to, :class_name => 'Issue'
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 TYPE_RELATES = "relates"
TYPE_DUPLICATES = "duplicates"
Jean-Philippe Lang
Adds 'Blocked by' (#1755) and 'Duplicated by' relation types to the dropdown menu for new relations....
r3398 TYPE_DUPLICATED = "duplicated"
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 TYPE_BLOCKS = "blocks"
Jean-Philippe Lang
Adds 'Blocked by' (#1755) and 'Duplicated by' relation types to the dropdown menu for new relations....
r3398 TYPE_BLOCKED = "blocked"
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 TYPE_PRECEDES = "precedes"
Jean-Philippe Lang
Adds 'follows' relation (#1432)....
r3076 TYPE_FOLLOWS = "follows"
Jean-Philippe Lang
Adds a "Copied from/to" relation when copying issue(s) (#6899)....
r10282 TYPE_COPIED_TO = "copied_to"
TYPE_COPIED_FROM = "copied_from"
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Toshi MARUYAMA
code layout cleanup app/models/issue_relation.rb...
r10662 TYPES = {
TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to,
:order => 1, :sym => TYPE_RELATES },
TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicated_by,
:order => 2, :sym => TYPE_DUPLICATED },
TYPE_DUPLICATED => { :name => :label_duplicated_by, :sym_name => :label_duplicates,
:order => 3, :sym => TYPE_DUPLICATES, :reverse => TYPE_DUPLICATES },
TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by,
:order => 4, :sym => TYPE_BLOCKED },
TYPE_BLOCKED => { :name => :label_blocked_by, :sym_name => :label_blocks,
:order => 5, :sym => TYPE_BLOCKS, :reverse => TYPE_BLOCKS },
TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows,
:order => 6, :sym => TYPE_FOLLOWS },
TYPE_FOLLOWS => { :name => :label_follows, :sym_name => :label_precedes,
:order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES },
TYPE_COPIED_TO => { :name => :label_copied_to, :sym_name => :label_copied_from,
:order => 8, :sym => TYPE_COPIED_FROM },
TYPE_COPIED_FROM => { :name => :label_copied_from, :sym_name => :label_copied_to,
:order => 9, :sym => TYPE_COPIED_TO, :reverse => TYPE_COPIED_TO }
}.freeze
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 validates_presence_of :issue_from, :issue_to, :relation_type
Jean-Philippe Lang
Fixes 'follows' relation validation....
r3077 validates_inclusion_of :relation_type, :in => TYPES.keys
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 validates_numericality_of :delay, :allow_nil => true
validates_uniqueness_of :issue_to_id, :scope => :issue_from_id
Toshi MARUYAMA
Rails3: replace deprecated 'validate' method at IssueRelation model....
r6817 validate :validate_issue_relation
Jean-Philippe Lang
Fixed: users should not be able to add relations with issues they're not allowed to view (#2589)....
r2321 attr_protected :issue_from_id, :issue_to_id
Toshi MARUYAMA
Rails3: model: replace deprecated 'before_save' method at IssueRelation model...
r7306 before_save :handle_issue_order
Jean-Philippe Lang
Fixed that IssueRelation should not be responsible for calling Issue#init_journal (#18237)....
r13152 after_create :call_issues_relation_added_callback
after_destroy :call_issues_relation_removed_callback
Toshi MARUYAMA
Rails3: model: replace deprecated 'before_save' method at IssueRelation model...
r7306
Jean-Philippe Lang
Warning "Can't mass-assign protected attributes for IssueRelation: issue_to_id" (#21695)....
r14681 safe_attributes 'relation_type',
'delay',
'issue_to_id'
def safe_attributes=(attrs, user=User.current)
return unless attrs.is_a?(Hash)
attrs = attrs.deep_dup
if issue_id = attrs.delete('issue_to_id')
if issue_id.to_s.strip.match(/\A#?(\d+)\z/)
issue_id = $1.to_i
self.issue_to = Issue.visible(user).find_by_id(issue_id)
end
end
super(attrs)
end
Jean-Philippe Lang
Makes relations resource shallow (#7366)....
r6064 def visible?(user=User.current)
(issue_from.nil? || issue_from.visible?(user)) && (issue_to.nil? || issue_to.visible?(user))
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Makes relations resource shallow (#7366)....
r6064 def deletable?(user=User.current)
visible?(user) &&
((issue_from.nil? || user.allowed_to?(:manage_issue_relations, issue_from.project)) ||
(issue_to.nil? || user.allowed_to?(:manage_issue_relations, issue_to.project)))
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Removed after_initialize methods....
r8168 def initialize(attributes=nil, *args)
super
Jean-Philippe Lang
Set a default value for relation type....
r6057 if new_record?
if relation_type.blank?
self.relation_type = IssueRelation::TYPE_RELATES
end
end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Toshi MARUYAMA
Rails3: replace deprecated 'validate' method at IssueRelation model....
r6817 def validate_issue_relation
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 if issue_from && issue_to
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 errors.add :issue_to_id, :invalid if issue_from_id == issue_to_id
Toshi MARUYAMA
code layout cleanup app/models/issue_relation.rb...
r10662 unless issue_from.project_id == issue_to.project_id ||
Setting.cross_project_issue_relations?
errors.add :issue_to_id, :not_same_project
end
Jean-Philippe Lang
Can't set parent issue when issue relations among child issues are present (#13654)....
r14674 if circular_dependency?
errors.add :base, :circular_dependency
Jean-Baptiste Barth
Fixed circular dependencies possibly introduced when using reverse relations, for instance "blocked by" relations (#8616)....
r6004 end
Toshi MARUYAMA
code layout cleanup app/models/issue_relation.rb...
r10662 if issue_from.is_descendant_of?(issue_to) || issue_from.is_ancestor_of?(issue_to)
errors.add :base, :cant_link_an_issue_with_a_descendant
end
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 def other_issue(issue)
(self.issue_from_id == issue.id) ? issue_to : issue_from
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Adds issue relations to individual issue XML (#5305)....
r3615 # Returns the relation type for +issue+
def relation_type_for(issue)
if TYPES[relation_type]
if self.issue_from_id == issue.id
relation_type
else
TYPES[relation_type][:sym]
end
end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 def label_for(issue)
Toshi MARUYAMA
code layout cleanup app/models/issue_relation.rb...
r10662 TYPES[relation_type] ?
TYPES[relation_type][(self.issue_from_id == issue.id) ? :name : :sym_name] :
:unknow
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Overrides IssueRelation#to_s....
r13181 def to_s(issue=nil)
issue ||= issue_from
issue_text = block_given? ? yield(other_issue(issue)) : "##{other_issue(issue).try(:id)}"
s = []
s << l(label_for(issue))
s << "(#{l('datetime.distance_in_words.x_days', :count => delay)})" if delay && delay != 0
s << issue_text
s.join(' ')
end
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 def css_classes_for(issue)
"rel-#{relation_type_for(issue)}"
end
Toshi MARUYAMA
Rails3: model: replace deprecated 'before_save' method at IssueRelation model...
r7306 def handle_issue_order
Jean-Philippe Lang
Fixes 'follows' relation validation....
r3077 reverse_if_needed
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 if TYPE_PRECEDES == relation_type
self.delay ||= 0
else
self.delay = nil
end
set_issue_to_dates
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 def set_issue_to_dates
soonest_start = self.successor_soonest_start
Jean-Philippe Lang
Safer code in IssueRelation (#7018)....
r4353 if soonest_start && issue_to
Jean-Philippe Lang
Ignore non-working days when rescheduling an issue (#2161)....
r10531 issue_to.reschedule_on!(soonest_start)
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 def successor_soonest_start
Toshi MARUYAMA
code layout cleanup app/models/issue_relation.rb...
r10662 if (TYPE_PRECEDES == self.relation_type) && delay && issue_from &&
(issue_from.start_date || issue_from.due_date)
Jean-Philippe Lang
Safer code in IssueRelation (#7018)....
r4353 (issue_from.due_date || issue_from.start_date) + 1 + delay
end
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 def <=>(relation)
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 r = TYPES[self.relation_type][:order] <=> TYPES[relation.relation_type][:order]
r == 0 ? id <=> relation.id : r
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Fixed that IssueRelation should not be responsible for calling Issue#init_journal (#18237)....
r13152 def init_journals(user)
issue_from.init_journal(user) if issue_from
issue_to.init_journal(user) if issue_to
end
Jean-Philippe Lang
Adds 'follows' relation (#1432)....
r3076 private
Toshi MARUYAMA
remove trailing white-spaces from app/models/issue_relation.rb....
r6385
Jean-Philippe Lang
Adds 'Blocked by' (#1755) and 'Duplicated by' relation types to the dropdown menu for new relations....
r3398 # Reverses the relation if needed so that it gets stored in the proper way
Jean-Philippe Lang
Document why relation is reversed after validation....
r6058 # Should not be reversed before validation so that it can be displayed back
# as entered on new relation form
Jean-Philippe Lang
Adds 'follows' relation (#1432)....
r3076 def reverse_if_needed
Jean-Philippe Lang
Adds 'Blocked by' (#1755) and 'Duplicated by' relation types to the dropdown menu for new relations....
r3398 if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse]
Jean-Philippe Lang
Adds 'follows' relation (#1432)....
r3076 issue_tmp = issue_to
self.issue_to = issue_from
self.issue_from = issue_tmp
Jean-Philippe Lang
Adds 'Blocked by' (#1755) and 'Duplicated by' relation types to the dropdown menu for new relations....
r3398 self.relation_type = TYPES[relation_type][:reverse]
Jean-Philippe Lang
Adds 'follows' relation (#1432)....
r3076 end
end
Toshi MARUYAMA
add journal after creating/deleting issue relation (#1005)...
r11655
Jean-Philippe Lang
Can't set parent issue when issue relations among child issues are present (#13654)....
r14674 # Returns true if the relation would create a circular dependency
def circular_dependency?
case relation_type
when 'follows'
issue_from.would_reschedule? issue_to
when 'precedes'
issue_to.would_reschedule? issue_from
when 'blocked'
issue_from.blocks? issue_to
when 'blocks'
issue_to.blocks? issue_from
else
false
end
end
Jean-Philippe Lang
Fixed that IssueRelation should not be responsible for calling Issue#init_journal (#18237)....
r13152 def call_issues_relation_added_callback
call_issues_callback :relation_added
end
def call_issues_relation_removed_callback
call_issues_callback :relation_removed
end
def call_issues_callback(name)
[issue_from, issue_to].each do |issue|
if issue
issue.send name, self
end
end
Toshi MARUYAMA
add journal after creating/deleting issue relation (#1005)...
r11655 end
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 end