##// END OF EJS Templates
Use a single query to retrieve issues on the roadmap....
Jean-Philippe Lang -
r8937:9c4014f446d8
parent child
Show More
@@ -1,205 +1,204
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class VersionsController < ApplicationController
19 19 menu_item :roadmap
20 20 model_object Version
21 21 before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
22 22 before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
23 23 before_filter :find_project, :only => [:index, :new, :create, :close_completed]
24 24 before_filter :authorize
25 25
26 26 accept_api_auth :index, :show, :create, :update, :destroy
27 27
28 28 helper :custom_fields
29 29 helper :projects
30 30
31 31 def index
32 32 respond_to do |format|
33 33 format.html {
34 34 @trackers = @project.trackers.find(:all, :order => 'position')
35 35 retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
36 36 @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
37 37 project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
38 38
39 39 @versions = @project.shared_versions || []
40 40 @versions += @project.rolled_up_versions.visible if @with_subprojects
41 41 @versions = @versions.uniq.sort
42 42 unless params[:completed]
43 43 @completed_versions = @versions.select {|version| version.closed? || version.completed? }
44 44 @versions -= @completed_versions
45 45 end
46 46
47 47 @issues_by_version = {}
48 unless @selected_tracker_ids.empty?
49 @versions.each do |version|
50 issues = version.fixed_issues.visible.find(:all,
51 :include => [:project, :status, :tracker, :priority],
52 :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
53 :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
54 @issues_by_version[version] = issues
55 end
48 if @selected_tracker_ids.any? && @versions.any?
49 issues = Issue.visible.all(
50 :include => [:project, :status, :tracker, :priority, :fixed_version],
51 :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)},
52 :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id"
53 )
54 @issues_by_version = issues.group_by(&:fixed_version)
56 55 end
57 56 @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
58 57 }
59 58 format.api {
60 59 @versions = @project.shared_versions.all
61 60 }
62 61 end
63 62 end
64 63
65 64 def show
66 65 respond_to do |format|
67 66 format.html {
68 67 @issues = @version.fixed_issues.visible.find(:all,
69 68 :include => [:status, :tracker, :priority],
70 69 :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
71 70 }
72 71 format.api
73 72 end
74 73 end
75 74
76 75 def new
77 76 @version = @project.versions.build(params[:version])
78 77
79 78 respond_to do |format|
80 79 format.html
81 80 format.js do
82 81 render :update do |page|
83 82 page.replace_html 'ajax-modal', :partial => 'versions/new_modal'
84 83 page << "showModal('ajax-modal', '600px');"
85 84 page << "Form.Element.focus('version_name');"
86 85 end
87 86 end
88 87 end
89 88 end
90 89
91 90 def create
92 91 @version = @project.versions.build
93 92 if params[:version]
94 93 attributes = params[:version].dup
95 94 attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
96 95 @version.attributes = attributes
97 96 end
98 97
99 98 if request.post?
100 99 if @version.save
101 100 respond_to do |format|
102 101 format.html do
103 102 flash[:notice] = l(:notice_successful_create)
104 103 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
105 104 end
106 105 format.js do
107 106 render(:update) {|page|
108 107 page << 'hideModal();'
109 108 # IE doesn't support the replace_html rjs method for select box options
110 109 page.replace "issue_fixed_version_id",
111 110 content_tag('select', content_tag('option') + version_options_for_select(@project.shared_versions.open, @version), :id => 'issue_fixed_version_id', :name => 'issue[fixed_version_id]')
112 111 }
113 112 end
114 113 format.api do
115 114 render :action => 'show', :status => :created, :location => version_url(@version)
116 115 end
117 116 end
118 117 else
119 118 respond_to do |format|
120 119 format.html { render :action => 'new' }
121 120 format.js do
122 121 render :update do |page|
123 122 page.replace_html 'ajax-modal', :partial => 'versions/new_modal'
124 123 page << "Form.Element.focus('version_name');"
125 124 end
126 125 end
127 126 format.api { render_validation_errors(@version) }
128 127 end
129 128 end
130 129 end
131 130 end
132 131
133 132 def edit
134 133 end
135 134
136 135 def update
137 136 if request.put? && params[:version]
138 137 attributes = params[:version].dup
139 138 attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
140 139 if @version.update_attributes(attributes)
141 140 respond_to do |format|
142 141 format.html {
143 142 flash[:notice] = l(:notice_successful_update)
144 143 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
145 144 }
146 145 format.api { head :ok }
147 146 end
148 147 else
149 148 respond_to do |format|
150 149 format.html { render :action => 'edit' }
151 150 format.api { render_validation_errors(@version) }
152 151 end
153 152 end
154 153 end
155 154 end
156 155
157 156 def close_completed
158 157 if request.put?
159 158 @project.close_completed_versions
160 159 end
161 160 redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
162 161 end
163 162
164 163 verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
165 164 def destroy
166 165 if @version.fixed_issues.empty?
167 166 @version.destroy
168 167 respond_to do |format|
169 168 format.html { redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project }
170 169 format.api { head :ok }
171 170 end
172 171 else
173 172 respond_to do |format|
174 173 format.html {
175 174 flash[:error] = l(:notice_unable_delete_version)
176 175 redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
177 176 }
178 177 format.api { head :unprocessable_entity }
179 178 end
180 179 end
181 180 end
182 181
183 182 def status_by
184 183 respond_to do |format|
185 184 format.html { render :action => 'show' }
186 185 format.js { render(:update) {|page| page.replace_html 'status_by', render_issue_status_by(@version, params[:status_by])} }
187 186 end
188 187 end
189 188
190 189 private
191 190 def find_project
192 191 @project = Project.find(params[:project_id])
193 192 rescue ActiveRecord::RecordNotFound
194 193 render_404
195 194 end
196 195
197 196 def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
198 197 if ids = params[:tracker_ids]
199 198 @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
200 199 else
201 200 @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
202 201 end
203 202 end
204 203
205 204 end
General Comments 0
You need to be logged in to leave comments. Login now