Skip to content

Commit a682851

Browse files
committed
Adds Issue#allowed_target_trackers (#7839).
git-svn-id: http://svn.redmine.org/redmine/trunk@15430 e93f8b46-1217-0410-a6f0-8f06a7374b81
1 parent fad71f8 commit a682851

File tree

9 files changed

+46
-27
lines changed

9 files changed

+46
-27
lines changed

app/controllers/context_menus_controller.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,11 @@ def issues
4141
else
4242
@assignables = @project.assignable_users
4343
end
44-
@trackers = @project.trackers
4544
else
4645
#when multiple projects, we only keep the intersection of each set
4746
@assignables = @projects.map(&:assignable_users).reduce(:&)
48-
@trackers = @projects.map(&:trackers).reduce(:&)
4947
end
48+
@trackers = @projects.map {|p| Issue.allowed_target_trackers(p) }.reduce(:&)
5049
@versions = @projects.map {|p| p.shared_versions.open}.reduce(:&)
5150

5251
@priorities = IssuePriority.active.reverse

app/controllers/issues_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def bulk_edit
230230
end
231231
@custom_fields = @issues.map{|i|i.editable_custom_fields}.reduce(:&)
232232
@assignables = target_projects.map(&:assignable_users).reduce(:&)
233-
@trackers = target_projects.map(&:trackers).reduce(:&)
233+
@trackers = target_projects.map {|p| Issue.allowed_target_trackers(p) }.reduce(:&)
234234
@versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&)
235235
@categories = target_projects.map {|p| p.issue_categories}.reduce(:&)
236236
if @copy
@@ -465,7 +465,7 @@ def build_new_issue_from_params
465465
@issue.safe_attributes = attrs
466466

467467
if @issue.project
468-
@issue.tracker ||= @issue.project.trackers.first
468+
@issue.tracker ||= @issue.allowed_target_trackers.first
469469
if @issue.tracker.nil?
470470
render_error l(:error_no_tracker_in_project)
471471
return false

app/helpers/issues_helper.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,16 @@ def link_to_new_subtask(issue)
168168
link_to(l(:button_add), new_project_issue_path(issue.project, :issue => attrs))
169169
end
170170

171+
def trackers_options_for_select(issue)
172+
trackers = issue.allowed_target_trackers
173+
if issue.new_record? && issue.parent_issue_id.present?
174+
trackers = trackers.reject do |tracker|
175+
issue.tracker_id != tracker.id && tracker.disabled_core_fields.include?('parent_issue_id')
176+
end
177+
end
178+
trackers.collect {|t| [t.name, t.id]}
179+
end
180+
171181
class IssueFieldsRows
172182
include ActionView::Helpers::TagHelper
173183

app/models/issue.rb

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -479,12 +479,14 @@ def safe_attributes=(attrs, user=User.current)
479479
end
480480

481481
if (t = attrs.delete('tracker_id')) && safe_attribute?('tracker_id')
482-
self.tracker_id = t
482+
if allowed_target_trackers(user).where(:id => t.to_i).exists?
483+
self.tracker_id = t
484+
end
483485
end
484486
if project
485-
# Set the default tracker to accept custom field values
487+
# Set a default tracker to accept custom field values
486488
# even if tracker is not specified
487-
self.tracker ||= project.trackers.first
489+
self.tracker ||= allowed_target_trackers(user).first
488490
end
489491

490492
statuses_allowed = new_statuses_allowed_to(user)
@@ -822,16 +824,6 @@ def children?
822824
!leaf?
823825
end
824826

825-
def assignable_trackers
826-
trackers = project.trackers
827-
if new_record? && parent_issue_id.present?
828-
trackers = trackers.reject do |tracker|
829-
tracker_id != tracker.id && tracker.disabled_core_fields.include?('parent_issue_id')
830-
end
831-
end
832-
trackers
833-
end
834-
835827
# Users the issue can be assigned to
836828
def assignable_users
837829
users = project.assignable_users.to_a
@@ -1373,6 +1365,20 @@ def self.allowed_target_projects(user=User.current, current_project=nil)
13731365
end
13741366
Project.where(condition).having_trackers
13751367
end
1368+
1369+
# Returns a scope of trackers that user can assign the issue to
1370+
def allowed_target_trackers(user=User.current)
1371+
if project
1372+
self.class.allowed_target_trackers(project, user, tracker_id_was)
1373+
else
1374+
Tracker.none
1375+
end
1376+
end
1377+
1378+
# Returns a scope of trackers that user can assign project issues to
1379+
def self.allowed_target_trackers(project, user=User.current, current_tracker=nil)
1380+
project.trackers.sorted
1381+
end
13761382

13771383
private
13781384

app/models/mail_handler.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,14 @@ def receive_issue
199199
end
200200

201201
issue = Issue.new(:author => user, :project => project)
202-
issue.safe_attributes = issue_attributes_from_keywords(issue)
202+
attributes = issue_attributes_from_keywords(issue)
203+
if handler_options[:no_permission_check]
204+
issue.tracker_id = attributes['tracker_id']
205+
if project
206+
issue.tracker_id ||= project.trackers.first.try(:id)
207+
end
208+
end
209+
issue.safe_attributes = attributes
203210
issue.safe_attributes = {'custom_field_values' => custom_field_values_from_keywords(issue)}
204211
issue.subject = cleaned_up_subject
205212
if issue.subject.blank?
@@ -420,10 +427,6 @@ def issue_attributes_from_keywords(issue)
420427
'done_ratio' => get_keyword(:done_ratio, :format => '(\d|10)?0')
421428
}.delete_if {|k, v| v.blank? }
422429

423-
if issue.new_record? && attrs['tracker_id'].nil?
424-
attrs['tracker_id'] = issue.project.trackers.first.try(:id)
425-
end
426-
427430
attrs
428431
end
429432

app/views/issues/_form.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<% end %>
1515

1616
<% if @issue.safe_attribute? 'tracker_id' %>
17-
<p><%= f.select :tracker_id, @issue.assignable_trackers.collect {|t| [t.name, t.id]}, {:required => true},
17+
<p><%= f.select :tracker_id, trackers_options_for_select(@issue), {:required => true},
1818
:onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %></p>
1919
<% end %>
2020

app/views/issues/index.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<div class="contextual">
2-
<% if User.current.allowed_to?(:add_issues, @project, :global => true) && (@project.nil? || @project.trackers.any?) %>
2+
<% if User.current.allowed_to?(:add_issues, @project, :global => true) && (@project.nil? || Issue.allowed_target_trackers(@project).any?) %>
33
<%= link_to l(:label_issue_new), _new_project_issue_path(@project), :class => 'icon icon-add new-issue' %>
44
<% end %>
55
</div>

lib/redmine.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@
233233
menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural
234234
menu.push :new_issue, { :controller => 'issues', :action => 'new', :copy_from => nil }, :param => :project_id, :caption => :label_issue_new,
235235
:html => { :accesskey => Redmine::AccessKeys.key_for(:new_issue) },
236-
:if => Proc.new { |p| Setting.new_project_issue_tab_enabled? && p.trackers.any? },
236+
:if => Proc.new { |p| Setting.new_project_issue_tab_enabled? && Issue.allowed_target_trackers(p).any? },
237237
:permission => :add_issues
238238
menu.push :gantt, { :controller => 'gantts', :action => 'show' }, :param => :project_id, :caption => :label_gantt
239239
menu.push :calendar, { :controller => 'calendars', :action => 'show' }, :param => :project_id, :caption => :label_calendar

test/unit/issue_test.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -737,9 +737,10 @@ def test_safe_attributes_should_accept_target_tracker_enabled_fields
737737
target = Tracker.find(2)
738738
target.core_fields = %w(assigned_to_id due_date)
739739
target.save!
740+
user = User.find(2)
740741

741-
issue = Issue.new(:tracker => source)
742-
issue.safe_attributes = {'tracker_id' => 2, 'due_date' => '2012-07-14'}
742+
issue = Issue.new(:project => Project.find(1), :tracker => source)
743+
issue.send :safe_attributes=, {'tracker_id' => 2, 'due_date' => '2012-07-14'}, user
743744
assert_equal target, issue.tracker
744745
assert_equal Date.parse('2012-07-14'), issue.due_date
745746
end

0 commit comments

Comments
 (0)