Mercurial > hg > soundsoftware-site
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 |