comparison app/controllers/versions_controller.rb @ 1115:433d4f72a19b redmine-2.2

Update to Redmine SVN revision 11137 on 2.2-stable branch
author Chris Cannam
date Mon, 07 Jan 2013 12:01:42 +0000
parents 5f33065ddc4b
children 622f24f53b42 261b3d9a4903
comparison
equal deleted inserted replaced
929:5f33065ddc4b 1115:433d4f72a19b
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang 2 # Copyright (C) 2006-2012 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
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 => [:index, :new, :create, :close_completed] 21 before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
22 before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed] 22 before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
23 before_filter :find_project, :only => [:index, :new, :create, :close_completed] 23 before_filter :find_project_by_project_id, :only => [:index, :new, :create, :close_completed]
24 before_filter :authorize 24 before_filter :authorize
25 25
26 accept_api_auth :index, :show, :create, :update, :destroy 26 accept_api_auth :index, :show, :create, :update, :destroy
27 27
28 helper :custom_fields 28 helper :custom_fields
37 project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id] 37 project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
38 38
39 @versions = @project.shared_versions || [] 39 @versions = @project.shared_versions || []
40 @versions += @project.rolled_up_versions.visible if @with_subprojects 40 @versions += @project.rolled_up_versions.visible if @with_subprojects
41 @versions = @versions.uniq.sort 41 @versions = @versions.uniq.sort
42 @versions.reject! {|version| version.closed? || version.completed? } unless params[:completed] 42 unless params[:completed]
43 @completed_versions = @versions.select {|version| version.closed? || version.completed? }
44 @versions -= @completed_versions
45 end
43 46
44 @issues_by_version = {} 47 @issues_by_version = {}
45 unless @selected_tracker_ids.empty? 48 if @selected_tracker_ids.any? && @versions.any?
46 @versions.each do |version| 49 issues = Issue.visible.all(
47 issues = version.fixed_issues.visible.find(:all, 50 :include => [:project, :status, :tracker, :priority, :fixed_version],
48 :include => [:project, :status, :tracker, :priority], 51 :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)},
49 :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids}, 52 :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id"
50 :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id") 53 )
51 @issues_by_version[version] = issues 54 @issues_by_version = issues.group_by(&:fixed_version)
52 end
53 end 55 end
54 @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} 56 @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
55 } 57 }
56 format.api { 58 format.api {
57 @versions = @project.shared_versions.all 59 @versions = @project.shared_versions.all
70 end 72 end
71 end 73 end
72 74
73 def new 75 def new
74 @version = @project.versions.build 76 @version = @project.versions.build
75 if params[:version] 77 @version.safe_attributes = params[:version]
76 attributes = params[:version].dup 78
77 attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing']) 79 respond_to do |format|
78 @version.safe_attributes = attributes 80 format.html
81 format.js
79 end 82 end
80 end 83 end
81 84
82 def create 85 def create
83 # TODO: refactor with code above in #new
84 @version = @project.versions.build 86 @version = @project.versions.build
85 if params[:version] 87 if params[:version]
86 attributes = params[:version].dup 88 attributes = params[:version].dup
87 attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing']) 89 attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
88 @version.safe_attributes = attributes 90 @version.safe_attributes = attributes
93 respond_to do |format| 95 respond_to do |format|
94 format.html do 96 format.html do
95 flash[:notice] = l(:notice_successful_create) 97 flash[:notice] = l(:notice_successful_create)
96 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project 98 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
97 end 99 end
98 format.js do 100 format.js
99 # IE doesn't support the replace_html rjs method for select box options
100 render(:update) {|page| page.replace "issue_fixed_version_id",
101 content_tag('select', '<option></option>' + version_options_for_select(@project.shared_versions.open, @version), :id => 'issue_fixed_version_id', :name => 'issue[fixed_version_id]')
102 }
103 end
104 format.api do 101 format.api do
105 render :action => 'show', :status => :created, :location => version_url(@version) 102 render :action => 'show', :status => :created, :location => version_url(@version)
106 end 103 end
107 end 104 end
108 else 105 else
109 respond_to do |format| 106 respond_to do |format|
110 format.html { render :action => 'new' } 107 format.html { render :action => 'new' }
111 format.js do 108 format.js { render :action => 'new' }
112 render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
113 end
114 format.api { render_validation_errors(@version) } 109 format.api { render_validation_errors(@version) }
115 end 110 end
116 end 111 end
117 end 112 end
118 end 113 end
129 respond_to do |format| 124 respond_to do |format|
130 format.html { 125 format.html {
131 flash[:notice] = l(:notice_successful_update) 126 flash[:notice] = l(:notice_successful_update)
132 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project 127 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
133 } 128 }
134 format.api { head :ok } 129 format.api { render_api_ok }
135 end 130 end
136 else 131 else
137 respond_to do |format| 132 respond_to do |format|
138 format.html { render :action => 'edit' } 133 format.html { render :action => 'edit' }
139 format.api { render_validation_errors(@version) } 134 format.api { render_validation_errors(@version) }
147 @project.close_completed_versions 142 @project.close_completed_versions
148 end 143 end
149 redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project 144 redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
150 end 145 end
151 146
152 verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
153 def destroy 147 def destroy
154 if @version.fixed_issues.empty? 148 if @version.fixed_issues.empty?
155 @version.destroy 149 @version.destroy
156 respond_to do |format| 150 respond_to do |format|
157 format.html { redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project } 151 format.html { redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project }
158 format.api { head :ok } 152 format.api { render_api_ok }
159 end 153 end
160 else 154 else
161 respond_to do |format| 155 respond_to do |format|
162 format.html { 156 format.html {
163 flash[:error] = l(:notice_unable_delete_version) 157 flash[:error] = l(:notice_unable_delete_version)
169 end 163 end
170 164
171 def status_by 165 def status_by
172 respond_to do |format| 166 respond_to do |format|
173 format.html { render :action => 'show' } 167 format.html { render :action => 'show' }
174 format.js { render(:update) {|page| page.replace_html 'status_by', render_issue_status_by(@version, params[:status_by])} } 168 format.js
175 end 169 end
176 end 170 end
177 171
178 private 172 private
179 def find_project
180 @project = Project.find(params[:project_id])
181 rescue ActiveRecord::RecordNotFound
182 render_404
183 end
184 173
185 def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil) 174 def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
186 if ids = params[:tracker_ids] 175 if ids = params[:tracker_ids]
187 @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s } 176 @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
188 else 177 else
189 @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s } 178 @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
190 end 179 end
191 end 180 end
192
193 end 181 end