##// END OF EJS Templates
Find visible issues only in ContextMenusController#issues....
Jean-Philippe Lang -
r4466:d2cc2861de76
parent child
Show More
@@ -1,43 +1,44
1 class ContextMenusController < ApplicationController
1 class ContextMenusController < ApplicationController
2 helper :watchers
2 helper :watchers
3
3
4 def issues
4 def issues
5 @issues = Issue.find_all_by_id(params[:ids], :include => :project)
5 @issues = Issue.visible.all(:conditions => {:id => params[:ids]}, :include => :project)
6
6 if (@issues.size == 1)
7 if (@issues.size == 1)
7 @issue = @issues.first
8 @issue = @issues.first
8 @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
9 @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
9 else
10 else
10 @allowed_statuses = @issues.map do |i|
11 @allowed_statuses = @issues.map do |i|
11 i.new_statuses_allowed_to(User.current)
12 i.new_statuses_allowed_to(User.current)
12 end.inject do |memo,s|
13 end.inject do |memo,s|
13 memo & s
14 memo & s
14 end
15 end
15 end
16 end
16 @projects = @issues.collect(&:project).compact.uniq
17 @projects = @issues.collect(&:project).compact.uniq
17 @project = @projects.first if @projects.size == 1
18 @project = @projects.first if @projects.size == 1
18
19
19 @can = {:edit => User.current.allowed_to?(:edit_issues, @projects),
20 @can = {:edit => User.current.allowed_to?(:edit_issues, @projects),
20 :log_time => (@project && User.current.allowed_to?(:log_time, @project)),
21 :log_time => (@project && User.current.allowed_to?(:log_time, @project)),
21 :update => (User.current.allowed_to?(:edit_issues, @projects) || (User.current.allowed_to?(:change_status, @projects) && !@allowed_statuses.blank?)),
22 :update => (User.current.allowed_to?(:edit_issues, @projects) || (User.current.allowed_to?(:change_status, @projects) && !@allowed_statuses.blank?)),
22 :move => (@project && User.current.allowed_to?(:move_issues, @project)),
23 :move => (@project && User.current.allowed_to?(:move_issues, @project)),
23 :copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
24 :copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
24 :delete => User.current.allowed_to?(:delete_issues, @projects)
25 :delete => User.current.allowed_to?(:delete_issues, @projects)
25 }
26 }
26 if @project
27 if @project
27 @assignables = @project.assignable_users
28 @assignables = @project.assignable_users
28 @assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
29 @assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
29 @trackers = @project.trackers
30 @trackers = @project.trackers
30 else
31 else
31 #when multiple projects, we only keep the intersection of each set
32 #when multiple projects, we only keep the intersection of each set
32 @assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
33 @assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
33 @trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
34 @trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
34 end
35 end
35
36
36 @priorities = IssuePriority.all.reverse
37 @priorities = IssuePriority.all.reverse
37 @statuses = IssueStatus.find(:all, :order => 'position')
38 @statuses = IssueStatus.find(:all, :order => 'position')
38 @back = back_url
39 @back = back_url
39
40
40 render :layout => false
41 render :layout => false
41 end
42 end
42
43
43 end
44 end
@@ -1,105 +1,111
1 require File.expand_path('../../test_helper', __FILE__)
1 require File.expand_path('../../test_helper', __FILE__)
2
2
3 class ContextMenusControllerTest < ActionController::TestCase
3 class ContextMenusControllerTest < ActionController::TestCase
4 fixtures :all
4 fixtures :all
5
5
6 def test_context_menu_one_issue
6 def test_context_menu_one_issue
7 @request.session[:user_id] = 2
7 @request.session[:user_id] = 2
8 get :issues, :ids => [1]
8 get :issues, :ids => [1]
9 assert_response :success
9 assert_response :success
10 assert_template 'context_menu'
10 assert_template 'context_menu'
11 assert_tag :tag => 'a', :content => 'Edit',
11 assert_tag :tag => 'a', :content => 'Edit',
12 :attributes => { :href => '/issues/1/edit',
12 :attributes => { :href => '/issues/1/edit',
13 :class => 'icon-edit' }
13 :class => 'icon-edit' }
14 assert_tag :tag => 'a', :content => 'Closed',
14 assert_tag :tag => 'a', :content => 'Closed',
15 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bstatus_id%5D=5',
15 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bstatus_id%5D=5',
16 :class => '' }
16 :class => '' }
17 assert_tag :tag => 'a', :content => 'Immediate',
17 assert_tag :tag => 'a', :content => 'Immediate',
18 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bpriority_id%5D=8',
18 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bpriority_id%5D=8',
19 :class => '' }
19 :class => '' }
20 # Versions
20 # Versions
21 assert_tag :tag => 'a', :content => '2.0',
21 assert_tag :tag => 'a', :content => '2.0',
22 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bfixed_version_id%5D=3',
22 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bfixed_version_id%5D=3',
23 :class => '' }
23 :class => '' }
24 assert_tag :tag => 'a', :content => 'eCookbook Subproject 1 - 2.0',
24 assert_tag :tag => 'a', :content => 'eCookbook Subproject 1 - 2.0',
25 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bfixed_version_id%5D=4',
25 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bfixed_version_id%5D=4',
26 :class => '' }
26 :class => '' }
27
27
28 assert_tag :tag => 'a', :content => 'Dave Lopper',
28 assert_tag :tag => 'a', :content => 'Dave Lopper',
29 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bassigned_to_id%5D=3',
29 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bassigned_to_id%5D=3',
30 :class => '' }
30 :class => '' }
31 assert_tag :tag => 'a', :content => 'Duplicate',
31 assert_tag :tag => 'a', :content => 'Duplicate',
32 :attributes => { :href => '/projects/ecookbook/issues/1/copy',
32 :attributes => { :href => '/projects/ecookbook/issues/1/copy',
33 :class => 'icon-duplicate' }
33 :class => 'icon-duplicate' }
34 assert_tag :tag => 'a', :content => 'Copy',
34 assert_tag :tag => 'a', :content => 'Copy',
35 :attributes => { :href => '/issues/move/new?copy_options%5Bcopy%5D=t&amp;ids%5B%5D=1',
35 :attributes => { :href => '/issues/move/new?copy_options%5Bcopy%5D=t&amp;ids%5B%5D=1',
36 :class => 'icon-copy' }
36 :class => 'icon-copy' }
37 assert_tag :tag => 'a', :content => 'Move',
37 assert_tag :tag => 'a', :content => 'Move',
38 :attributes => { :href => '/issues/move/new?ids%5B%5D=1',
38 :attributes => { :href => '/issues/move/new?ids%5B%5D=1',
39 :class => 'icon-move' }
39 :class => 'icon-move' }
40 assert_tag :tag => 'a', :content => 'Delete',
40 assert_tag :tag => 'a', :content => 'Delete',
41 :attributes => { :href => '/issues/destroy?ids%5B%5D=1',
41 :attributes => { :href => '/issues/destroy?ids%5B%5D=1',
42 :class => 'icon-del' }
42 :class => 'icon-del' }
43 end
43 end
44
44
45 def test_context_menu_one_issue_by_anonymous
45 def test_context_menu_one_issue_by_anonymous
46 get :issues, :ids => [1]
46 get :issues, :ids => [1]
47 assert_response :success
47 assert_response :success
48 assert_template 'context_menu'
48 assert_template 'context_menu'
49 assert_tag :tag => 'a', :content => 'Delete',
49 assert_tag :tag => 'a', :content => 'Delete',
50 :attributes => { :href => '#',
50 :attributes => { :href => '#',
51 :class => 'icon-del disabled' }
51 :class => 'icon-del disabled' }
52 end
52 end
53
53
54 def test_context_menu_multiple_issues_of_same_project
54 def test_context_menu_multiple_issues_of_same_project
55 @request.session[:user_id] = 2
55 @request.session[:user_id] = 2
56 get :issues, :ids => [1, 2]
56 get :issues, :ids => [1, 2]
57 assert_response :success
57 assert_response :success
58 assert_template 'context_menu'
58 assert_template 'context_menu'
59 assert_tag :tag => 'a', :content => 'Edit',
59 assert_tag :tag => 'a', :content => 'Edit',
60 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2',
60 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2',
61 :class => 'icon-edit' }
61 :class => 'icon-edit' }
62 assert_tag :tag => 'a', :content => 'Closed',
62 assert_tag :tag => 'a', :content => 'Closed',
63 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bstatus_id%5D=5',
63 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bstatus_id%5D=5',
64 :class => '' }
64 :class => '' }
65 assert_tag :tag => 'a', :content => 'Immediate',
65 assert_tag :tag => 'a', :content => 'Immediate',
66 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bpriority_id%5D=8',
66 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bpriority_id%5D=8',
67 :class => '' }
67 :class => '' }
68 assert_tag :tag => 'a', :content => 'Dave Lopper',
68 assert_tag :tag => 'a', :content => 'Dave Lopper',
69 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bassigned_to_id%5D=3',
69 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bassigned_to_id%5D=3',
70 :class => '' }
70 :class => '' }
71 assert_tag :tag => 'a', :content => 'Copy',
71 assert_tag :tag => 'a', :content => 'Copy',
72 :attributes => { :href => '/issues/move/new?copy_options%5Bcopy%5D=t&amp;ids%5B%5D=1&amp;ids%5B%5D=2',
72 :attributes => { :href => '/issues/move/new?copy_options%5Bcopy%5D=t&amp;ids%5B%5D=1&amp;ids%5B%5D=2',
73 :class => 'icon-copy' }
73 :class => 'icon-copy' }
74 assert_tag :tag => 'a', :content => 'Move',
74 assert_tag :tag => 'a', :content => 'Move',
75 :attributes => { :href => '/issues/move/new?ids%5B%5D=1&amp;ids%5B%5D=2',
75 :attributes => { :href => '/issues/move/new?ids%5B%5D=1&amp;ids%5B%5D=2',
76 :class => 'icon-move' }
76 :class => 'icon-move' }
77 assert_tag :tag => 'a', :content => 'Delete',
77 assert_tag :tag => 'a', :content => 'Delete',
78 :attributes => { :href => '/issues/destroy?ids%5B%5D=1&amp;ids%5B%5D=2',
78 :attributes => { :href => '/issues/destroy?ids%5B%5D=1&amp;ids%5B%5D=2',
79 :class => 'icon-del' }
79 :class => 'icon-del' }
80 end
80 end
81
81
82 def test_context_menu_multiple_issues_of_different_projects
82 def test_context_menu_multiple_issues_of_different_projects
83 @request.session[:user_id] = 2
83 @request.session[:user_id] = 2
84 get :issues, :ids => [1, 2, 6]
84 get :issues, :ids => [1, 2, 6]
85 assert_response :success
85 assert_response :success
86 assert_template 'context_menu'
86 assert_template 'context_menu'
87 ids = "ids%5B%5D=1&amp;ids%5B%5D=2&amp;ids%5B%5D=6"
87 ids = "ids%5B%5D=1&amp;ids%5B%5D=2&amp;ids%5B%5D=6"
88 assert_tag :tag => 'a', :content => 'Edit',
88 assert_tag :tag => 'a', :content => 'Edit',
89 :attributes => { :href => "/issues/bulk_edit?#{ids}",
89 :attributes => { :href => "/issues/bulk_edit?#{ids}",
90 :class => 'icon-edit' }
90 :class => 'icon-edit' }
91 assert_tag :tag => 'a', :content => 'Closed',
91 assert_tag :tag => 'a', :content => 'Closed',
92 :attributes => { :href => "/issues/bulk_edit?#{ids}&amp;issue%5Bstatus_id%5D=5",
92 :attributes => { :href => "/issues/bulk_edit?#{ids}&amp;issue%5Bstatus_id%5D=5",
93 :class => '' }
93 :class => '' }
94 assert_tag :tag => 'a', :content => 'Immediate',
94 assert_tag :tag => 'a', :content => 'Immediate',
95 :attributes => { :href => "/issues/bulk_edit?#{ids}&amp;issue%5Bpriority_id%5D=8",
95 :attributes => { :href => "/issues/bulk_edit?#{ids}&amp;issue%5Bpriority_id%5D=8",
96 :class => '' }
96 :class => '' }
97 assert_tag :tag => 'a', :content => 'John Smith',
97 assert_tag :tag => 'a', :content => 'John Smith',
98 :attributes => { :href => "/issues/bulk_edit?#{ids}&amp;issue%5Bassigned_to_id%5D=2",
98 :attributes => { :href => "/issues/bulk_edit?#{ids}&amp;issue%5Bassigned_to_id%5D=2",
99 :class => '' }
99 :class => '' }
100 assert_tag :tag => 'a', :content => 'Delete',
100 assert_tag :tag => 'a', :content => 'Delete',
101 :attributes => { :href => "/issues/destroy?#{ids}",
101 :attributes => { :href => "/issues/destroy?#{ids}",
102 :class => 'icon-del' }
102 :class => 'icon-del' }
103 end
103 end
104
104
105 def test_context_menu_issue_visibility
106 get :issues, :ids => [1, 4]
107 assert_response :success
108 assert_template 'context_menu'
109 assert_equal [1], assigns(:issues).collect(&:id)
110 end
105 end
111 end
General Comments 0
You need to be logged in to leave comments. Login now