@@ -287,30 +287,6 class ProjectsController < ApplicationController | |||||
287 | render :layout => !request.xhr? |
|
287 | render :layout => !request.xhr? | |
288 | end |
|
288 | end | |
289 |
|
289 | |||
290 | def roadmap |
|
|||
291 | @trackers = @project.trackers.find(:all, :order => 'position') |
|
|||
292 | retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?}) |
|
|||
293 | @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') |
|
|||
294 | project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id] |
|
|||
295 |
|
||||
296 | @versions = @project.shared_versions || [] |
|
|||
297 | @versions += @project.rolled_up_versions.visible if @with_subprojects |
|
|||
298 | @versions = @versions.uniq.sort |
|
|||
299 | @versions.reject! {|version| version.closed? || version.completed? } unless params[:completed] |
|
|||
300 |
|
||||
301 | @issues_by_version = {} |
|
|||
302 | unless @selected_tracker_ids.empty? |
|
|||
303 | @versions.each do |version| |
|
|||
304 | issues = version.fixed_issues.visible.find(:all, |
|
|||
305 | :include => [:project, :status, :tracker, :priority], |
|
|||
306 | :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids}, |
|
|||
307 | :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id") |
|
|||
308 | @issues_by_version[version] = issues |
|
|||
309 | end |
|
|||
310 | end |
|
|||
311 | @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} |
|
|||
312 | end |
|
|||
313 |
|
||||
314 | private |
|
290 | private | |
315 | def find_optional_project |
|
291 | def find_optional_project | |
316 | return true unless params[:id] |
|
292 | return true unless params[:id] | |
@@ -320,14 +296,6 private | |||||
320 | render_404 |
|
296 | render_404 | |
321 | end |
|
297 | end | |
322 |
|
298 | |||
323 | def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil) |
|
|||
324 | if ids = params[:tracker_ids] |
|
|||
325 | @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s } |
|
|||
326 | else |
|
|||
327 | @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s } |
|
|||
328 | end |
|
|||
329 | end |
|
|||
330 |
|
||||
331 | # Validates parent_id param according to user's permissions |
|
299 | # Validates parent_id param according to user's permissions | |
332 | # TODO: move it to Project model in a validation that depends on User.current |
|
300 | # TODO: move it to Project model in a validation that depends on User.current | |
333 | def validate_parent_id |
|
301 | def validate_parent_id |
@@ -18,13 +18,37 | |||||
18 | class VersionsController < ApplicationController |
|
18 | class VersionsController < ApplicationController | |
19 | menu_item :roadmap |
|
19 | menu_item :roadmap | |
20 | model_object Version |
|
20 | model_object Version | |
21 | before_filter :find_model_object, :except => [:new, :close_completed] |
|
21 | before_filter :find_model_object, :except => [:index, :new, :close_completed] | |
22 | before_filter :find_project_from_association, :except => [:new, :close_completed] |
|
22 | before_filter :find_project_from_association, :except => [:index, :new, :close_completed] | |
23 | before_filter :find_project, :only => [:new, :close_completed] |
|
23 | before_filter :find_project, :only => [:index, :new, :close_completed] | |
24 | before_filter :authorize |
|
24 | before_filter :authorize | |
25 |
|
25 | |||
26 | helper :custom_fields |
|
26 | helper :custom_fields | |
27 | helper :projects |
|
27 | helper :projects | |
|
28 | ||||
|
29 | def index | |||
|
30 | @trackers = @project.trackers.find(:all, :order => 'position') | |||
|
31 | retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?}) | |||
|
32 | @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') | |||
|
33 | project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id] | |||
|
34 | ||||
|
35 | @versions = @project.shared_versions || [] | |||
|
36 | @versions += @project.rolled_up_versions.visible if @with_subprojects | |||
|
37 | @versions = @versions.uniq.sort | |||
|
38 | @versions.reject! {|version| version.closed? || version.completed? } unless params[:completed] | |||
|
39 | ||||
|
40 | @issues_by_version = {} | |||
|
41 | unless @selected_tracker_ids.empty? | |||
|
42 | @versions.each do |version| | |||
|
43 | issues = version.fixed_issues.visible.find(:all, | |||
|
44 | :include => [:project, :status, :tracker, :priority], | |||
|
45 | :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids}, | |||
|
46 | :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id") | |||
|
47 | @issues_by_version[version] = issues | |||
|
48 | end | |||
|
49 | end | |||
|
50 | @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} | |||
|
51 | end | |||
28 |
|
52 | |||
29 | def show |
|
53 | def show | |
30 | @issues = @version.fixed_issues.visible.find(:all, |
|
54 | @issues = @version.fixed_issues.visible.find(:all, | |
@@ -105,4 +129,13 private | |||||
105 | rescue ActiveRecord::RecordNotFound |
|
129 | rescue ActiveRecord::RecordNotFound | |
106 | render_404 |
|
130 | render_404 | |
107 | end |
|
131 | end | |
|
132 | ||||
|
133 | def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil) | |||
|
134 | if ids = params[:tracker_ids] | |||
|
135 | @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s } | |||
|
136 | else | |||
|
137 | @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s } | |||
|
138 | end | |||
|
139 | end | |||
|
140 | ||||
108 | end |
|
141 | end |
1 | NO CONTENT: file renamed from app/views/projects/roadmap.rhtml to app/views/versions/index.html.erb |
|
NO CONTENT: file renamed from app/views/projects/roadmap.rhtml to app/views/versions/index.html.erb |
@@ -180,7 +180,7 ActionController::Routing::Routes.draw do |map| | |||||
180 | project_views.connect 'projects/new', :action => 'add' |
|
180 | project_views.connect 'projects/new', :action => 'add' | |
181 | project_views.connect 'projects/:id', :action => 'show' |
|
181 | project_views.connect 'projects/:id', :action => 'show' | |
182 | project_views.connect 'projects/:id.:format', :action => 'show' |
|
182 | project_views.connect 'projects/:id.:format', :action => 'show' | |
183 |
project_views.connect 'projects/:id/:action', :action => / |
|
183 | project_views.connect 'projects/:id/:action', :action => /destroy|settings/ | |
184 | project_views.connect 'projects/:id/files', :action => 'list_files' |
|
184 | project_views.connect 'projects/:id/files', :action => 'list_files' | |
185 | project_views.connect 'projects/:id/files/new', :action => 'add_file' |
|
185 | project_views.connect 'projects/:id/files/new', :action => 'add_file' | |
186 | project_views.connect 'projects/:id/settings/:tab', :action => 'settings' |
|
186 | project_views.connect 'projects/:id/settings/:tab', :action => 'settings' | |
@@ -215,6 +215,7 ActionController::Routing::Routes.draw do |map| | |||||
215 |
|
215 | |||
216 | map.with_options :controller => 'versions' do |versions| |
|
216 | map.with_options :controller => 'versions' do |versions| | |
217 | versions.connect 'projects/:project_id/versions/new', :action => 'new' |
|
217 | versions.connect 'projects/:project_id/versions/new', :action => 'new' | |
|
218 | versions.connect 'projects/:project_id/roadmap', :action => 'index' | |||
218 | versions.with_options :conditions => {:method => :post} do |version_actions| |
|
219 | versions.with_options :conditions => {:method => :post} do |version_actions| | |
219 | version_actions.connect 'projects/:project_id/versions/close_completed', :action => 'close_completed' |
|
220 | version_actions.connect 'projects/:project_id/versions/close_completed', :action => 'close_completed' | |
220 | end |
|
221 | end |
@@ -57,11 +57,10 Redmine::AccessControl.map do |map| | |||||
57 | # Issue categories |
|
57 | # Issue categories | |
58 | map.permission :manage_categories, {:projects => :settings, :issue_categories => [:new, :edit, :destroy]}, :require => :member |
|
58 | map.permission :manage_categories, {:projects => :settings, :issue_categories => [:new, :edit, :destroy]}, :require => :member | |
59 | # Issues |
|
59 | # Issues | |
60 |
map.permission :view_issues, {: |
|
60 | map.permission :view_issues, {:issues => [:index, :show], | |
61 | :issues => [:index, :show], |
|
|||
62 | :auto_complete => [:issues], |
|
61 | :auto_complete => [:issues], | |
63 | :context_menus => [:issues], |
|
62 | :context_menus => [:issues], | |
64 | :versions => [:show, :status_by], |
|
63 | :versions => [:index, :show, :status_by], | |
65 | :journals => :index, |
|
64 | :journals => :index, | |
66 | :queries => :index, |
|
65 | :queries => :index, | |
67 | :reports => [:issue_report, :issue_report_details]} |
|
66 | :reports => [:issue_report, :issue_report_details]} | |
@@ -186,7 +185,7 end | |||||
186 | Redmine::MenuManager.map :project_menu do |menu| |
|
185 | Redmine::MenuManager.map :project_menu do |menu| | |
187 | menu.push :overview, { :controller => 'projects', :action => 'show' } |
|
186 | menu.push :overview, { :controller => 'projects', :action => 'show' } | |
188 | menu.push :activity, { :controller => 'activities', :action => 'index' } |
|
187 | menu.push :activity, { :controller => 'activities', :action => 'index' } | |
189 |
menu.push :roadmap, { :controller => ' |
|
188 | menu.push :roadmap, { :controller => 'versions', :action => 'index' }, :param => :project_id, | |
190 | :if => Proc.new { |p| p.shared_versions.any? } |
|
189 | :if => Proc.new { |p| p.shared_versions.any? } | |
191 | menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural |
|
190 | menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural | |
192 | menu.push :new_issue, { :controller => 'issues', :action => 'new' }, :param => :project_id, :caption => :label_issue_new, |
|
191 | menu.push :new_issue, { :controller => 'issues', :action => 'new' }, :param => :project_id, :caption => :label_issue_new, |
@@ -368,38 +368,6 class ProjectsControllerTest < ActionController::TestCase | |||||
368 | :attributes => { :href => '/attachments/download/9/version_file.zip' } |
|
368 | :attributes => { :href => '/attachments/download/9/version_file.zip' } | |
369 | end |
|
369 | end | |
370 |
|
370 | |||
371 | def test_roadmap |
|
|||
372 | get :roadmap, :id => 1 |
|
|||
373 | assert_response :success |
|
|||
374 | assert_template 'roadmap' |
|
|||
375 | assert_not_nil assigns(:versions) |
|
|||
376 | # Version with no date set appears |
|
|||
377 | assert assigns(:versions).include?(Version.find(3)) |
|
|||
378 | # Completed version doesn't appear |
|
|||
379 | assert !assigns(:versions).include?(Version.find(1)) |
|
|||
380 | end |
|
|||
381 |
|
||||
382 | def test_roadmap_with_completed_versions |
|
|||
383 | get :roadmap, :id => 1, :completed => 1 |
|
|||
384 | assert_response :success |
|
|||
385 | assert_template 'roadmap' |
|
|||
386 | assert_not_nil assigns(:versions) |
|
|||
387 | # Version with no date set appears |
|
|||
388 | assert assigns(:versions).include?(Version.find(3)) |
|
|||
389 | # Completed version appears |
|
|||
390 | assert assigns(:versions).include?(Version.find(1)) |
|
|||
391 | end |
|
|||
392 |
|
||||
393 | def test_roadmap_showing_subprojects_versions |
|
|||
394 | @subproject_version = Version.generate!(:project => Project.find(3)) |
|
|||
395 | get :roadmap, :id => 1, :with_subprojects => 1 |
|
|||
396 | assert_response :success |
|
|||
397 | assert_template 'roadmap' |
|
|||
398 | assert_not_nil assigns(:versions) |
|
|||
399 |
|
||||
400 | assert assigns(:versions).include?(Version.find(4)), "Shared version not found" |
|
|||
401 | assert assigns(:versions).include?(@subproject_version), "Subproject version not found" |
|
|||
402 | end |
|
|||
403 | def test_archive |
|
371 | def test_archive | |
404 | @request.session[:user_id] = 1 # admin |
|
372 | @request.session[:user_id] = 1 # admin | |
405 | post :archive, :id => 1 |
|
373 | post :archive, :id => 1 |
@@ -31,6 +31,39 class VersionsControllerTest < ActionController::TestCase | |||||
31 | User.current = nil |
|
31 | User.current = nil | |
32 | end |
|
32 | end | |
33 |
|
33 | |||
|
34 | def test_index | |||
|
35 | get :index, :project_id => 1 | |||
|
36 | assert_response :success | |||
|
37 | assert_template 'index' | |||
|
38 | assert_not_nil assigns(:versions) | |||
|
39 | # Version with no date set appears | |||
|
40 | assert assigns(:versions).include?(Version.find(3)) | |||
|
41 | # Completed version doesn't appear | |||
|
42 | assert !assigns(:versions).include?(Version.find(1)) | |||
|
43 | end | |||
|
44 | ||||
|
45 | def test_index_with_completed_versions | |||
|
46 | get :index, :project_id => 1, :completed => 1 | |||
|
47 | assert_response :success | |||
|
48 | assert_template 'index' | |||
|
49 | assert_not_nil assigns(:versions) | |||
|
50 | # Version with no date set appears | |||
|
51 | assert assigns(:versions).include?(Version.find(3)) | |||
|
52 | # Completed version appears | |||
|
53 | assert assigns(:versions).include?(Version.find(1)) | |||
|
54 | end | |||
|
55 | ||||
|
56 | def test_index_showing_subprojects_versions | |||
|
57 | @subproject_version = Version.generate!(:project => Project.find(3)) | |||
|
58 | get :index, :project_id => 1, :with_subprojects => 1 | |||
|
59 | assert_response :success | |||
|
60 | assert_template 'index' | |||
|
61 | assert_not_nil assigns(:versions) | |||
|
62 | ||||
|
63 | assert assigns(:versions).include?(Version.find(4)), "Shared version not found" | |||
|
64 | assert assigns(:versions).include?(@subproject_version), "Subproject version not found" | |||
|
65 | end | |||
|
66 | ||||
34 | def test_show |
|
67 | def test_show | |
35 | get :show, :id => 2 |
|
68 | get :show, :id => 2 | |
36 | assert_response :success |
|
69 | assert_response :success |
@@ -174,7 +174,7 class RoutingTest < ActionController::IntegrationTest | |||||
174 | should_route :get, "/projects/567/destroy", :controller => 'projects', :action => 'destroy', :id => '567' |
|
174 | should_route :get, "/projects/567/destroy", :controller => 'projects', :action => 'destroy', :id => '567' | |
175 | should_route :get, "/projects/33/files", :controller => 'projects', :action => 'list_files', :id => '33' |
|
175 | should_route :get, "/projects/33/files", :controller => 'projects', :action => 'list_files', :id => '33' | |
176 | should_route :get, "/projects/33/files/new", :controller => 'projects', :action => 'add_file', :id => '33' |
|
176 | should_route :get, "/projects/33/files/new", :controller => 'projects', :action => 'add_file', :id => '33' | |
177 |
should_route :get, "/projects/33/roadmap", :controller => ' |
|
177 | should_route :get, "/projects/33/roadmap", :controller => 'versions', :action => 'index', :project_id => '33' | |
178 | should_route :get, "/projects/33/activity", :controller => 'activities', :action => 'index', :id => '33' |
|
178 | should_route :get, "/projects/33/activity", :controller => 'activities', :action => 'index', :id => '33' | |
179 | should_route :get, "/projects/33/activity.atom", :controller => 'activities', :action => 'index', :id => '33', :format => 'atom' |
|
179 | should_route :get, "/projects/33/activity.atom", :controller => 'activities', :action => 'index', :id => '33', :format => 'atom' | |
180 |
|
180 |
General Comments 0
You need to be logged in to leave comments.
Login now