##// END OF EJS Templates
Update the issue subject when choosing an issue from the drop down menu....
Update the issue subject when choosing an issue from the drop down menu. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11083 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r10733:147e7a8d6172
r10853:6be315c1ff8e
Show More
version.rb
284 lines | 8.2 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Do not raise an error when destroying a Version with assigned issues....
r3554 # Redmine - project management software
Jean-Philippe Lang
Copyright update....
r9453 # Copyright (C) 2006-2012 Jean-Philippe Lang
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 #
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Version < ActiveRecord::Base
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a version (#10390)....
r9017 include Redmine::SafeAttributes
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 after_update :update_issues_from_sharing_change
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 belongs_to :project
Jean-Philippe Lang
Do not raise an error when destroying a Version with assigned issues....
r3554 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify
Jean-Philippe Lang
Adds custom fields for versions (#4219)....
r2950 acts_as_customizable
Jean-Philippe Lang
AttachmentsController now handles attachments deletion....
r2114 acts_as_attachable :view_permission => :view_files,
:delete_permission => :manage_files
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906 VERSION_STATUSES = %w(open locked closed)
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 VERSION_SHARINGS = %w(none descendants hierarchy tree system)
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 validates_presence_of :name
validates_uniqueness_of :name, :scope => [:project_id]
Jean-Philippe Lang
Allow longer version names (#711, closes #712)....
r1206 validates_length_of :name, :maximum => 60
Jean-Philippe Lang
Use \A and \z in validation regexps....
r10733 validates_format_of :effective_date, :with => /\A\d{4}-\d{2}-\d{2}\z/, :message => :not_a_date, :allow_nil => true
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906 validates_inclusion_of :status, :in => VERSION_STATUSES
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 validates_inclusion_of :sharing, :in => VERSION_SHARINGS
Jean-Philippe Lang
Fixed version date validation (#12359)....
r10583 validate :validate_version
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906
Jean-Philippe Lang
Code cleanup....
r10660 scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
Jean-Baptiste Barth
Use lambda form in model scopes (#12499)...
r10722 scope :open, lambda { where(:status => 'open') }
Jean-Philippe Lang
Code cleanup....
r10660 scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.first || User.current, :view_issues))
}
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a version (#10390)....
r9017
safe_attributes 'name',
'description',
'effective_date',
'due_date',
'wiki_page_title',
'status',
'sharing',
'custom_field_values'
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009
# Returns true if +user+ or current user is allowed to view the version
def visible?(user=User.current)
user.allowed_to?(:view_issues, self.project)
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Fixed: version files in Files module cannot be downloaded if issue tracking is disabled (#9055)....
r7864 # Version files have same visibility as project files
def attachments_visible?(*args)
project.present? && project.attachments_visible?(*args)
end
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 def start_date
Jean-Philippe Lang
Makes Version#start_date return the minimum start_date of its issues....
r4460 @start_date ||= fixed_issues.minimum('start_date')
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 def due_date
effective_date
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Makes Version REST API accept due_date attribute (#10013)....
r8566 def due_date=(arg)
self.effective_date=(arg)
end
Jean-Philippe Lang
Version details view changes:...
r1193 # Returns the total estimated time for this version
Jean-Philippe Lang
Fixes calculation of version estimated hours with subtasks (#5265)....
r3519 # (sum of leaves estimated_hours)
Jean-Philippe Lang
Version details view changes:...
r1193 def estimated_hours
Jean-Philippe Lang
Fixes calculation of version estimated hours with subtasks (#5265)....
r3519 @estimated_hours ||= fixed_issues.leaves.sum(:estimated_hours).to_f
Jean-Philippe Lang
Version details view changes:...
r1193 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Version details view changes:...
r1193 # Returns the total reported time for this version
def spent_hours
Jean-Philippe Lang
Code cleanup....
r10660 @spent_hours ||= TimeEntry.joins(:issue).where("#{Issue.table_name}.fixed_version_id = ?", id).sum(:hours).to_f
Jean-Philippe Lang
Version details view changes:...
r1193 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906 def closed?
status == 'closed'
end
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009
def open?
status == 'open'
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 # Returns true if the version is completed: due date reached and no open issues
Jean-Philippe Lang
Added an option to see all versions in the roadmap view (including completed ones)....
r513 def completed?
Jean-Philippe Lang
Do not consider that versions that are due today are completed....
r10214 effective_date && (effective_date < Date.today) && (open_issues_count == 0)
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 end
Eric Davis
Rewrite the Gantt chart. #6276...
r3958
def behind_schedule?
if completed_pourcent == 100
return false
Jean-Philippe Lang
Makes Version#start_date return the minimum start_date of its issues....
r4460 elsif due_date && start_date
Eric Davis
Rewrite the Gantt chart. #6276...
r3958 done_date = start_date + ((due_date - start_date+1)* completed_pourcent/100).floor
return done_date <= Date.today
else
false # No issues so it's not late
end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the completion percentage of this version based on the amount of open/closed issues
# and the time spent on the open issues.
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 def completed_pourcent
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 if issues_count == 0
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 0
elsif open_issues_count == 0
100
else
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 issues_progress(false) + issues_progress(true)
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the percentage of issues that have been marked as 'closed'.
Jean-Philippe Lang
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 def closed_pourcent
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 if issues_count == 0
Jean-Philippe Lang
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 0
else
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 issues_progress(false)
Jean-Philippe Lang
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 # Returns true if the version is overdue: due date reached and some open issues
def overdue?
effective_date && (effective_date < Date.today) && (open_issues_count > 0)
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 # Returns assigned issues count
def issues_count
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 load_issue_counts
@issue_count
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the total amount of open issues for this version.
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 def open_issues_count
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 load_issue_counts
@open_issues_count
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 end
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the total amount of closed issues for this version.
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 def closed_issues_count
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 load_issue_counts
@closed_issues_count
Jean-Philippe Lang
Added an option to see all versions in the roadmap view (including completed ones)....
r513 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
A wiki page can now be attached to each version....
r561 def wiki_page
if project.wiki && !wiki_page_title.blank?
@wiki_page ||= project.wiki.find_page(wiki_page_title)
end
@wiki_page
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Added custom fields in issue related mail notifications....
r811 def to_s; name end
Eric Davis
Add project names to the Versions in the Gantt export. #5904...
r3959
def to_s_with_project
"#{project} - #{name}"
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Adjust the comment....
r9970 # Versions are sorted by effective_date and name
# Those with no effective_date are at the end, sorted by name
Jean-Philippe Lang
Versions can now be created with no date....
r533 def <=>(version)
if self.effective_date
Eric Davis
Include the Project name when sorting versions....
r3647 if version.effective_date
if self.effective_date == version.effective_date
Jean-Philippe Lang
Makes Version#<=> consistent with SQL sort....
r9969 name == version.name ? id <=> version.id : name <=> version.name
Eric Davis
Include the Project name when sorting versions....
r3647 else
self.effective_date <=> version.effective_date
end
else
-1
end
Jean-Philippe Lang
Versions can now be created with no date....
r533 else
Eric Davis
Include the Project name when sorting versions....
r3647 if version.effective_date
1
else
Jean-Philippe Lang
Makes Version#<=> consistent with SQL sort....
r9969 name == version.name ? id <=> version.id : name <=> version.name
Eric Davis
Include the Project name when sorting versions....
r3647 end
Jean-Philippe Lang
Versions can now be created with no date....
r533 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Adds Version.fields_for_order_statement....
r9889 def self.fields_for_order_statement(table=nil)
table ||= table_name
Jean-Philippe Lang
Sort issues by scheduled versions first then unscheduled versions....
r9968 ["(CASE WHEN #{table}.effective_date IS NULL THEN 1 ELSE 0 END)", "#{table}.effective_date", "#{table}.name", "#{table}.id"]
Jean-Philippe Lang
Adds Version.fields_for_order_statement....
r9889 end
Jean-Philippe Lang
Sort issues by scheduled versions first then unscheduled versions....
r9968 scope :sorted, order(fields_for_order_statement)
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 # Returns the sharings that +user+ can set the version to
def allowed_sharings(user = User.current)
VERSION_SHARINGS.select do |s|
if sharing == s
true
else
case s
when 'system'
# Only admin users can set a systemwide sharing
user.admin?
when 'hierarchy', 'tree'
# Only users allowed to manage versions of the root project can
# set sharing to hierarchy or tree
project.nil? || user.allowed_to?(:manage_versions, project.root)
else
true
end
end
end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Do not raise an error when destroying a Version with assigned issues....
r3554 private
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 def load_issue_counts
unless @issue_count
@open_issues_count = 0
@closed_issues_count = 0
fixed_issues.count(:all, :group => :status).each do |status, count|
if status.is_closed?
@closed_issues_count += count
else
@open_issues_count += count
end
end
@issue_count = @open_issues_count + @closed_issues_count
end
end
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 # Update the issue's fixed versions. Used if a version's sharing changes.
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 def update_issues_from_sharing_change
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 if sharing_changed?
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 if VERSION_SHARINGS.index(sharing_was).nil? ||
VERSION_SHARINGS.index(sharing).nil? ||
VERSION_SHARINGS.index(sharing_was) > VERSION_SHARINGS.index(sharing)
Jean-Philippe Lang
Optimize updates of issue's shared versions....
r3023 Issue.update_versions_from_sharing_change self
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 end
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 # Returns the average estimated time of assigned issues
# or 1 if no issue has an estimated time
# Used to weigth unestimated issues in progress calculation
def estimated_average
if @estimated_average.nil?
average = fixed_issues.average(:estimated_hours).to_f
if average == 0
average = 1
end
@estimated_average = average
end
@estimated_average
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the total progress of open or closed issues. The returned percentage takes into account
# the amount of estimated time set for this version.
#
# Examples:
# issues_progress(true) => returns the progress percentage for open issues.
# issues_progress(false) => returns the progress percentage for closed issues.
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 def issues_progress(open)
@issues_progress ||= {}
@issues_progress[open] ||= begin
progress = 0
if issues_count > 0
ratio = open ? 'done_ratio' : 100
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Code cleanup....
r10661 done = fixed_issues.open(open).sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}").to_f
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 progress = done / (estimated_average * issues_count)
end
progress
end
end
Jean-Philippe Lang
Fixed version date validation (#12359)....
r10583
def validate_version
if effective_date.nil? && @attributes['effective_date'].present?
errors.add :effective_date, :not_a_date
end
end
Jean-Philippe Lang
Initial commit...
r2 end