##// END OF EJS Templates
Introduce virtual MenuNodes (#15880)....
Introduce virtual MenuNodes (#15880). They are characterized by having a blank url. they will only be rendered if the user is authorized to see at least one of its children. they render as links which do nothing when clicked. Patch by Jan Schulz-Hofen. git-svn-id: http://svn.redmine.org/redmine/trunk@15501 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14997:ed50d42210ea
r15119:53710d80fc88
Show More
version.rb
314 lines | 8.9 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
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 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
Default target version for new issues (#1828)....
r14404
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 after_update :update_issues_from_sharing_change
Jean-Philippe Lang
Default target version for new issues (#1828)....
r14404 before_destroy :nullify_projects_default_version
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,
Jean-Philippe Lang
Edit attachments after upload (#1326)....
r13283 :edit_permission => :manage_files,
Jean-Philippe Lang
AttachmentsController now handles attachments deletion....
r2114 :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
Missing validation for description size of versions (#19840)....
r13885 validates_length_of :description, :maximum => 255
Jean-Philippe Lang
Adds a custom validator for dates (#12736)....
r10894 validates :effective_date, :date => 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
Merged rails-4.1 branch (#14534)....
r13100 attr_protected :id
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|
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 joins(:project).
where(Project.allowed_to_condition(args.first || User.current, :view_issues))
Jean-Philippe Lang
Code cleanup....
r10660 }
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a version (#10390)....
r9017
Toshi MARUYAMA
remove trailing white space from app/models/version.rb...
r11421 safe_attributes 'name',
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a version (#10390)....
r9017 'description',
'effective_date',
'due_date',
'wiki_page_title',
'status',
'sharing',
Jean-Philippe Lang
Fixed: Unable to set custom fields for versions using the REST API (#13850)....
r11530 'custom_field_values',
'custom_fields'
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
Fixed: Files assigned to a version can not be deleted if Issue Tracking module is disabled (#17163)....
r13027 def attachments_deletable?(usr=User.current)
project.present? && project.attachments_deletable?(usr)
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
Don't store total estimated hours on parent issues (#16092)....
r13890 @estimated_hours ||= fixed_issues.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
Closed versions should be marked as completed (#21433)....
r14637 # Returns true if the version is completed: closed or 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
Replace Date.today with User.current.today (#22320)....
r14997 closed? || (effective_date && (effective_date < User.current.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?
Jean-Philippe Lang
Deprecates Version#*_pourcent in favour of #*_percent (#12724)....
r10883 if completed_percent == 100
Eric Davis
Rewrite the Gantt chart. #6276...
r3958 return false
Jean-Philippe Lang
Makes Version#start_date return the minimum start_date of its issues....
r4460 elsif due_date && start_date
Jean-Philippe Lang
Deprecates Version#*_pourcent in favour of #*_percent (#12724)....
r10883 done_date = start_date + ((due_date - start_date+1)* completed_percent/100).floor
Jean-Philippe Lang
Replace Date.today with User.current.today (#22320)....
r14997 return done_date <= User.current.today
Eric Davis
Rewrite the Gantt chart. #6276...
r3958 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
Deprecates Version#*_pourcent in favour of #*_percent (#12724)....
r10883 def completed_percent
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
Deprecates Version#*_pourcent in favour of #*_percent (#12724)....
r10883 def closed_percent
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?
Jean-Philippe Lang
Replace Date.today with User.current.today (#22320)....
r14997 effective_date && (effective_date < User.current.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
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
Additional CSS class for version status (#21434)....
r14888 def css_classes
[
completed? ? 'version-completed' : 'version-incompleted',
"version-#{status}"
].join(' ')
end
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
Toshi MARUYAMA
use lambda form in Version model scope (#12499)...
r12211 scope :sorted, lambda { order(fields_for_order_statement) }
Jean-Philippe Lang
Sort issues by scheduled versions first then unscheduled versions....
r9968
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
Restores commits reverted when rails-4.1 branch was merged (#18174)....
r13122 # Returns true if the version is shared, otherwise false
def shared?
sharing != 'none'
end
Jean-Philippe Lang
Disallow users to delete a version referenced by a custom field (#20159)....
r13994 def deletable?
fixed_issues.empty? && !referenced_by_a_custom_field?
end
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
Toshi MARUYAMA
Rails4 compatibility of version group count...
r12190 fixed_issues.group(:status).count.each do |status, count|
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 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
Toshi MARUYAMA
fix typos of source comments at Version model...
r12787 # Used to weight unestimated issues in progress calculation
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 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
Disallow users to delete a version referenced by a custom field (#20159)....
r13994
def referenced_by_a_custom_field?
CustomValue.joins(:custom_field).
where(:value => id.to_s, :custom_fields => {:field_format => 'version'}).any?
end
Jean-Philippe Lang
Default target version for new issues (#1828)....
r14404
def nullify_projects_default_version
Project.where(:default_version_id => id).update_all(:default_version_id => nil)
end
Jean-Philippe Lang
Initial commit...
r2 end