##// END OF EJS Templates
Merged r2463, r2465, r2467, r2468 from trunk....
Jean-Philippe Lang -
r2408:7f957653ad1b
parent child
Show More
@@ -1,487 +1,487
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2008 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 IssuesController < ApplicationController
19 19 menu_item :new_issue, :only => :new
20 20
21 21 before_filter :find_issue, :only => [:show, :edit, :reply]
22 22 before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
23 23 before_filter :find_project, :only => [:new, :update_form, :preview]
24 24 before_filter :authorize, :except => [:index, :changes, :gantt, :calendar, :preview, :update_form, :context_menu]
25 25 before_filter :find_optional_project, :only => [:index, :changes, :gantt, :calendar]
26 26 accept_key_auth :index, :changes
27 27
28 28 helper :journals
29 29 helper :projects
30 30 include ProjectsHelper
31 31 helper :custom_fields
32 32 include CustomFieldsHelper
33 33 helper :issue_relations
34 34 include IssueRelationsHelper
35 35 helper :watchers
36 36 include WatchersHelper
37 37 helper :attachments
38 38 include AttachmentsHelper
39 39 helper :queries
40 40 helper :sort
41 41 include SortHelper
42 42 include IssuesHelper
43 43 helper :timelog
44 44 include Redmine::Export::PDF
45 45
46 46 def index
47 47 retrieve_query
48 48 sort_init 'id', 'desc'
49 49 sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
50 50
51 51 if @query.valid?
52 52 limit = per_page_option
53 53 respond_to do |format|
54 54 format.html { }
55 55 format.atom { }
56 56 format.csv { limit = Setting.issues_export_limit.to_i }
57 57 format.pdf { limit = Setting.issues_export_limit.to_i }
58 58 end
59 59 @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
60 60 @issue_pages = Paginator.new self, @issue_count, limit, params['page']
61 61 @issues = Issue.find :all, :order => sort_clause,
62 62 :include => [ :assigned_to, :status, :tracker, :project, :priority, :category, :fixed_version ],
63 63 :conditions => @query.statement,
64 64 :limit => limit,
65 65 :offset => @issue_pages.current.offset
66 66 respond_to do |format|
67 67 format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? }
68 68 format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") }
69 69 format.csv { send_data(issues_to_csv(@issues, @project).read, :type => 'text/csv; header=present', :filename => 'export.csv') }
70 70 format.pdf { send_data(issues_to_pdf(@issues, @project), :type => 'application/pdf', :filename => 'export.pdf') }
71 71 end
72 72 else
73 73 # Send html if the query is not valid
74 74 render(:template => 'issues/index.rhtml', :layout => !request.xhr?)
75 75 end
76 76 rescue ActiveRecord::RecordNotFound
77 77 render_404
78 78 end
79 79
80 80 def changes
81 81 retrieve_query
82 82 sort_init 'id', 'desc'
83 83 sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
84 84
85 85 if @query.valid?
86 86 @journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
87 87 :conditions => @query.statement,
88 88 :limit => 25,
89 89 :order => "#{Journal.table_name}.created_on DESC"
90 90 end
91 91 @title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
92 92 render :layout => false, :content_type => 'application/atom+xml'
93 93 rescue ActiveRecord::RecordNotFound
94 94 render_404
95 95 end
96 96
97 97 def show
98 98 @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
99 99 @journals.each_with_index {|j,i| j.indice = i+1}
100 100 @journals.reverse! if User.current.wants_comments_in_reverse_order?
101 101 @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
102 102 @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
103 103 @priorities = Enumeration::get_values('IPRI')
104 104 @time_entry = TimeEntry.new
105 105 respond_to do |format|
106 106 format.html { render :template => 'issues/show.rhtml' }
107 107 format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
108 108 format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
109 109 end
110 110 end
111 111
112 112 # Add a new issue
113 113 # The new issue will be created from an existing one if copy_from parameter is given
114 114 def new
115 115 @issue = Issue.new
116 116 @issue.copy_from(params[:copy_from]) if params[:copy_from]
117 117 @issue.project = @project
118 118 # Tracker must be set before custom field values
119 119 @issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
120 120 if @issue.tracker.nil?
121 121 flash.now[:error] = 'No tracker is associated to this project. Please check the Project settings.'
122 122 render :nothing => true, :layout => true
123 123 return
124 124 end
125 125 if params[:issue].is_a?(Hash)
126 126 @issue.attributes = params[:issue]
127 127 @issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project)
128 128 end
129 129 @issue.author = User.current
130 130
131 131 default_status = IssueStatus.default
132 132 unless default_status
133 133 flash.now[:error] = 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'
134 134 render :nothing => true, :layout => true
135 135 return
136 136 end
137 137 @issue.status = default_status
138 138 @allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(User.current.role_for_project(@project), @issue.tracker)).uniq
139 139
140 140 if request.get? || request.xhr?
141 141 @issue.start_date ||= Date.today
142 142 else
143 143 requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
144 144 # Check that the user is allowed to apply the requested status
145 145 @issue.status = (@allowed_statuses.include? requested_status) ? requested_status : default_status
146 146 if @issue.save
147 147 attach_files(@issue, params[:attachments])
148 148 flash[:notice] = l(:notice_successful_create)
149 149 Mailer.deliver_issue_add(@issue) if Setting.notified_events.include?('issue_added')
150 150 redirect_to(params[:continue] ? { :action => 'new', :tracker_id => @issue.tracker } :
151 151 { :action => 'show', :id => @issue })
152 152 return
153 153 end
154 154 end
155 155 @priorities = Enumeration::get_values('IPRI')
156 156 render :layout => !request.xhr?
157 157 end
158 158
159 159 # Attributes that can be updated on workflow transition (without :edit permission)
160 160 # TODO: make it configurable (at least per role)
161 161 UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION)
162 162
163 163 def edit
164 164 @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
165 165 @priorities = Enumeration::get_values('IPRI')
166 166 @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
167 167 @time_entry = TimeEntry.new
168 168
169 169 @notes = params[:notes]
170 170 journal = @issue.init_journal(User.current, @notes)
171 171 # User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
172 172 if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
173 173 attrs = params[:issue].dup
174 174 attrs.delete_if {|k,v| !UPDATABLE_ATTRS_ON_TRANSITION.include?(k) } unless @edit_allowed
175 175 attrs.delete(:status_id) unless @allowed_statuses.detect {|s| s.id.to_s == attrs[:status_id].to_s}
176 176 @issue.attributes = attrs
177 177 end
178 178
179 179 if request.post?
180 180 @time_entry = TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
181 181 @time_entry.attributes = params[:time_entry]
182 182 attachments = attach_files(@issue, params[:attachments])
183 183 attachments.each {|a| journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)}
184 184
185 185 call_hook(:controller_issues_edit_before_save, { :params => params, :issue => @issue, :time_entry => @time_entry, :journal => journal})
186 186
187 187 if (@time_entry.hours.nil? || @time_entry.valid?) && @issue.save
188 188 # Log spend time
189 if current_role.allowed_to?(:log_time)
189 if User.current.allowed_to?(:log_time, @project)
190 190 @time_entry.save
191 191 end
192 192 if !journal.new_record?
193 193 # Only send notification if something was actually changed
194 194 flash[:notice] = l(:notice_successful_update)
195 195 Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
196 196 end
197 197 redirect_to(params[:back_to] || {:action => 'show', :id => @issue})
198 198 end
199 199 end
200 200 rescue ActiveRecord::StaleObjectError
201 201 # Optimistic locking exception
202 202 flash.now[:error] = l(:notice_locking_conflict)
203 203 end
204 204
205 205 def reply
206 206 journal = Journal.find(params[:journal_id]) if params[:journal_id]
207 207 if journal
208 208 user = journal.user
209 209 text = journal.notes
210 210 else
211 211 user = @issue.author
212 212 text = @issue.description
213 213 end
214 214 content = "#{ll(Setting.default_language, :text_user_wrote, user)}\\n> "
215 215 content << text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]').gsub('"', '\"').gsub(/(\r?\n|\r\n?)/, "\\n> ") + "\\n\\n"
216 216 render(:update) { |page|
217 217 page.<< "$('notes').value = \"#{content}\";"
218 218 page.show 'update'
219 219 page << "Form.Element.focus('notes');"
220 220 page << "Element.scrollTo('update');"
221 221 page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
222 222 }
223 223 end
224 224
225 225 # Bulk edit a set of issues
226 226 def bulk_edit
227 227 if request.post?
228 228 status = params[:status_id].blank? ? nil : IssueStatus.find_by_id(params[:status_id])
229 229 priority = params[:priority_id].blank? ? nil : Enumeration.find_by_id(params[:priority_id])
230 230 assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : User.find_by_id(params[:assigned_to_id])
231 231 category = (params[:category_id].blank? || params[:category_id] == 'none') ? nil : @project.issue_categories.find_by_id(params[:category_id])
232 232 fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.versions.find_by_id(params[:fixed_version_id])
233 233
234 234 unsaved_issue_ids = []
235 235 @issues.each do |issue|
236 236 journal = issue.init_journal(User.current, params[:notes])
237 237 issue.priority = priority if priority
238 238 issue.assigned_to = assigned_to if assigned_to || params[:assigned_to_id] == 'none'
239 239 issue.category = category if category || params[:category_id] == 'none'
240 240 issue.fixed_version = fixed_version if fixed_version || params[:fixed_version_id] == 'none'
241 241 issue.start_date = params[:start_date] unless params[:start_date].blank?
242 242 issue.due_date = params[:due_date] unless params[:due_date].blank?
243 243 issue.done_ratio = params[:done_ratio] unless params[:done_ratio].blank?
244 244 call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
245 245 # Don't save any change to the issue if the user is not authorized to apply the requested status
246 246 if (status.nil? || (issue.status.new_status_allowed_to?(status, current_role, issue.tracker) && issue.status = status)) && issue.save
247 247 # Send notification for each issue (if changed)
248 248 Mailer.deliver_issue_edit(journal) if journal.details.any? && Setting.notified_events.include?('issue_updated')
249 249 else
250 250 # Keep unsaved issue ids to display them in flash error
251 251 unsaved_issue_ids << issue.id
252 252 end
253 253 end
254 254 if unsaved_issue_ids.empty?
255 255 flash[:notice] = l(:notice_successful_update) unless @issues.empty?
256 256 else
257 257 flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #'))
258 258 end
259 259 redirect_to(params[:back_to] || {:controller => 'issues', :action => 'index', :project_id => @project})
260 260 return
261 261 end
262 262 # Find potential statuses the user could be allowed to switch issues to
263 263 @available_statuses = Workflow.find(:all, :include => :new_status,
264 264 :conditions => {:role_id => current_role.id}).collect(&:new_status).compact.uniq.sort
265 265 end
266 266
267 267 def move
268 268 @allowed_projects = []
269 269 # find projects to which the user is allowed to move the issue
270 270 if User.current.admin?
271 271 # admin is allowed to move issues to any active (visible) project
272 272 @allowed_projects = Project.find(:all, :conditions => Project.visible_by(User.current), :order => 'name')
273 273 else
274 274 User.current.memberships.each {|m| @allowed_projects << m.project if m.role.allowed_to?(:move_issues)}
275 275 end
276 276 @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
277 277 @target_project ||= @project
278 278 @trackers = @target_project.trackers
279 279 if request.post?
280 280 new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
281 281 unsaved_issue_ids = []
282 282 @issues.each do |issue|
283 283 issue.init_journal(User.current)
284 284 unsaved_issue_ids << issue.id unless issue.move_to(@target_project, new_tracker)
285 285 end
286 286 if unsaved_issue_ids.empty?
287 287 flash[:notice] = l(:notice_successful_update) unless @issues.empty?
288 288 else
289 289 flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #'))
290 290 end
291 291 redirect_to :controller => 'issues', :action => 'index', :project_id => @project
292 292 return
293 293 end
294 294 render :layout => false if request.xhr?
295 295 end
296 296
297 297 def destroy
298 298 @hours = TimeEntry.sum(:hours, :conditions => ['issue_id IN (?)', @issues]).to_f
299 299 if @hours > 0
300 300 case params[:todo]
301 301 when 'destroy'
302 302 # nothing to do
303 303 when 'nullify'
304 304 TimeEntry.update_all('issue_id = NULL', ['issue_id IN (?)', @issues])
305 305 when 'reassign'
306 306 reassign_to = @project.issues.find_by_id(params[:reassign_to_id])
307 307 if reassign_to.nil?
308 308 flash.now[:error] = l(:error_issue_not_found_in_project)
309 309 return
310 310 else
311 311 TimeEntry.update_all("issue_id = #{reassign_to.id}", ['issue_id IN (?)', @issues])
312 312 end
313 313 else
314 314 # display the destroy form
315 315 return
316 316 end
317 317 end
318 318 @issues.each(&:destroy)
319 319 redirect_to :action => 'index', :project_id => @project
320 320 end
321 321
322 322 def gantt
323 323 @gantt = Redmine::Helpers::Gantt.new(params)
324 324 retrieve_query
325 325 if @query.valid?
326 326 events = []
327 327 # Issues that have start and due dates
328 328 events += Issue.find(:all,
329 329 :order => "start_date, due_date",
330 330 :include => [:tracker, :status, :assigned_to, :priority, :project],
331 331 :conditions => ["(#{@query.statement}) AND (((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
332 332 )
333 333 # Issues that don't have a due date but that are assigned to a version with a date
334 334 events += Issue.find(:all,
335 335 :order => "start_date, effective_date",
336 336 :include => [:tracker, :status, :assigned_to, :priority, :project, :fixed_version],
337 337 :conditions => ["(#{@query.statement}) AND (((start_date>=? and start_date<=?) or (effective_date>=? and effective_date<=?) or (start_date<? and effective_date>?)) and start_date is not null and due_date is null and effective_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
338 338 )
339 339 # Versions
340 340 events += Version.find(:all, :include => :project,
341 341 :conditions => ["(#{@query.project_statement}) AND effective_date BETWEEN ? AND ?", @gantt.date_from, @gantt.date_to])
342 342
343 343 @gantt.events = events
344 344 end
345 345
346 346 respond_to do |format|
347 347 format.html { render :template => "issues/gantt.rhtml", :layout => !request.xhr? }
348 348 format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{@project.identifier}-gantt.png") } if @gantt.respond_to?('to_image')
349 349 format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{@project.nil? ? '' : "#{@project.identifier}-" }gantt.pdf") }
350 350 end
351 351 end
352 352
353 353 def calendar
354 354 if params[:year] and params[:year].to_i > 1900
355 355 @year = params[:year].to_i
356 356 if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
357 357 @month = params[:month].to_i
358 358 end
359 359 end
360 360 @year ||= Date.today.year
361 361 @month ||= Date.today.month
362 362
363 363 @calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month)
364 364 retrieve_query
365 365 if @query.valid?
366 366 events = []
367 367 events += Issue.find(:all,
368 368 :include => [:tracker, :status, :assigned_to, :priority, :project],
369 369 :conditions => ["(#{@query.statement}) AND ((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?))", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
370 370 )
371 371 events += Version.find(:all, :include => :project,
372 372 :conditions => ["(#{@query.project_statement}) AND effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt])
373 373
374 374 @calendar.events = events
375 375 end
376 376
377 377 render :layout => false if request.xhr?
378 378 end
379 379
380 380 def context_menu
381 381 @issues = Issue.find_all_by_id(params[:ids], :include => :project)
382 382 if (@issues.size == 1)
383 383 @issue = @issues.first
384 384 @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
385 385 end
386 386 projects = @issues.collect(&:project).compact.uniq
387 387 @project = projects.first if projects.size == 1
388 388
389 389 @can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
390 390 :log_time => (@project && User.current.allowed_to?(:log_time, @project)),
391 391 :update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
392 392 :move => (@project && User.current.allowed_to?(:move_issues, @project)),
393 393 :copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
394 394 :delete => (@project && User.current.allowed_to?(:delete_issues, @project))
395 395 }
396 396 if @project
397 397 @assignables = @project.assignable_users
398 398 @assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
399 399 end
400 400
401 401 @priorities = Enumeration.get_values('IPRI').reverse
402 402 @statuses = IssueStatus.find(:all, :order => 'position')
403 403 @back = request.env['HTTP_REFERER']
404 404
405 405 render :layout => false
406 406 end
407 407
408 408 def update_form
409 409 @issue = Issue.new(params[:issue])
410 410 render :action => :new, :layout => false
411 411 end
412 412
413 413 def preview
414 414 @issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
415 415 @attachements = @issue.attachments if @issue
416 416 @text = params[:notes] || (params[:issue] ? params[:issue][:description] : nil)
417 417 render :partial => 'common/preview'
418 418 end
419 419
420 420 private
421 421 def find_issue
422 422 @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
423 423 @project = @issue.project
424 424 rescue ActiveRecord::RecordNotFound
425 425 render_404
426 426 end
427 427
428 428 # Filter for bulk operations
429 429 def find_issues
430 430 @issues = Issue.find_all_by_id(params[:id] || params[:ids])
431 431 raise ActiveRecord::RecordNotFound if @issues.empty?
432 432 projects = @issues.collect(&:project).compact.uniq
433 433 if projects.size == 1
434 434 @project = projects.first
435 435 else
436 436 # TODO: let users bulk edit/move/destroy issues from different projects
437 437 render_error 'Can not bulk edit/move/destroy issues from different projects' and return false
438 438 end
439 439 rescue ActiveRecord::RecordNotFound
440 440 render_404
441 441 end
442 442
443 443 def find_project
444 444 @project = Project.find(params[:project_id])
445 445 rescue ActiveRecord::RecordNotFound
446 446 render_404
447 447 end
448 448
449 449 def find_optional_project
450 450 @project = Project.find(params[:project_id]) unless params[:project_id].blank?
451 451 allowed = User.current.allowed_to?({:controller => params[:controller], :action => params[:action]}, @project, :global => true)
452 452 allowed ? true : deny_access
453 453 rescue ActiveRecord::RecordNotFound
454 454 render_404
455 455 end
456 456
457 457 # Retrieve query from session or build a new query
458 458 def retrieve_query
459 459 if !params[:query_id].blank?
460 460 cond = "project_id IS NULL"
461 461 cond << " OR project_id = #{@project.id}" if @project
462 462 @query = Query.find(params[:query_id], :conditions => cond)
463 463 @query.project = @project
464 464 session[:query] = {:id => @query.id, :project_id => @query.project_id}
465 465 else
466 466 if params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
467 467 # Give it a name, required to be valid
468 468 @query = Query.new(:name => "_")
469 469 @query.project = @project
470 470 if params[:fields] and params[:fields].is_a? Array
471 471 params[:fields].each do |field|
472 472 @query.add_filter(field, params[:operators][field], params[:values][field])
473 473 end
474 474 else
475 475 @query.available_filters.keys.each do |field|
476 476 @query.add_short_filter(field, params[field]) if params[field]
477 477 end
478 478 end
479 479 session[:query] = {:project_id => @query.project_id, :filters => @query.filters}
480 480 else
481 481 @query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
482 482 @query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters])
483 483 @query.project = @project
484 484 end
485 485 end
486 486 end
487 487 end
@@ -1,126 +1,126
1 1 <div class="contextual">
2 2 <%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
3 3 <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time' %>
4 4 <%= watcher_tag(@issue, User.current) %>
5 5 <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
6 6 <%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
7 7 <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
8 8 </div>
9 9
10 10 <h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
11 11
12 12 <div class="<%= css_issue_classes(@issue) %>">
13 13 <%= avatar(@issue.author, :size => "64") %>
14 14 <h3><%=h @issue.subject %></h3>
15 15 <p class="author">
16 16 <%= authoring @issue.created_on, @issue.author %>.
17 17 <%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) + '.' if @issue.created_on != @issue.updated_on %>
18 18 </p>
19 19
20 20 <table width="100%">
21 21 <tr>
22 <td style="width:15%" class="status"><b><%=l(:field_status)%>:</b></td><td style="width:35%" class="status status-<%= @issue.status.name %>"><%= @issue.status.name %></td>
22 <td style="width:15%" class="status"><b><%=l(:field_status)%>:</b></td><td style="width:35%" class="status"><%= @issue.status.name %></td>
23 23 <td style="width:15%" class="start-date"><b><%=l(:field_start_date)%>:</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td>
24 24 </tr>
25 25 <tr>
26 26 <td class="priority"><b><%=l(:field_priority)%>:</b></td><td class="priority"><%= @issue.priority.name %></td>
27 27 <td class="due-date"><b><%=l(:field_due_date)%>:</b></td><td class="due-date"><%= format_date(@issue.due_date) %></td>
28 28 </tr>
29 29 <tr>
30 30 <td class="assigned-to"><b><%=l(:field_assigned_to)%>:</b></td><td><%= avatar(@issue.assigned_to, :size => "14") %><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td>
31 31 <td class="progress"><b><%=l(:field_done_ratio)%>:</b></td><td class="progress"><%= progress_bar @issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%" %></td>
32 32 </tr>
33 33 <tr>
34 34 <td class="category"><b><%=l(:field_category)%>:</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td>
35 35 <% if User.current.allowed_to?(:view_time_entries, @project) %>
36 36 <td class="spent-time"><b><%=l(:label_spent_time)%>:</b></td>
37 37 <td class="spent-hours"><%= @issue.spent_hours > 0 ? (link_to lwr(:label_f_hour, @issue.spent_hours), {:controller => 'timelog', :action => 'details', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td>
38 38 <% end %>
39 39 </tr>
40 40 <tr>
41 41 <td class="fixed-version"><b><%=l(:field_fixed_version)%>:</b></td><td><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td>
42 42 <% if @issue.estimated_hours %>
43 43 <td class="estimated-hours"><b><%=l(:field_estimated_hours)%>:</b></td><td><%= lwr(:label_f_hour, @issue.estimated_hours) %></td>
44 44 <% end %>
45 45 </tr>
46 46 <tr>
47 47 <% n = 0 -%>
48 48 <% @issue.custom_values.each do |value| -%>
49 49 <td valign="top"><b><%=h value.custom_field.name %>:</b></td><td valign="top"><%= simple_format(h(show_value(value))) %></td>
50 50 <% n = n + 1
51 51 if (n > 1)
52 52 n = 0 %>
53 53 </tr><tr>
54 54 <%end
55 55 end %>
56 56 </tr>
57 57 <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
58 58 </table>
59 59 <hr />
60 60
61 61 <div class="contextual">
62 62 <%= link_to_remote_if_authorized(l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment') unless @issue.description.blank? %>
63 63 </div>
64 64
65 65 <p><strong><%=l(:field_description)%></strong></p>
66 66 <div class="wiki">
67 67 <%= textilizable @issue, :description, :attachments => @issue.attachments %>
68 68 </div>
69 69
70 70 <%= link_to_attachments @issue %>
71 71
72 72 <% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
73 73 <hr />
74 74 <div id="relations">
75 75 <%= render :partial => 'relations' %>
76 76 </div>
77 77 <% end %>
78 78
79 79 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
80 80 (@issue.watchers.any? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
81 81 <hr />
82 82 <div id="watchers">
83 83 <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
84 84 </div>
85 85 <% end %>
86 86
87 87 </div>
88 88
89 89 <% if @issue.changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>
90 90 <div id="issue-changesets">
91 91 <h3><%=l(:label_associated_revisions)%></h3>
92 92 <%= render :partial => 'changesets', :locals => { :changesets => @issue.changesets} %>
93 93 </div>
94 94 <% end %>
95 95
96 96 <% if @journals.any? %>
97 97 <div id="history">
98 98 <h3><%=l(:label_history)%></h3>
99 99 <%= render :partial => 'history', :locals => { :journals => @journals } %>
100 100 </div>
101 101 <% end %>
102 102 <div style="clear: both;"></div>
103 103
104 104 <% if authorize_for('issues', 'edit') %>
105 105 <div id="update" style="display:none;">
106 106 <h3><%= l(:button_update) %></h3>
107 107 <%= render :partial => 'edit' %>
108 108 </div>
109 109 <% end %>
110 110
111 111 <p class="other-formats">
112 112 <%= l(:label_export_to) %>
113 113 <span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
114 114 <span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
115 115 </p>
116 116
117 117 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
118 118
119 119 <% content_for :sidebar do %>
120 120 <%= render :partial => 'issues/sidebar' %>
121 121 <% end %>
122 122
123 123 <% content_for :header_tags do %>
124 124 <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
125 125 <%= stylesheet_link_tag 'scm' %>
126 126 <% end %>
@@ -1,37 +1,32
1 1 <html>
2 2 <head>
3 3 <style>
4 4 body {
5 5 font-family: Verdana, sans-serif;
6 6 font-size: 0.8em;
7 7 color:#484848;
8 8 }
9 h1 {
10 font-family: "Trebuchet MS", Verdana, sans-serif;
11 font-size: 1.2em;
12 margin: 0px;
13 }
14 a, a:link, a:visited {
15 color: #2A5685;
16 }
17 a:hover, a:active {
18 color: #c61a1a;
19 }
9 h1, h2, h3 { font-family: "Trebuchet MS", Verdana, sans-serif; margin: 0px; }
10 h1 { font-size: 1.2em; }
11 h2, h3 { font-size: 1.1em; }
12 a, a:link, a:visited { color: #2A5685;}
13 a:hover, a:active { color: #c61a1a; }
14 a.wiki-anchor { display: none; }
20 15 hr {
21 16 width: 100%;
22 17 height: 1px;
23 18 background: #ccc;
24 19 border: 0;
25 20 }
26 21 .footer {
27 22 font-size: 0.8em;
28 23 font-style: italic;
29 24 }
30 25 </style>
31 26 </head>
32 27 <body>
33 28 <%= yield %>
34 29 <hr />
35 30 <span class="footer"><%= Redmine::WikiFormatting.to_html(Setting.text_formatting, Setting.emails_footer) %></span>
36 31 </body>
37 32 </html>
@@ -1,840 +1,859
1 1 == Redmine changelog
2 2
3 3 Redmine - project management software
4 Copyright (C) 2006-2008 Jean-Philippe Lang
4 Copyright (C) 2006-2009 Jean-Philippe Lang
5 5 http://www.redmine.org/
6 6
7 7
8 == v0.8.1
8 == 2009-02-15 v0.8.1
9 9
10 10 * Select watchers on new issue form
11 * Issue description is no longer a required field
11 12 * Files module: ability to add files without version
13 * Jump to the current tab when using the project quick-jump combo
14 * Display a warning if some attachments were not saved
15 * Import custom fields values from emails on issue creation
12 16 * Show view/annotate/download links on entry and annotate views
17 * Admin Info Screen: Display if plugin assets directory is writable
18 * Adds a 'Create and continue' button on the new issue form
19 * IMAP: add options to move received emails
20 * Do not show Category field when categories are not defined
21 * Lower the project identifier limit to a minimum of two characters
22 * Add "closed" html class to closed entries in issue list
23 * Fixed: broken redirect URL on login failure
13 24 * Fixed: Deleted files are shown when using Darcs
25 * Fixed: Darcs adapter works on Win32 only
26 * Fixed: syntax highlight doesn't appear in new ticket preview
27 * Fixed: email notification for changes I make still occurs when running Repository.fetch_changesets
28 * Fixed: no error is raised when entering invalid hours on the issue update form
29 * Fixed: Details time log report CSV export doesn't honour date format from settings
30 * Fixed: invalid css classes on issue details
31 * Fixed: Trac importer creates duplicate custom values
32 * Fixed: inline attached image should not match partial filename
14 33
15 34
16 35 == 2008-12-30 v0.8.0
17 36
18 37 * Setting added in order to limit the number of diff lines that should be displayed
19 38 * Makes logged-in username in topbar linking to
20 39 * Mail handler: strip tags when receiving a html-only email
21 40 * Mail handler: add watchers before sending notification
22 41 * Adds a css class (overdue) to overdue issues on issue lists and detail views
23 42 * Fixed: project activity truncated after viewing user's activity
24 43 * Fixed: email address entered for password recovery shouldn't be case-sensitive
25 44 * Fixed: default flag removed when editing a default enumeration
26 45 * Fixed: default category ignored when adding a document
27 46 * Fixed: error on repository user mapping when a repository username is blank
28 47 * Fixed: Firefox cuts off large diffs
29 48 * Fixed: CVS browser should not show dead revisions (deleted files)
30 49 * Fixed: escape double-quotes in image titles
31 50 * Fixed: escape textarea content when editing a issue note
32 51 * Fixed: JS error on context menu with IE
33 52 * Fixed: bold syntax around single character in series doesn't work
34 53 * Fixed several XSS vulnerabilities
35 54 * Fixed a SQL injection vulnerability
36 55
37 56
38 57 == 2008-12-07 v0.8.0-rc1
39 58
40 59 * Wiki page protection
41 60 * Wiki page hierarchy. Parent page can be assigned on the Rename screen
42 61 * Adds support for issue creation via email
43 62 * Adds support for free ticket filtering and custom queries on Gantt chart and calendar
44 63 * Cross-project search
45 64 * Ability to search a project and its subprojects
46 65 * Ability to search the projects the user belongs to
47 66 * Adds custom fields on time entries
48 67 * Adds boolean and list custom fields for time entries as criteria on time report
49 68 * Cross-project time reports
50 69 * Display latest user's activity on account/show view
51 70 * Show last connexion time on user's page
52 71 * Obfuscates email address on user's account page using javascript
53 72 * wiki TOC rendered as an unordered list
54 73 * Adds the ability to search for a user on the administration users list
55 74 * Adds the ability to search for a project name or identifier on the administration projects list
56 75 * Redirect user to the previous page after logging in
57 76 * Adds a permission 'view wiki edits' so that wiki history can be hidden to certain users
58 77 * Adds permissions for viewing the watcher list and adding new watchers on the issue detail view
59 78 * Adds permissions to let users edit and/or delete their messages
60 79 * Link to activity view when displaying dates
61 80 * Hide Redmine version in atom feeds and pdf properties
62 81 * Maps repository users to Redmine users. Users with same username or email are automatically mapped. Mapping can be manually adjusted in repository settings. Multiple usernames can be mapped to the same Redmine user.
63 82 * Sort users by their display names so that user dropdown lists are sorted alphabetically
64 83 * Adds estimated hours to issue filters
65 84 * Switch order of current and previous revisions in side-by-side diff
66 85 * Render the commit changes list as a tree
67 86 * Adds watch/unwatch functionality at forum topic level
68 87 * When moving an issue to another project, reassign it to the category with same name if any
69 88 * Adds child_pages macro for wiki pages
70 89 * Use GET instead of POST on roadmap (#718), gantt and calendar forms
71 90 * Search engine: display total results count and count by result type
72 91 * Email delivery configuration moved to an unversioned YAML file (config/email.yml, see the sample file)
73 92 * Adds icons on search results
74 93 * Adds 'Edit' link on account/show for admin users
75 94 * Adds Lock/Unlock/Activate link on user edit screen
76 95 * Adds user count in status drop down on admin user list
77 96 * Adds multi-levels blockquotes support by using > at the beginning of lines
78 97 * Adds a Reply link to each issue note
79 98 * Adds plain text only option for mail notifications
80 99 * Gravatar support for issue detail, user grid, and activity stream (disabled by default)
81 100 * Adds 'Delete wiki pages attachments' permission
82 101 * Show the most recent file when displaying an inline image
83 102 * Makes permission screens localized
84 103 * AuthSource list: display associated users count and disable 'Delete' buton if any
85 104 * Make the 'duplicates of' relation asymmetric
86 105 * Adds username to the password reminder email
87 106 * Adds links to forum messages using message#id syntax
88 107 * Allow same name for custom fields on different object types
89 108 * One-click bulk edition using the issue list context menu within the same project
90 109 * Adds support for commit logs reencoding to UTF-8 before insertion in the database. Source encoding of commit logs can be selected in Application settings -> Repositories.
91 110 * Adds checkboxes toggle links on permissions report
92 111 * Adds Trac-Like anchors on wiki headings
93 112 * Adds support for wiki links with anchor
94 113 * Adds category to the issue context menu
95 114 * Adds a workflow overview screen
96 115 * Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename
97 116 * Dots allowed in custom field name
98 117 * Adds posts quoting functionality
99 118 * Adds an option to generate sequential project identifiers
100 119 * Adds mailto link on the user administration list
101 120 * Ability to remove enumerations (activities, priorities, document categories) that are in use. Associated objects can be reassigned to another value
102 121 * Gantt chart: display issues that don't have a due date if they are assigned to a version with a date
103 122 * Change projects homepage limit to 255 chars
104 123 * Improved on-the-fly account creation. If some attributes are missing (eg. not present in the LDAP) or are invalid, the registration form is displayed so that the user is able to fill or fix these attributes
105 124 * Adds "please select" to activity select box if no activity is set as default
106 125 * Do not silently ignore timelog validation failure on issue edit
107 126 * Adds a rake task to send reminder emails
108 127 * Allow empty cells in wiki tables
109 128 * Makes wiki text formatter pluggable
110 129 * Adds back textile acronyms support
111 130 * Remove pre tag attributes
112 131 * Plugin hooks
113 132 * Pluggable admin menu
114 133 * Plugins can provide activity content
115 134 * Moves plugin list to its own administration menu item
116 135 * Adds url and author_url plugin attributes
117 136 * Adds Plugin#requires_redmine method so that plugin compatibility can be checked against current Redmine version
118 137 * Adds atom feed on time entries details
119 138 * Adds project name to issues feed title
120 139 * Adds a css class on menu items in order to apply item specific styles (eg. icons)
121 140 * Adds a Redmine plugin generators
122 141 * Adds timelog link to the issue context menu
123 142 * Adds links to the user page on various views
124 143 * Turkish translation by Ismail Sezen
125 144 * Catalan translation
126 145 * Vietnamese translation
127 146 * Slovak translation
128 147 * Better naming of activity feed if only one kind of event is displayed
129 148 * Enable syntax highlight on issues, messages and news
130 149 * Add target version to the issue list context menu
131 150 * Hide 'Target version' filter if no version is defined
132 151 * Add filters on cross-project issue list for custom fields marked as 'For all projects'
133 152 * Turn ftp urls into links
134 153 * Hiding the View Differences button when a wiki page's history only has one version
135 154 * Messages on a Board can now be sorted by the number of replies
136 155 * Adds a class ('me') to events of the activity view created by current user
137 156 * Strip pre/code tags content from activity view events
138 157 * Display issue notes in the activity view
139 158 * Adds links to changesets atom feed on repository browser
140 159 * Track project and tracker changes in issue history
141 160 * Adds anchor to atom feed messages links
142 161 * Adds a key in lang files to set the decimal separator (point or comma) in csv exports
143 162 * Makes importer work with Trac 0.8.x
144 163 * Upgraded to Prototype 1.6.0.1
145 164 * File viewer for attached text files
146 165 * Menu mapper: add support for :before, :after and :last options to #push method and add #delete method
147 166 * Removed inconsistent revision numbers on diff view
148 167 * CVS: add support for modules names with spaces
149 168 * Log the user in after registration if account activation is not needed
150 169 * Mercurial adapter improvements
151 170 * Trac importer: read session_attribute table to find user's email and real name
152 171 * Ability to disable unused SCM adapters in application settings
153 172 * Adds Filesystem adapter
154 173 * Clear changesets and changes with raw sql when deleting a repository for performance
155 174 * Redmine.pm now uses the 'commit access' permission defined in Redmine
156 175 * Reposman can create any type of scm (--scm option)
157 176 * Reposman creates a repository if the 'repository' module is enabled at project level only
158 177 * Display svn properties in the browser, svn >= 1.5.0 only
159 178 * Reduces memory usage when importing large git repositories
160 179 * Wider SVG graphs in repository stats
161 180 * SubversionAdapter#entries performance improvement
162 181 * SCM browser: ability to download raw unified diffs
163 182 * More detailed error message in log when scm command fails
164 183 * Adds support for file viewing with Darcs 2.0+
165 184 * Check that git changeset is not in the database before creating it
166 185 * Unified diff viewer for attached files with .patch or .diff extension
167 186 * File size display with Bazaar repositories
168 187 * Git adapter: use commit time instead of author time
169 188 * Prettier url for changesets
170 189 * Makes changes link to entries on the revision view
171 190 * Adds a field on the repository view to browse at specific revision
172 191 * Adds new projects atom feed
173 192 * Added rake tasks to generate rcov code coverage reports
174 193 * Add Redcloth's :block_markdown_rule to allow horizontal rules in wiki
175 194 * Show the project hierarchy in the drop down list for new membership on user administration screen
176 195 * Split user edit screen into tabs
177 196 * Renames bundled RedCloth to RedCloth3 to avoid RedCloth 4 to be loaded instead
178 197 * Fixed: Roadmap crashes when a version has a due date > 2037
179 198 * Fixed: invalid effective date (eg. 99999-01-01) causes an error on version edition screen
180 199 * Fixed: login filter providing incorrect back_url for Redmine installed in sub-directory
181 200 * Fixed: logtime entry duplicated when edited from parent project
182 201 * Fixed: wrong digest for text files under Windows
183 202 * Fixed: associated revisions are displayed in wrong order on issue view
184 203 * Fixed: Git Adapter date parsing ignores timezone
185 204 * Fixed: Printing long roadmap doesn't split across pages
186 205 * Fixes custom fields display order at several places
187 206 * Fixed: urls containing @ are parsed as email adress by the wiki formatter
188 207 * Fixed date filters accuracy with SQLite
189 208 * Fixed: tokens not escaped in highlight_tokens regexp
190 209 * Fixed Bazaar shared repository browsing
191 210 * Fixes platform determination under JRuby
192 211 * Fixed: Estimated time in issue's journal should be rounded to two decimals
193 212 * Fixed: 'search titles only' box ignored after one search is done on titles only
194 213 * Fixed: non-ASCII subversion path can't be displayed
195 214 * Fixed: Inline images don't work if file name has upper case letters or if image is in BMP format
196 215 * Fixed: document listing shows on "my page" when viewing documents is disabled for the role
197 216 * Fixed: Latest news appear on the homepage for projects with the News module disabled
198 217 * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled
199 218 * Fixed: the default status is lost when reordering issue statuses
200 219 * Fixes error with Postgresql and non-UTF8 commit logs
201 220 * Fixed: textile footnotes no longer work
202 221 * Fixed: http links containing parentheses fail to reder correctly
203 222 * Fixed: GitAdapter#get_rev should use current branch instead of hardwiring master
204 223
205 224
206 225 == 2008-07-06 v0.7.3
207 226
208 227 * Allow dot in firstnames and lastnames
209 228 * Add project name to cross-project Atom feeds
210 229 * Encoding set to utf8 in example database.yml
211 230 * HTML titles on forums related views
212 231 * Fixed: various XSS vulnerabilities
213 232 * Fixed: Entourage (and some old client) fails to correctly render notification styles
214 233 * Fixed: Fixed: timelog redirects inappropriately when :back_url is blank
215 234 * Fixed: wrong relative paths to images in wiki_syntax.html
216 235
217 236
218 237 == 2008-06-15 v0.7.2
219 238
220 239 * "New Project" link on Projects page
221 240 * Links to repository directories on the repo browser
222 241 * Move status to front in Activity View
223 242 * Remove edit step from Status context menu
224 243 * Fixed: No way to do textile horizontal rule
225 244 * Fixed: Repository: View differences doesn't work
226 245 * Fixed: attachement's name maybe invalid.
227 246 * Fixed: Error when creating a new issue
228 247 * Fixed: NoMethodError on @available_filters.has_key?
229 248 * Fixed: Check All / Uncheck All in Email Settings
230 249 * Fixed: "View differences" of one file at /repositories/revision/ fails
231 250 * Fixed: Column width in "my page"
232 251 * Fixed: private subprojects are listed on Issues view
233 252 * Fixed: Textile: bold, italics, underline, etc... not working after parentheses
234 253 * Fixed: Update issue form: comment field from log time end out of screen
235 254 * Fixed: Editing role: "issue can be assigned to this role" out of box
236 255 * Fixed: Unable use angular braces after include word
237 256 * Fixed: Using '*' as keyword for repository referencing keywords doesn't work
238 257 * Fixed: Subversion repository "View differences" on each file rise ERROR
239 258 * Fixed: View differences for individual file of a changeset fails if the repository URL doesn't point to the repository root
240 259 * Fixed: It is possible to lock out the last admin account
241 260 * Fixed: Wikis are viewable for anonymous users on public projects, despite not granting access
242 261 * Fixed: Issue number display clipped on 'my issues'
243 262 * Fixed: Roadmap version list links not carrying state
244 263 * Fixed: Log Time fieldset in IssueController#edit doesn't set default Activity as default
245 264 * Fixed: git's "get_rev" API should use repo's current branch instead of hardwiring "master"
246 265 * Fixed: browser's language subcodes ignored
247 266 * Fixed: Error on project selection with numeric (only) identifier.
248 267 * Fixed: Link to PDF doesn't work after creating new issue
249 268 * Fixed: "Replies" should not be shown on forum threads that are locked
250 269 * Fixed: SVN errors lead to svn username/password being displayed to end users (security issue)
251 270 * Fixed: http links containing hashes don't display correct
252 271 * Fixed: Allow ampersands in Enumeration names
253 272 * Fixed: Atom link on saved query does not include query_id
254 273 * Fixed: Logtime info lost when there's an error updating an issue
255 274 * Fixed: TOC does not parse colorization markups
256 275 * Fixed: CVS: add support for modules names with spaces
257 276 * Fixed: Bad rendering on projects/add
258 277 * Fixed: exception when viewing differences on cvs
259 278 * Fixed: export issue to pdf will messup when use Chinese language
260 279 * Fixed: Redmine::Scm::Adapters::GitAdapter#get_rev ignored GIT_BIN constant
261 280 * Fixed: Adding non-ASCII new issue type in the New Issue page have encoding error using IE
262 281 * Fixed: Importing from trac : some wiki links are messed
263 282 * Fixed: Incorrect weekend definition in Hebrew calendar locale
264 283 * Fixed: Atom feeds don't provide author section for repository revisions
265 284 * Fixed: In Activity views, changesets titles can be multiline while they should not
266 285 * Fixed: Ignore unreadable subversion directories (read disabled using authz)
267 286 * Fixed: lib/SVG/Graph/Graph.rb can't externalize stylesheets
268 287 * Fixed: Close statement handler in Redmine.pm
269 288
270 289
271 290 == 2008-05-04 v0.7.1
272 291
273 292 * Thai translation added (Gampol Thitinilnithi)
274 293 * Translations updates
275 294 * Escape HTML comment tags
276 295 * Prevent "can't convert nil into String" error when :sort_order param is not present
277 296 * Fixed: Updating tickets add a time log with zero hours
278 297 * Fixed: private subprojects names are revealed on the project overview
279 298 * Fixed: Search for target version of "none" fails with postgres 8.3
280 299 * Fixed: Home, Logout, Login links shouldn't be absolute links
281 300 * Fixed: 'Latest projects' box on the welcome screen should be hidden if there are no projects
282 301 * Fixed: error when using upcase language name in coderay
283 302 * Fixed: error on Trac import when :due attribute is nil
284 303
285 304
286 305 == 2008-04-28 v0.7.0
287 306
288 307 * Forces Redmine to use rails 2.0.2 gem when vendor/rails is not present
289 308 * Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list.
290 309 * Add predefined date ranges to the time report
291 310 * Time report can be done at issue level
292 311 * Various timelog report enhancements
293 312 * Accept the following formats for "hours" field: 1h, 1 h, 1 hour, 2 hours, 30m, 30min, 1h30, 1h30m, 1:30
294 313 * Display the context menu above and/or to the left of the click if needed
295 314 * Make the admin project files list sortable
296 315 * Mercurial: display working directory files sizes unless browsing a specific revision
297 316 * Preserve status filter and page number when using lock/unlock/activate links on the users list
298 317 * Redmine.pm support for LDAP authentication
299 318 * Better error message and AR errors in log for failed LDAP on-the-fly user creation
300 319 * Redirected user to where he is coming from after logging hours
301 320 * Warn user that subprojects are also deleted when deleting a project
302 321 * Include subprojects versions on calendar and gantt
303 322 * Notify project members when a message is posted if they want to receive notifications
304 323 * Fixed: Feed content limit setting has no effect
305 324 * Fixed: Priorities not ordered when displayed as a filter in issue list
306 325 * Fixed: can not display attached images inline in message replies
307 326 * Fixed: Boards are not deleted when project is deleted
308 327 * Fixed: trying to preview a new issue raises an exception with postgresql
309 328 * Fixed: single file 'View difference' links do not work because of duplicate slashes in url
310 329 * Fixed: inline image not displayed when including a wiki page
311 330 * Fixed: CVS duplicate key violation
312 331 * Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues
313 332 * Fixed: custom field filters behaviour
314 333 * Fixed: Postgresql 8.3 compatibility
315 334 * Fixed: Links to repository directories don't work
316 335
317 336
318 337 == 2008-03-29 v0.7.0-rc1
319 338
320 339 * Overall activity view and feed added, link is available on the project list
321 340 * Git VCS support
322 341 * Rails 2.0 sessions cookie store compatibility
323 342 * Use project identifiers in urls instead of ids
324 343 * Default configuration data can now be loaded from the administration screen
325 344 * Administration settings screen split to tabs (email notifications options moved to 'Settings')
326 345 * Project description is now unlimited and optional
327 346 * Wiki annotate view
328 347 * Escape HTML tag in textile content
329 348 * Add Redmine links to documents, versions, attachments and repository files
330 349 * New setting to specify how many objects should be displayed on paginated lists. There are 2 ways to select a set of issues on the issue list:
331 350 * by using checkbox and/or the little pencil that will select/unselect all issues
332 351 * by clicking on the rows (but not on the links), Ctrl and Shift keys can be used to select multiple issues
333 352 * Context menu disabled on links so that the default context menu of the browser is displayed when right-clicking on a link (click anywhere else on the row to display the context menu)
334 353 * User display format is now configurable in administration settings
335 354 * Issue list now supports bulk edit/move/delete (for a set of issues that belong to the same project)
336 355 * Merged 'change status', 'edit issue' and 'add note' actions:
337 356 * Users with 'edit issues' permission can now update any property including custom fields when adding a note or changing the status
338 357 * 'Change issue status' permission removed. To change an issue status, a user just needs to have either 'Edit' or 'Add note' permissions and some workflow transitions allowed
339 358 * Details by assignees on issue summary view
340 359 * 'New issue' link in the main menu (accesskey 7). The drop-down lists to add an issue on the project overview and the issue list are removed
341 360 * Change status select box default to current status
342 361 * Preview for issue notes, news and messages
343 362 * Optional description for attachments
344 363 * 'Fixed version' label changed to 'Target version'
345 364 * Let the user choose when deleting issues with reported hours to:
346 365 * delete the hours
347 366 * assign the hours to the project
348 367 * reassign the hours to another issue
349 368 * Date range filter and pagination on time entries detail view
350 369 * Propagate time tracking to the parent project
351 370 * Switch added on the project activity view to include subprojects
352 371 * Display total estimated and spent hours on the version detail view
353 372 * Weekly time tracking block for 'My page'
354 373 * Permissions to edit time entries
355 374 * Include subprojects on the issue list, calendar, gantt and timelog by default (can be turned off is administration settings)
356 375 * Roadmap enhancements (separate related issues from wiki contents, leading h1 in version wiki pages is hidden, smaller wiki headings)
357 376 * Make versions with same date sorted by name
358 377 * Allow issue list to be sorted by target version
359 378 * Related changesets messages displayed on the issue details view
360 379 * Create a journal and send an email when an issue is closed by commit
361 380 * Add 'Author' to the available columns for the issue list
362 381 * More appropriate default sort order on sortable columns
363 382 * Add issue subject to the time entries view and issue subject, description and tracker to the csv export
364 383 * Permissions to edit issue notes
365 384 * Display date/time instead of date on files list
366 385 * Do not show Roadmap menu item if the project doesn't define any versions
367 386 * Allow longer version names (60 chars)
368 387 * Ability to copy an existing workflow when creating a new role
369 388 * Display custom fields in two columns on the issue form
370 389 * Added 'estimated time' in the csv export of the issue list
371 390 * Display the last 30 days on the activity view rather than the current month (number of days can be configured in the application settings)
372 391 * Setting for whether new projects should be public by default
373 392 * User preference to choose how comments/replies are displayed: in chronological or reverse chronological order
374 393 * Added default value for custom fields
375 394 * Added tabindex property on wiki toolbar buttons (to easily move from field to field using the tab key)
376 395 * Redirect to issue page after creating a new issue
377 396 * Wiki toolbar improvements (mainly for Firefox)
378 397 * Display wiki syntax quick ref link on all wiki textareas
379 398 * Display links to Atom feeds
380 399 * Breadcrumb nav for the forums
381 400 * Show replies when choosing to display messages in the activity
382 401 * Added 'include' macro to include another wiki page
383 402 * RedmineWikiFormatting page available as a static HTML file locally
384 403 * Wrap diff content
385 404 * Strip out email address from authors in repository screens
386 405 * Highlight the current item of the main menu
387 406 * Added simple syntax highlighters for php and java languages
388 407 * Do not show empty diffs
389 408 * Show explicit error message when the scm command failed (eg. when svn binary is not available)
390 409 * Lithuanian translation added (Sergej Jegorov)
391 410 * Ukrainan translation added (Natalia Konovka & Mykhaylo Sorochan)
392 411 * Danish translation added (Mads Vestergaard)
393 412 * Added i18n support to the jstoolbar and various settings screen
394 413 * RedCloth's glyphs no longer user
395 414 * New icons for the wiki toolbar (from http://www.famfamfam.com/lab/icons/silk/)
396 415 * The following menus can now be extended by plugins: top_menu, account_menu, application_menu
397 416 * Added a simple rake task to fetch changesets from the repositories: rake redmine:fetch_changesets
398 417 * Remove hardcoded "Redmine" strings in account related emails and use application title instead
399 418 * Mantis importer preserve bug ids
400 419 * Trac importer: Trac guide wiki pages skipped
401 420 * Trac importer: wiki attachments migration added
402 421 * Trac importer: support database schema for Trac migration
403 422 * Trac importer: support CamelCase links
404 423 * Removes the Redmine version from the footer (can be viewed on admin -> info)
405 424 * Rescue and display an error message when trying to delete a role that is in use
406 425 * Add various 'X-Redmine' headers to email notifications: X-Redmine-Host, X-Redmine-Site, X-Redmine-Project, X-Redmine-Issue-Id, -Author, -Assignee, X-Redmine-Topic-Id
407 426 * Add "--encoding utf8" option to the Mercurial "hg log" command in order to get utf8 encoded commit logs
408 427 * Fixed: Gantt and calendar not properly refreshed (fragment caching removed)
409 428 * Fixed: Textile image with style attribute cause internal server error
410 429 * Fixed: wiki TOC not rendered properly when used in an issue or document description
411 430 * Fixed: 'has already been taken' error message on username and email fields if left empty
412 431 * Fixed: non-ascii attachement filename with IE
413 432 * Fixed: wrong url for wiki syntax pop-up when Redmine urls are prefixed
414 433 * Fixed: search for all words doesn't work
415 434 * Fixed: Do not show sticky and locked checkboxes when replying to a message
416 435 * Fixed: Mantis importer: do not duplicate Mantis username in firstname and lastname if realname is blank
417 436 * Fixed: Date custom fields not displayed as specified in application settings
418 437 * Fixed: titles not escaped in the activity view
419 438 * Fixed: issue queries can not use custom fields marked as 'for all projects' in a project context
420 439 * Fixed: on calendar, gantt and in the tracker filter on the issue list, only active trackers of the project (and its sub projects) should be available
421 440 * Fixed: locked users should not receive email notifications
422 441 * Fixed: custom field selection is not saved when unchecking them all on project settings
423 442 * Fixed: can not lock a topic when creating it
424 443 * Fixed: Incorrect filtering for unset values when using 'is not' filter
425 444 * Fixed: PostgreSQL issues_seq_id not updated when using Trac importer
426 445 * Fixed: ajax pagination does not scroll up
427 446 * Fixed: error when uploading a file with no content-type specified by the browser
428 447 * Fixed: wiki and changeset links not displayed when previewing issue description or notes
429 448 * Fixed: 'LdapError: no bind result' error when authenticating
430 449 * Fixed: 'LdapError: invalid binding information' when no username/password are set on the LDAP account
431 450 * Fixed: CVS repository doesn't work if port is used in the url
432 451 * Fixed: Email notifications: host name is missing in generated links
433 452 * Fixed: Email notifications: referenced changesets, wiki pages, attachments... are not turned into links
434 453 * Fixed: Do not clear issue relations when moving an issue to another project if cross-project issue relations are allowed
435 454 * Fixed: "undefined method 'textilizable'" error on email notification when running Repository#fetch_changesets from the console
436 455 * Fixed: Do not send an email with no recipient, cc or bcc
437 456 * Fixed: fetch_changesets fails on commit comments that close 2 duplicates issues.
438 457 * Fixed: Mercurial browsing under unix-like os and for directory depth > 2
439 458 * Fixed: Wiki links with pipe can not be used in wiki tables
440 459 * Fixed: migrate_from_trac doesn't import timestamps of wiki and tickets
441 460 * Fixed: when bulk editing, setting "Assigned to" to "nobody" causes an sql error with Postgresql
442 461
443 462
444 463 == 2008-03-12 v0.6.4
445 464
446 465 * Fixed: private projects name are displayed on account/show even if the current user doesn't have access to these private projects
447 466 * Fixed: potential LDAP authentication security flaw
448 467 * Fixed: context submenus on the issue list don't show up with IE6.
449 468 * Fixed: Themes are not applied with Rails 2.0
450 469 * Fixed: crash when fetching Mercurial changesets if changeset[:files] is nil
451 470 * Fixed: Mercurial repository browsing
452 471 * Fixed: undefined local variable or method 'log' in CvsAdapter when a cvs command fails
453 472 * Fixed: not null constraints not removed with Postgresql
454 473 * Doctype set to transitional
455 474
456 475
457 476 == 2007-12-18 v0.6.3
458 477
459 478 * Fixed: upload doesn't work in 'Files' section
460 479
461 480
462 481 == 2007-12-16 v0.6.2
463 482
464 483 * Search engine: issue custom fields can now be searched
465 484 * News comments are now textilized
466 485 * Updated Japanese translation (Satoru Kurashiki)
467 486 * Updated Chinese translation (Shortie Lo)
468 487 * Fixed Rails 2.0 compatibility bugs:
469 488 * Unable to create a wiki
470 489 * Gantt and calendar error
471 490 * Trac importer error (readonly? is defined by ActiveRecord)
472 491 * Fixed: 'assigned to me' filter broken
473 492 * Fixed: crash when validation fails on issue edition with no custom fields
474 493 * Fixed: reposman "can't find group" error
475 494 * Fixed: 'LDAP account password is too long' error when leaving the field empty on creation
476 495 * Fixed: empty lines when displaying repository files with Windows style eol
477 496 * Fixed: missing body closing tag in repository annotate and entry views
478 497
479 498
480 499 == 2007-12-10 v0.6.1
481 500
482 501 * Rails 2.0 compatibility
483 502 * Custom fields can now be displayed as columns on the issue list
484 503 * Added version details view (accessible from the roadmap)
485 504 * Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)
486 505 * Added per-project tracker selection. Trackers can be selected on project settings
487 506 * Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums
488 507 * Forums: messages can now be edited/deleted (explicit permissions need to be given)
489 508 * Forums: topics can be locked so that no reply can be added
490 509 * Forums: topics can be marked as sticky so that they always appear at the top of the list
491 510 * Forums: attachments can now be added to replies
492 511 * Added time zone support
493 512 * Added a setting to choose the account activation strategy (available in application settings)
494 513 * Added 'Classic' theme (inspired from the v0.51 design)
495 514 * Added an alternate theme which provides issue list colorization based on issues priority
496 515 * Added Bazaar SCM adapter
497 516 * Added Annotate/Blame view in the repository browser (except for Darcs SCM)
498 517 * Diff style (inline or side by side) automatically saved as a user preference
499 518 * Added issues status changes on the activity view (by Cyril Mougel)
500 519 * Added forums topics on the activity view (disabled by default)
501 520 * Added an option on 'My account' for users who don't want to be notified of changes that they make
502 521 * Trac importer now supports mysql and postgresql databases
503 522 * Trac importer improvements (by Mat Trudel)
504 523 * 'fixed version' field can now be displayed on the issue list
505 524 * Added a couple of new formats for the 'date format' setting
506 525 * Added Traditional Chinese translation (by Shortie Lo)
507 526 * Added Russian translation (iGor kMeta)
508 527 * Project name format limitation removed (name can now contain any character)
509 528 * Project identifier maximum length changed from 12 to 20
510 529 * Changed the maximum length of LDAP account to 255 characters
511 530 * Removed the 12 characters limit on passwords
512 531 * Added wiki macros support
513 532 * Performance improvement on workflow setup screen
514 533 * More detailed html title on several views
515 534 * Custom fields can now be reordered
516 535 * Search engine: search can be restricted to an exact phrase by using quotation marks
517 536 * Added custom fields marked as 'For all projects' to the csv export of the cross project issue list
518 537 * Email notifications are now sent as Blind carbon copy by default
519 538 * Fixed: all members (including non active) should be deleted when deleting a project
520 539 * Fixed: Error on wiki syntax link (accessible from wiki/edit)
521 540 * Fixed: 'quick jump to a revision' form on the revisions list
522 541 * Fixed: error on admin/info if there's more than 1 plugin installed
523 542 * Fixed: svn or ldap password can be found in clear text in the html source in editing mode
524 543 * Fixed: 'Assigned to' drop down list is not sorted
525 544 * Fixed: 'View all issues' link doesn't work on issues/show
526 545 * Fixed: error on account/register when validation fails
527 546 * Fixed: Error when displaying the issue list if a float custom field is marked as 'used as filter'
528 547 * Fixed: Mercurial adapter breaks on missing :files entry in changeset hash (James Britt)
529 548 * Fixed: Wrong feed URLs on the home page
530 549 * Fixed: Update of time entry fails when the issue has been moved to an other project
531 550 * Fixed: Error when moving an issue without changing its tracker (Postgresql)
532 551 * Fixed: Changes not recorded when using :pserver string (CVS adapter)
533 552 * Fixed: admin should be able to move issues to any project
534 553 * Fixed: adding an attachment is not possible when changing the status of an issue
535 554 * Fixed: No mime-types in documents/files downloading
536 555 * Fixed: error when sorting the messages if there's only one board for the project
537 556 * Fixed: 'me' doesn't appear in the drop down filters on a project issue list.
538 557
539 558 == 2007-11-04 v0.6.0
540 559
541 560 * Permission model refactoring.
542 561 * Permissions: there are now 2 builtin roles that can be used to specify permissions given to other users than members of projects
543 562 * Permissions: some permissions (eg. browse the repository) can be removed for certain roles
544 563 * Permissions: modules (eg. issue tracking, news, documents...) can be enabled/disabled at project level
545 564 * Added Mantis and Trac importers
546 565 * New application layout
547 566 * Added "Bulk edit" functionality on the issue list
548 567 * More flexible mail notifications settings at user level
549 568 * Added AJAX based context menu on the project issue list that provide shortcuts for editing, re-assigning, changing the status or the priority, moving or deleting an issue
550 569 * Added the hability to copy an issue. It can be done from the "issue/show" view or from the context menu on the issue list
551 570 * Added the ability to customize issue list columns (at application level or for each saved query)
552 571 * Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap
553 572 * Added the ability to rename wiki pages (specific permission required)
554 573 * Search engines now supports pagination. Results are sorted in reverse chronological order
555 574 * Added "Estimated hours" attribute on issues
556 575 * A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category
557 576 * Forum notifications are now also sent to the authors of the thread, even if they donοΏ½t watch the board
558 577 * Added an application setting to specify the application protocol (http or https) used to generate urls in emails
559 578 * Gantt chart: now starts at the current month by default
560 579 * Gantt chart: month count and zoom factor are automatically saved as user preferences
561 580 * Wiki links can now refer to other project wikis
562 581 * Added wiki index by date
563 582 * Added preview on add/edit issue form
564 583 * Emails footer can now be customized from the admin interface (Admin -> Email notifications)
565 584 * Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that theyοΏ½re properly displayed)
566 585 * Calendar: first day of week can now be set in lang files
567 586 * Automatic closing of duplicate issues
568 587 * Added a cross-project issue list
569 588 * AJAXified the SCM browser (tree view)
570 589 * Pretty URL for the repository browser (Cyril Mougel)
571 590 * Search engine: added a checkbox to search titles only
572 591 * Added "% done" in the filter list
573 592 * Enumerations: values can now be reordered and a default value can be specified (eg. default issue priority)
574 593 * Added some accesskeys
575 594 * Added "Float" as a custom field format
576 595 * Added basic Theme support
577 596 * Added the ability to set the οΏ½done ratioοΏ½ of issues fixed by commit (Nikolay Solakov)
578 597 * Added custom fields in issue related mail notifications
579 598 * Email notifications are now sent in plain text and html
580 599 * Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed.
581 600 * Added syntax highlightment for repository files and wiki
582 601 * Improved automatic Redmine links
583 602 * Added automatic table of content support on wiki pages
584 603 * Added radio buttons on the documents list to sort documents by category, date, title or author
585 604 * Added basic plugin support, with a sample plugin
586 605 * Added a link to add a new category when creating or editing an issue
587 606 * Added a "Assignable" boolean on the Role model. If unchecked, issues can not be assigned to users having this role.
588 607 * Added an option to be able to relate issues in different projects
589 608 * Added the ability to move issues (to another project) without changing their trackers.
590 609 * Atom feeds added on project activity, news and changesets
591 610 * Added the ability to reset its own RSS access key
592 611 * Main project list now displays root projects with their subprojects
593 612 * Added anchor links to issue notes
594 613 * Added reposman Ruby version. This script can now register created repositories in Redmine (Nicolas Chuche)
595 614 * Issue notes are now included in search
596 615 * Added email sending test functionality
597 616 * Added LDAPS support for LDAP authentication
598 617 * Removed hard-coded URLs in mail templates
599 618 * Subprojects are now grouped by projects in the navigation drop-down menu
600 619 * Added a new value for date filters: this week
601 620 * Added cache for application settings
602 621 * Added Polish translation (Tomasz Gawryl)
603 622 * Added Czech translation (Jan Kadlecek)
604 623 * Added Romanian translation (Csongor Bartus)
605 624 * Added Hebrew translation (Bob Builder)
606 625 * Added Serbian translation (Dragan Matic)
607 626 * Added Korean translation (Choi Jong Yoon)
608 627 * Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations
609 628 * Performance improvement on calendar and gantt
610 629 * Fixed: wiki preview doesnοΏ½t work on long entries
611 630 * Fixed: queries with multiple custom fields return no result
612 631 * Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters
613 632 * Fixed: URL with ~ broken in wiki formatting
614 633 * Fixed: some quotation marks are rendered as strange characters in pdf
615 634
616 635
617 636 == 2007-07-15 v0.5.1
618 637
619 638 * per project forums added
620 639 * added the ability to archive projects
621 640 * added οΏ½WatchοΏ½ functionality on issues. It allows users to receive notifications about issue changes
622 641 * custom fields for issues can now be used as filters on issue list
623 642 * added per user custom queries
624 643 * commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings)
625 644 * projects list now shows the list of public projects and private projects for which the user is a member
626 645 * versions can now be created with no date
627 646 * added issue count details for versions on Reports view
628 647 * added time report, by member/activity/tracker/version and year/month/week for the selected period
629 648 * each category can now be associated to a user, so that new issues in that category are automatically assigned to that user
630 649 * added autologin feature (disabled by default)
631 650 * optimistic locking added for wiki edits
632 651 * added wiki diff
633 652 * added the ability to destroy wiki pages (requires permission)
634 653 * a wiki page can now be attached to each version, and displayed on the roadmap
635 654 * attachments can now be added to wiki pages (original patch by Pavol Murin) and displayed online
636 655 * added an option to see all versions in the roadmap view (including completed ones)
637 656 * added basic issue relations
638 657 * added the ability to log time when changing an issue status
639 658 * account information can now be sent to the user when creating an account
640 659 * author and assignee of an issue always receive notifications (even if they turned of mail notifications)
641 660 * added a quick search form in page header
642 661 * added 'me' value for 'assigned to' and 'author' query filters
643 662 * added a link on revision screen to see the entire diff for the revision
644 663 * added last commit message for each entry in repository browser
645 664 * added the ability to view a file diff with free to/from revision selection.
646 665 * text files can now be viewed online when browsing the repository
647 666 * added basic support for other SCM: CVS (Ralph Vater), Mercurial and Darcs
648 667 * added fragment caching for svn diffs
649 668 * added fragment caching for calendar and gantt views
650 669 * login field automatically focused on login form
651 670 * subproject name displayed on issue list, calendar and gantt
652 671 * added an option to choose the date format: language based or ISO 8601
653 672 * added a simple mail handler. It lets users add notes to an existing issue by replying to the initial notification email.
654 673 * a 403 error page is now displayed (instead of a blank page) when trying to access a protected page
655 674 * added portuguese translation (Joao Carlos Clementoni)
656 675 * added partial online help japanese translation (Ken Date)
657 676 * added bulgarian translation (Nikolay Solakov)
658 677 * added dutch translation (Linda van den Brink)
659 678 * added swedish translation (Thomas Habets)
660 679 * italian translation update (Alessio Spadaro)
661 680 * japanese translation update (Satoru Kurashiki)
662 681 * fixed: error on history atom feed when thereοΏ½s no notes on an issue change
663 682 * fixed: error in journalizing an issue with longtext custom fields (Postgresql)
664 683 * fixed: creation of Oracle schema
665 684 * fixed: last day of the month not included in project activity
666 685 * fixed: files with an apostrophe in their names can't be accessed in SVN repository
667 686 * fixed: performance issue on RepositoriesController#revisions when a changeset has a great number of changes (eg. 100,000)
668 687 * fixed: open/closed issue counts are always 0 on reports view (postgresql)
669 688 * fixed: date query filters (wrong results and sql error with postgresql)
670 689 * fixed: confidentiality issue on account/show (private project names displayed to anyone)
671 690 * fixed: Long text custom fields displayed without line breaks
672 691 * fixed: Error when editing the wokflow after deleting a status
673 692 * fixed: SVN commit dates are now stored as local time
674 693
675 694
676 695 == 2007-04-11 v0.5.0
677 696
678 697 * added per project Wiki
679 698 * added rss/atom feeds at project level (custom queries can be used as feeds)
680 699 * added search engine (search in issues, news, commits, wiki pages, documents)
681 700 * simple time tracking functionality added
682 701 * added version due dates on calendar and gantt
683 702 * added subprojects issue count on project Reports page
684 703 * added the ability to copy an existing workflow when creating a new tracker
685 704 * added the ability to include subprojects on calendar and gantt
686 705 * added the ability to select trackers to display on calendar and gantt (Jeffrey Jones)
687 706 * added side by side svn diff view (Cyril Mougel)
688 707 * added back subproject filter on issue list
689 708 * added permissions report in admin area
690 709 * added a status filter on users list
691 710 * support for password-protected SVN repositories
692 711 * SVN commits are now stored in the database
693 712 * added simple svn statistics SVG graphs
694 713 * progress bars for roadmap versions (Nick Read)
695 714 * issue history now shows file uploads and deletions
696 715 * #id patterns are turned into links to issues in descriptions and commit messages
697 716 * japanese translation added (Satoru Kurashiki)
698 717 * chinese simplified translation added (Andy Wu)
699 718 * italian translation added (Alessio Spadaro)
700 719 * added scripts to manage SVN repositories creation and user access control using ssh+svn (Nicolas Chuche)
701 720 * better calendar rendering time
702 721 * fixed migration scripts to work with mysql 5 running in strict mode
703 722 * fixed: error when clicking "add" with no block selected on my/page_layout
704 723 * fixed: hard coded links in navigation bar
705 724 * fixed: table_name pre/suffix support
706 725
707 726
708 727 == 2007-02-18 v0.4.2
709 728
710 729 * Rails 1.2 is now required
711 730 * settings are now stored in the database and editable through the application in: Admin -> Settings (config_custom.rb is no longer used)
712 731 * added project roadmap view
713 732 * mail notifications added when a document, a file or an attachment is added
714 733 * tooltips added on Gantt chart and calender to view the details of the issues
715 734 * ability to set the sort order for roles, trackers, issue statuses
716 735 * added missing fields to csv export: priority, start date, due date, done ratio
717 736 * added total number of issues per tracker on project overview
718 737 * all icons replaced (new icons are based on GPL icon set: "KDE Crystal Diamond 2.5" -by paolino- and "kNeu! Alpha v0.1" -by Pablo Fabregat-)
719 738 * added back "fixed version" field on issue screen and in filters
720 739 * project settings screen split in 4 tabs
721 740 * custom fields screen split in 3 tabs (one for each kind of custom field)
722 741 * multiple issues pdf export now rendered as a table
723 742 * added a button on users/list to manually activate an account
724 743 * added a setting option to disable "password lost" functionality
725 744 * added a setting option to set max number of issues in csv/pdf exports
726 745 * fixed: subprojects count is always 0 on projects list
727 746 * fixed: locked users are proposed when adding a member to a project
728 747 * fixed: setting an issue status as default status leads to an sql error with SQLite
729 748 * fixed: unable to delete an issue status even if it's not used yet
730 749 * fixed: filters ignored when exporting a predefined query to csv/pdf
731 750 * fixed: crash when french "issue_edit" email notification is sent
732 751 * fixed: hide mail preference not saved (my/account)
733 752 * fixed: crash when a new user try to edit its "my page" layout
734 753
735 754
736 755 == 2007-01-03 v0.4.1
737 756
738 757 * fixed: emails have no recipient when one of the project members has notifications disabled
739 758
740 759
741 760 == 2007-01-02 v0.4.0
742 761
743 762 * simple SVN browser added (just needs svn binaries in PATH)
744 763 * comments can now be added on news
745 764 * "my page" is now customizable
746 765 * more powerfull and savable filters for issues lists
747 766 * improved issues change history
748 767 * new functionality: move an issue to another project or tracker
749 768 * new functionality: add a note to an issue
750 769 * new report: project activity
751 770 * "start date" and "% done" fields added on issues
752 771 * project calendar added
753 772 * gantt chart added (exportable to pdf)
754 773 * single/multiple issues pdf export added
755 774 * issues reports improvements
756 775 * multiple file upload for issues, documents and files
757 776 * option to set maximum size of uploaded files
758 777 * textile formating of issue and news descritions (RedCloth required)
759 778 * integration of DotClear jstoolbar for textile formatting
760 779 * calendar date picker for date fields (LGPL DHTML Calendar http://sourceforge.net/projects/jscalendar)
761 780 * new filter in issues list: Author
762 781 * ajaxified paginators
763 782 * news rss feed added
764 783 * option to set number of results per page on issues list
765 784 * localized csv separator (comma/semicolon)
766 785 * csv output encoded to ISO-8859-1
767 786 * user custom field displayed on account/show
768 787 * default configuration improved (default roles, trackers, status, permissions and workflows)
769 788 * language for default configuration data can now be chosen when running 'load_default_data' task
770 789 * javascript added on custom field form to show/hide fields according to the format of custom field
771 790 * fixed: custom fields not in csv exports
772 791 * fixed: project settings now displayed according to user's permissions
773 792 * fixed: application error when no version is selected on projects/add_file
774 793 * fixed: public actions not authorized for members of non public projects
775 794 * fixed: non public projects were shown on welcome screen even if current user is not a member
776 795
777 796
778 797 == 2006-10-08 v0.3.0
779 798
780 799 * user authentication against multiple LDAP (optional)
781 800 * token based "lost password" functionality
782 801 * user self-registration functionality (optional)
783 802 * custom fields now available for issues, users and projects
784 803 * new custom field format "text" (displayed as a textarea field)
785 804 * project & administration drop down menus in navigation bar for quicker access
786 805 * text formatting is preserved for long text fields (issues, projects and news descriptions)
787 806 * urls and emails are turned into clickable links in long text fields
788 807 * "due date" field added on issues
789 808 * tracker selection filter added on change log
790 809 * Localization plugin replaced with GLoc 1.1.0 (iconv required)
791 810 * error messages internationalization
792 811 * german translation added (thanks to Karim Trott)
793 812 * data locking for issues to prevent update conflicts (using ActiveRecord builtin optimistic locking)
794 813 * new filter in issues list: "Fixed version"
795 814 * active filters are displayed with colored background on issues list
796 815 * custom configuration is now defined in config/config_custom.rb
797 816 * user object no more stored in session (only user_id)
798 817 * news summary field is no longer required
799 818 * tables and forms redesign
800 819 * Fixed: boolean custom field not working
801 820 * Fixed: error messages for custom fields are not displayed
802 821 * Fixed: invalid custom fields should have a red border
803 822 * Fixed: custom fields values are not validated on issue update
804 823 * Fixed: unable to choose an empty value for 'List' custom fields
805 824 * Fixed: no issue categories sorting
806 825 * Fixed: incorrect versions sorting
807 826
808 827
809 828 == 2006-07-12 - v0.2.2
810 829
811 830 * Fixed: bug in "issues list"
812 831
813 832
814 833 == 2006-07-09 - v0.2.1
815 834
816 835 * new databases supported: Oracle, PostgreSQL, SQL Server
817 836 * projects/subprojects hierarchy (1 level of subprojects only)
818 837 * environment information display in admin/info
819 838 * more filter options in issues list (rev6)
820 839 * default language based on browser settings (Accept-Language HTTP header)
821 840 * issues list exportable to CSV (rev6)
822 841 * simple_format and auto_link on long text fields
823 842 * more data validations
824 843 * Fixed: error when all mail notifications are unchecked in admin/mail_options
825 844 * Fixed: all project news are displayed on project summary
826 845 * Fixed: Can't change user password in users/edit
827 846 * Fixed: Error on tables creation with PostgreSQL (rev5)
828 847 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
829 848
830 849
831 850 == 2006-06-25 - v0.1.0
832 851
833 852 * multiple users/multiple projects
834 853 * role based access control
835 854 * issue tracking system
836 855 * fully customizable workflow
837 856 * documents/files repository
838 857 * email notifications on issue creation and update
839 858 * multilanguage support (except for error messages):english, french, spanish
840 859 * online manual in french (unfinished)
General Comments 0
You need to be logged in to leave comments. Login now