Feature #3007 » enumeration-sti-3.patch
| app/controllers/documents_controller.rb | ||
|---|---|---|
| 54 | 54 |
end |
| 55 | 55 |
|
| 56 | 56 |
def edit |
| 57 |
@categories = Enumeration.document_categories
|
|
| 57 |
@categories = DocumentCategory.all
|
|
| 58 | 58 |
if request.post? and @document.update_attributes(params[:document]) |
| 59 | 59 |
flash[:notice] = l(:notice_successful_update) |
| 60 | 60 |
redirect_to :action => 'show', :id => @document |
| app/controllers/enumerations_controller.rb | ||
|---|---|---|
| 31 | 31 |
end |
| 32 | 32 | |
| 33 | 33 |
def new |
| 34 |
@enumeration = Enumeration.new(:opt => params[:opt]) |
|
| 34 |
begin |
|
| 35 |
@enumeration = params[:type].constantize.new |
|
| 36 |
rescue NameError |
|
| 37 |
@enumeration = Enumeration.new |
|
| 38 |
end |
|
| 35 | 39 |
end |
| 36 | 40 | |
| 37 | 41 |
def create |
| 38 | 42 |
@enumeration = Enumeration.new(params[:enumeration]) |
| 43 |
@enumeration.type = params[:enumeration][:type] |
|
| 39 | 44 |
if @enumeration.save |
| 40 | 45 |
flash[:notice] = l(:notice_successful_create) |
| 41 |
redirect_to :action => 'list', :opt => @enumeration.opt
|
|
| 46 |
redirect_to :action => 'list', :type => @enumeration.type
|
|
| 42 | 47 |
else |
| 43 | 48 |
render :action => 'new' |
| 44 | 49 |
end |
| ... | ... | |
| 50 | 55 | |
| 51 | 56 |
def update |
| 52 | 57 |
@enumeration = Enumeration.find(params[:id]) |
| 58 |
@enumeration.type = params[:enumeration][:type] |
|
| 53 | 59 |
if @enumeration.update_attributes(params[:enumeration]) |
| 54 | 60 |
flash[:notice] = l(:notice_successful_update) |
| 55 |
redirect_to :action => 'list', :opt => @enumeration.opt
|
|
| 61 |
redirect_to :action => 'list', :type => @enumeration.type
|
|
| 56 | 62 |
else |
| 57 | 63 |
render :action => 'edit' |
| 58 | 64 |
end |
| ... | ... | |
| 65 | 71 |
@enumeration.destroy |
| 66 | 72 |
redirect_to :action => 'index' |
| 67 | 73 |
elsif params[:reassign_to_id] |
| 68 |
if reassign_to = Enumeration.find_by_opt_and_id(@enumeration.opt, params[:reassign_to_id])
|
|
| 74 |
if reassign_to = Enumeration.find_by_type_and_id(@enumeration.type, params[:reassign_to_id])
|
|
| 69 | 75 |
@enumeration.destroy(reassign_to) |
| 70 | 76 |
redirect_to :action => 'index' |
| 71 | 77 |
end |
| 72 | 78 |
end |
| 73 |
@enumerations = Enumeration.values(@enumeration.opt) - [@enumeration]
|
|
| 79 |
@enumerations = Enumeration.find(:all, :conditions => ['type = (?)', @enumeration.type]) - [@enumeration]
|
|
| 74 | 80 |
#rescue |
| 75 | 81 |
# flash[:error] = 'Unable to delete enumeration' |
| 76 | 82 |
# redirect_to :action => 'index' |
| app/controllers/issues_controller.rb | ||
|---|---|---|
| 102 | 102 |
@changesets.reverse! if User.current.wants_comments_in_reverse_order? |
| 103 | 103 |
@allowed_statuses = @issue.new_statuses_allowed_to(User.current) |
| 104 | 104 |
@edit_allowed = User.current.allowed_to?(:edit_issues, @project) |
| 105 |
@priorities = Enumeration.priorities
|
|
| 105 |
@priorities = IssuePriority.all
|
|
| 106 | 106 |
@time_entry = TimeEntry.new |
| 107 | 107 |
respond_to do |format| |
| 108 | 108 |
format.html { render :template => 'issues/show.rhtml' }
|
| ... | ... | |
| 153 | 153 |
return |
| 154 | 154 |
end |
| 155 | 155 |
end |
| 156 |
@priorities = Enumeration.priorities
|
|
| 156 |
@priorities = IssuePriority.all
|
|
| 157 | 157 |
render :layout => !request.xhr? |
| 158 | 158 |
end |
| 159 | 159 |
|
| ... | ... | |
| 163 | 163 |
|
| 164 | 164 |
def edit |
| 165 | 165 |
@allowed_statuses = @issue.new_statuses_allowed_to(User.current) |
| 166 |
@priorities = Enumeration.priorities
|
|
| 166 |
@priorities = IssuePriority.all
|
|
| 167 | 167 |
@edit_allowed = User.current.allowed_to?(:edit_issues, @project) |
| 168 | 168 |
@time_entry = TimeEntry.new |
| 169 | 169 |
|
| ... | ... | |
| 228 | 228 |
def bulk_edit |
| 229 | 229 |
if request.post? |
| 230 | 230 |
status = params[:status_id].blank? ? nil : IssueStatus.find_by_id(params[:status_id]) |
| 231 |
priority = params[:priority_id].blank? ? nil : Enumeration.find_by_id(params[:priority_id])
|
|
| 231 |
priority = params[:priority_id].blank? ? nil : IssuePriority.find_by_id(params[:priority_id])
|
|
| 232 | 232 |
assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : User.find_by_id(params[:assigned_to_id]) |
| 233 | 233 |
category = (params[:category_id].blank? || params[:category_id] == 'none') ? nil : @project.issue_categories.find_by_id(params[:category_id]) |
| 234 | 234 |
fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.versions.find_by_id(params[:fixed_version_id]) |
| ... | ... | |
| 407 | 407 |
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to) |
| 408 | 408 |
end |
| 409 | 409 |
|
| 410 |
@priorities = Enumeration.priorities.reverse
|
|
| 410 |
@priorities = IssuePriority.all.reverse
|
|
| 411 | 411 |
@statuses = IssueStatus.find(:all, :order => 'position') |
| 412 | 412 |
@back = request.env['HTTP_REFERER'] |
| 413 | 413 |
|
| app/controllers/reports_controller.rb | ||
|---|---|---|
| 37 | 37 |
render :template => "reports/issue_report_details" |
| 38 | 38 |
when "priority" |
| 39 | 39 |
@field = "priority_id" |
| 40 |
@rows = Enumeration.priorities
|
|
| 40 |
@rows = IssuePriority.all
|
|
| 41 | 41 |
@data = issues_by_priority |
| 42 | 42 |
@report_title = l(:field_priority) |
| 43 | 43 |
render :template => "reports/issue_report_details" |
| ... | ... | |
| 68 | 68 |
else |
| 69 | 69 |
@trackers = @project.trackers |
| 70 | 70 |
@versions = @project.versions.sort |
| 71 |
@priorities = Enumeration.priorities
|
|
| 71 |
@priorities = IssuePriority.all
|
|
| 72 | 72 |
@categories = @project.issue_categories |
| 73 | 73 |
@assignees = @project.members.collect { |m| m.user }
|
| 74 | 74 |
@authors = @project.members.collect { |m| m.user }
|
| ... | ... | |
| 130 | 130 |
p.id as priority_id, |
| 131 | 131 |
count(i.id) as total |
| 132 | 132 |
from |
| 133 |
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{Enumeration.table_name} p
|
|
| 133 |
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{IssuePriority.table_name} p
|
|
| 134 | 134 |
where |
| 135 | 135 |
i.status_id=s.id |
| 136 | 136 |
and i.priority_id=p.id |
| app/controllers/timelog_controller.rb | ||
|---|---|---|
| 46 | 46 |
:klass => Tracker, |
| 47 | 47 |
:label => :label_tracker}, |
| 48 | 48 |
'activity' => {:sql => "#{TimeEntry.table_name}.activity_id",
|
| 49 |
:klass => Enumeration,
|
|
| 49 |
:klass => TimeEntryActivity,
|
|
| 50 | 50 |
:label => :label_activity}, |
| 51 | 51 |
'issue' => {:sql => "#{TimeEntry.table_name}.issue_id",
|
| 52 | 52 |
:klass => Issue, |
| app/helpers/issues_helper.rb | ||
|---|---|---|
| 78 | 78 |
u = User.find_by_id(detail.value) and value = u.name if detail.value |
| 79 | 79 |
u = User.find_by_id(detail.old_value) and old_value = u.name if detail.old_value |
| 80 | 80 |
when 'priority_id' |
| 81 |
e = Enumeration.find_by_id(detail.value) and value = e.name if detail.value
|
|
| 82 |
e = Enumeration.find_by_id(detail.old_value) and old_value = e.name if detail.old_value
|
|
| 81 |
e = IssuePriority.find_by_id(detail.value) and value = e.name if detail.value
|
|
| 82 |
e = IssuePriority.find_by_id(detail.old_value) and old_value = e.name if detail.old_value
|
|
| 83 | 83 |
when 'category_id' |
| 84 | 84 |
c = IssueCategory.find_by_id(detail.value) and value = c.name if detail.value |
| 85 | 85 |
c = IssueCategory.find_by_id(detail.old_value) and old_value = c.name if detail.old_value |
| app/helpers/timelog_helper.rb | ||
|---|---|---|
| 27 | 27 |
end |
| 28 | 28 |
|
| 29 | 29 |
def activity_collection_for_select_options |
| 30 |
activities = Enumeration.activities
|
|
| 30 |
activities = TimeEntryActivity.all
|
|
| 31 | 31 |
collection = [] |
| 32 | 32 |
collection << [ "--- #{l(:actionview_instancetag_blank_option)} ---", '' ] unless activities.detect(&:is_default)
|
| 33 | 33 |
activities.each { |a| collection << [a.name, a.id] }
|
| app/models/document.rb | ||
|---|---|---|
| 17 | 17 | |
| 18 | 18 |
class Document < ActiveRecord::Base |
| 19 | 19 |
belongs_to :project |
| 20 |
belongs_to :category, :class_name => "Enumeration", :foreign_key => "category_id"
|
|
| 20 |
belongs_to :category, :class_name => "DocumentCategory", :foreign_key => "category_id"
|
|
| 21 | 21 |
acts_as_attachable :delete_permission => :manage_documents |
| 22 | 22 | |
| 23 | 23 |
acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
|
| ... | ... | |
| 31 | 31 |
|
| 32 | 32 |
def after_initialize |
| 33 | 33 |
if new_record? |
| 34 |
self.category ||= Enumeration.document_categories.default
|
|
| 34 |
self.category ||= DocumentCategory.default
|
|
| 35 | 35 |
end |
| 36 | 36 |
end |
| 37 | 37 |
end |
| app/models/document_category.rb | ||
|---|---|---|
| 1 |
# redMine - project management software |
|
| 2 |
# Copyright (C) 2006 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
class DocumentCategory < Enumeration |
|
| 19 |
has_many :documents, :foreign_key => 'category_id' |
|
| 20 | ||
| 21 |
OptionName = :enumeration_doc_categories |
|
| 22 |
# Backwards compatiblity. Can be removed post-0.9 |
|
| 23 |
OptName = 'DCAT' |
|
| 24 | ||
| 25 |
def option_name |
|
| 26 |
OptionName |
|
| 27 |
end |
|
| 28 | ||
| 29 |
def objects_count |
|
| 30 |
documents.count |
|
| 31 |
end |
|
| 32 | ||
| 33 |
def transfer_relations(to) |
|
| 34 |
documents.update_all("category_id = #{to.id}")
|
|
| 35 |
end |
|
| 36 |
end |
|
| app/models/enumeration.rb | ||
|---|---|---|
| 16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 17 | 17 | |
| 18 | 18 |
class Enumeration < ActiveRecord::Base |
| 19 |
acts_as_list :scope => 'opt = \'#{opt}\''
|
|
| 19 |
acts_as_list :scope => 'type = \'#{type}\''
|
|
| 20 | 20 | |
| 21 | 21 |
before_destroy :check_integrity |
| 22 | 22 |
|
| 23 |
validates_presence_of :opt, :name
|
|
| 24 |
validates_uniqueness_of :name, :scope => [:opt]
|
|
| 23 |
validates_presence_of :name |
|
| 24 |
validates_uniqueness_of :name, :scope => [:type]
|
|
| 25 | 25 |
validates_length_of :name, :maximum => 30 |
| 26 | ||
| 27 |
# Single table inheritance would be an option |
|
| 28 |
OPTIONS = {
|
|
| 29 |
"IPRI" => {:label => :enumeration_issue_priorities, :model => Issue, :foreign_key => :priority_id, :scope => :priorities},
|
|
| 30 |
"DCAT" => {:label => :enumeration_doc_categories, :model => Document, :foreign_key => :category_id, :scope => :document_categories},
|
|
| 31 |
"ACTI" => {:label => :enumeration_activities, :model => TimeEntry, :foreign_key => :activity_id, :scope => :activities}
|
|
| 32 |
}.freeze |
|
| 33 | 26 |
|
| 34 |
# Creates a named scope for each type of value. The scope has a +default+ method |
|
| 35 |
# that returns the default value, or nil if no value is set as default. |
|
| 36 |
# Example: |
|
| 37 |
# Enumeration.priorities |
|
| 38 |
# Enumeration.priorities.default |
|
| 39 |
OPTIONS.each do |k, v| |
|
| 40 |
next unless v[:scope] |
|
| 41 |
named_scope v[:scope], :conditions => { :opt => k }, :order => 'position' do
|
|
| 42 |
def default |
|
| 43 |
find(:first, :conditions => { :is_default => true })
|
|
| 44 |
end |
|
| 27 |
# Backwards compatiblity named_scopes. |
|
| 28 |
# Can be removed post-0.9 |
|
| 29 |
named_scope :priorities, :conditions => { :type => "IssuePriority" }, :order => 'position' do
|
|
| 30 |
ActiveSupport::Deprecation.warn("Enumeration#priorities is deprecated, use the IssuePriority class. (#{Redmine::Info.issue(3007)})")
|
|
| 31 |
def default |
|
| 32 |
find(:first, :conditions => { :is_default => true })
|
|
| 33 |
end |
|
| 34 |
end |
|
| 35 | ||
| 36 |
named_scope :document_categories, :conditions => { :type => "DocumentCategory" }, :order => 'position' do
|
|
| 37 |
ActiveSupport::Deprecation.warn("Enumeration#document_categories is deprecated, use the DocumentCategories class. (#{Redmine::Info.issue(3007)})")
|
|
| 38 |
def default |
|
| 39 |
find(:first, :conditions => { :is_default => true })
|
|
| 40 |
end |
|
| 41 |
end |
|
| 42 | ||
| 43 |
named_scope :activities, :conditions => { :type => "TimeEntryActivity" }, :order => 'position' do
|
|
| 44 |
ActiveSupport::Deprecation.warn("Enumeration#activities is deprecated, use the TimeEntryActivity class. (#{Redmine::Info.issue(3007)})")
|
|
| 45 |
def default |
|
| 46 |
find(:first, :conditions => { :is_default => true })
|
|
| 45 | 47 |
end |
| 46 | 48 |
end |
| 47 | 49 |
|
| 48 |
named_scope :values, lambda {|opt| { :conditions => { :opt => opt }, :order => 'position' } } do
|
|
| 50 |
named_scope :values, lambda {|type| { :conditions => { :type => type }, :order => 'position' } } do
|
|
| 49 | 51 |
def default |
| 50 | 52 |
find(:first, :conditions => { :is_default => true })
|
| 51 | 53 |
end |
| 52 | 54 |
end |
| 53 | 55 | |
| 56 |
named_scope :all, :order => 'position' |
|
| 57 | ||
| 58 |
def self.default |
|
| 59 |
# Creates a fake default scope so Enumeration.default will check |
|
| 60 |
# it's type. STI subclasses will automatically add their own |
|
| 61 |
# types to the finder. |
|
| 62 |
if self.descends_from_active_record? |
|
| 63 |
find(:first, :conditions => { :is_default => true, :type => 'Enumeration' })
|
|
| 64 |
else |
|
| 65 |
# STI classes are |
|
| 66 |
find(:first, :conditions => { :is_default => true })
|
|
| 67 |
end |
|
| 68 |
end |
|
| 69 |
|
|
| 70 |
# Overloaded on concrete classes |
|
| 54 | 71 |
def option_name |
| 55 |
OPTIONS[self.opt][:label] |
|
| 72 |
nil |
|
| 73 |
end |
|
| 74 | ||
| 75 |
# Backwards compatiblity. Can be removed post-0.9 |
|
| 76 |
def opt |
|
| 77 |
ActiveSupport::Deprecation.warn("Enumeration#opt is deprecated, use the STI classes now. (#{Redmine::Info.issue(3007)})")
|
|
| 78 |
return OptName |
|
| 56 | 79 |
end |
| 57 | 80 | |
| 58 | 81 |
def before_save |
| 59 | 82 |
if is_default? && is_default_changed? |
| 60 |
Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt})
|
|
| 83 |
Enumeration.update_all("is_default = #{connection.quoted_false}", {:type => type})
|
|
| 61 | 84 |
end |
| 62 | 85 |
end |
| 63 | 86 |
|
| 87 |
# Overloaded on concrete classes |
|
| 64 | 88 |
def objects_count |
| 65 |
OPTIONS[self.opt][:model].count(:conditions => "#{OPTIONS[self.opt][:foreign_key]} = #{id}")
|
|
| 89 |
0
|
|
| 66 | 90 |
end |
| 67 | 91 |
|
| 68 | 92 |
def in_use? |
| ... | ... | |
| 75 | 99 |
# If a enumeration is specified, objects are reassigned |
| 76 | 100 |
def destroy(reassign_to = nil) |
| 77 | 101 |
if reassign_to && reassign_to.is_a?(Enumeration) |
| 78 |
OPTIONS[self.opt][:model].update_all("#{OPTIONS[self.opt][:foreign_key]} = #{reassign_to.id}", "#{OPTIONS[self.opt][:foreign_key]} = #{id}")
|
|
| 102 |
self.transfer_relations(reassign_to)
|
|
| 79 | 103 |
end |
| 80 | 104 |
destroy_without_reassign |
| 81 | 105 |
end |
| ... | ... | |
| 85 | 109 |
end |
| 86 | 110 |
|
| 87 | 111 |
def to_s; name end |
| 112 | ||
| 113 |
# Returns the Subclasses of Enumeration. Each Subclass needs to be |
|
| 114 |
# required in development mode. |
|
| 115 |
# |
|
| 116 |
# Note: subclasses is protected in ActiveRecord |
|
| 117 |
def self.get_subclasses |
|
| 118 |
@@subclasses[Enumeration] |
|
| 119 |
end |
|
| 88 | 120 |
|
| 89 | 121 |
private |
| 90 | 122 |
def check_integrity |
| 91 | 123 |
raise "Can't delete enumeration" if self.in_use? |
| 92 | 124 |
end |
| 125 | ||
| 93 | 126 |
end |
| 127 | ||
| 128 |
# Force load the subclasses in development mode |
|
| 129 |
require_dependency 'time_entry_activity' |
|
| 130 |
require_dependency 'document_category' |
|
| 131 |
require_dependency 'issue_priority' |
|
| app/models/issue.rb | ||
|---|---|---|
| 22 | 22 |
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' |
| 23 | 23 |
belongs_to :assigned_to, :class_name => 'User', :foreign_key => 'assigned_to_id' |
| 24 | 24 |
belongs_to :fixed_version, :class_name => 'Version', :foreign_key => 'fixed_version_id' |
| 25 |
belongs_to :priority, :class_name => 'Enumeration', :foreign_key => 'priority_id'
|
|
| 25 |
belongs_to :priority, :class_name => 'IssuePriority', :foreign_key => 'priority_id'
|
|
| 26 | 26 |
belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id' |
| 27 | 27 | |
| 28 | 28 |
has_many :journals, :as => :journalized, :dependent => :destroy |
| ... | ... | |
| 65 | 65 |
if new_record? |
| 66 | 66 |
# set default values for new records only |
| 67 | 67 |
self.status ||= IssueStatus.default |
| 68 |
self.priority ||= Enumeration.priorities.default
|
|
| 68 |
self.priority ||= IssuePriority.default
|
|
| 69 | 69 |
end |
| 70 | 70 |
end |
| 71 | 71 |
|
| app/models/issue_priority.rb | ||
|---|---|---|
| 1 |
# redMine - project management software |
|
| 2 |
# Copyright (C) 2006 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
class IssuePriority < Enumeration |
|
| 19 |
has_many :issues, :foreign_key => 'priority_id' |
|
| 20 | ||
| 21 |
OptionName = :enumeration_issue_priorities |
|
| 22 |
# Backwards compatiblity. Can be removed post-0.9 |
|
| 23 |
OptName = 'IPRI' |
|
| 24 | ||
| 25 |
def option_name |
|
| 26 |
OptionName |
|
| 27 |
end |
|
| 28 | ||
| 29 |
def objects_count |
|
| 30 |
issues.count |
|
| 31 |
end |
|
| 32 | ||
| 33 |
def transfer_relations(to) |
|
| 34 |
issues.update_all("priority_id = #{to.id}")
|
|
| 35 |
end |
|
| 36 |
end |
|
| app/models/mail_handler.rb | ||
|---|---|---|
| 91 | 91 |
project = target_project |
| 92 | 92 |
tracker = (get_keyword(:tracker) && project.trackers.find_by_name(get_keyword(:tracker))) || project.trackers.find(:first) |
| 93 | 93 |
category = (get_keyword(:category) && project.issue_categories.find_by_name(get_keyword(:category))) |
| 94 |
priority = (get_keyword(:priority) && Enumeration.find_by_opt_and_name('IPRI', get_keyword(:priority)))
|
|
| 94 |
priority = (get_keyword(:priority) && IssuePriority.find_by_name(get_keyword(:priority)))
|
|
| 95 | 95 |
status = (get_keyword(:status) && IssueStatus.find_by_name(get_keyword(:status))) |
| 96 | 96 | |
| 97 | 97 |
# check permission |
| app/models/query.rb | ||
|---|---|---|
| 101 | 101 |
QueryColumn.new(:project, :sortable => "#{Project.table_name}.name"),
|
| 102 | 102 |
QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position"),
|
| 103 | 103 |
QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position"),
|
| 104 |
QueryColumn.new(:priority, :sortable => "#{Enumeration.table_name}.position", :default_order => 'desc'),
|
|
| 104 |
QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc'),
|
|
| 105 | 105 |
QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"),
|
| 106 | 106 |
QueryColumn.new(:author), |
| 107 | 107 |
QueryColumn.new(:assigned_to, :sortable => ["#{User.table_name}.lastname", "#{User.table_name}.firstname"]),
|
| ... | ... | |
| 151 | 151 |
|
| 152 | 152 |
@available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } },
|
| 153 | 153 |
"tracker_id" => { :type => :list, :order => 2, :values => trackers.collect{|s| [s.name, s.id.to_s] } },
|
| 154 |
"priority_id" => { :type => :list, :order => 3, :values => Enumeration.find(:all, :conditions => ['opt=?','IPRI'], :order => 'position').collect{|s| [s.name, s.id.to_s] } },
|
|
| 154 |
"priority_id" => { :type => :list, :order => 3, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] } },
|
|
| 155 | 155 |
"subject" => { :type => :text, :order => 8 },
|
| 156 | 156 |
"created_on" => { :type => :date_past, :order => 9 },
|
| 157 | 157 |
"updated_on" => { :type => :date_past, :order => 10 },
|
| app/models/time_entry.rb | ||
|---|---|---|
| 21 | 21 |
belongs_to :project |
| 22 | 22 |
belongs_to :issue |
| 23 | 23 |
belongs_to :user |
| 24 |
belongs_to :activity, :class_name => 'Enumeration', :foreign_key => :activity_id
|
|
| 24 |
belongs_to :activity, :class_name => 'TimeEntryActivity', :foreign_key => 'activity_id'
|
|
| 25 | 25 |
|
| 26 | 26 |
attr_protected :project_id, :user_id, :tyear, :tmonth, :tweek |
| 27 | 27 | |
| ... | ... | |
| 37 | 37 | |
| 38 | 38 |
def after_initialize |
| 39 | 39 |
if new_record? && self.activity.nil? |
| 40 |
if default_activity = Enumeration.activities.default
|
|
| 40 |
if default_activity = TimeEntryActivity.default
|
|
| 41 | 41 |
self.activity_id = default_activity.id |
| 42 | 42 |
end |
| 43 | 43 |
end |
| app/models/time_entry_activity.rb | ||
|---|---|---|
| 1 |
# redMine - project management software |
|
| 2 |
# Copyright (C) 2006 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
class TimeEntryActivity < Enumeration |
|
| 19 |
has_many :time_entries, :foreign_key => 'activity_id' |
|
| 20 | ||
| 21 |
OptionName = :enumeration_activities |
|
| 22 |
# Backwards compatiblity. Can be removed post-0.9 |
|
| 23 |
OptName = 'ACTI' |
|
| 24 |
|
|
| 25 |
def option_name |
|
| 26 |
OptionName |
|
| 27 |
end |
|
| 28 | ||
| 29 |
def objects_count |
|
| 30 |
time_entries.count |
|
| 31 |
end |
|
| 32 | ||
| 33 |
def transfer_relations(to) |
|
| 34 |
time_entries.update_all("activity_id = #{to.id}")
|
|
| 35 |
end |
|
| 36 |
end |
|
| app/views/documents/_form.rhtml | ||
|---|---|---|
| 2 | 2 |
<div class="box"> |
| 3 | 3 |
<!--[form:document]--> |
| 4 | 4 |
<p><label for="document_category_id"><%=l(:field_category)%></label> |
| 5 |
<%= select('document', 'category_id', Enumeration.document_categories.collect {|c| [c.name, c.id]}) %></p>
|
|
| 5 |
<%= select('document', 'category_id', DocumentCategory.all.collect {|c| [c.name, c.id]}) %></p>
|
|
| 6 | 6 | |
| 7 | 7 |
<p><label for="document_title"><%=l(:field_title)%> <span class="required">*</span></label> |
| 8 | 8 |
<%= text_field 'document', 'title', :size => 60 %></p> |
| app/views/enumerations/_form.rhtml | ||
|---|---|---|
| 1 | 1 |
<%= error_messages_for 'enumeration' %> |
| 2 | 2 |
<div class="box"> |
| 3 | 3 |
<!--[form:optvalue]--> |
| 4 |
<%= hidden_field 'enumeration', 'opt' %>
|
|
| 4 |
<%= hidden_field 'enumeration', 'type' %>
|
|
| 5 | 5 | |
| 6 | 6 |
<p><label for="enumeration_name"><%=l(:field_name)%></label> |
| 7 | 7 |
<%= text_field 'enumeration', 'name' %></p> |
| app/views/enumerations/list.rhtml | ||
|---|---|---|
| 1 | 1 |
<h2><%=l(:label_enumerations)%></h2> |
| 2 | 2 | |
| 3 |
<% Enumeration::OPTIONS.each do |option, params| %>
|
|
| 4 |
<h3><%= l(params[:label]) %></h3>
|
|
| 3 |
<% Enumeration.get_subclasses.each do |klass| %>
|
|
| 4 |
<h3><%= l(klass::OptionName) %></h3>
|
|
| 5 | 5 | |
| 6 |
<% enumerations = Enumeration.values(option) %>
|
|
| 6 |
<% enumerations = klass.all %>
|
|
| 7 | 7 |
<% if enumerations.any? %> |
| 8 | 8 |
<table class="list"> |
| 9 | 9 |
<% enumerations.each do |enumeration| %> |
| ... | ... | |
| 20 | 20 |
<% reset_cycle %> |
| 21 | 21 |
<% end %> |
| 22 | 22 | |
| 23 |
<p><%= link_to l(:label_enumeration_new), { :action => 'new', :opt => option } %></p>
|
|
| 23 |
<p><%= link_to l(:label_enumeration_new), { :action => 'new', :type => klass.name } %></p>
|
|
| 24 | 24 |
<% end %> |
| 25 | 25 | |
| 26 | 26 |
<% html_title(l(:label_enumerations)) -%> |
| app/views/issues/bulk_edit.rhtml | ||
|---|---|---|
| 13 | 13 |
<%= select_tag('status_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %></label>
|
| 14 | 14 |
<% end %> |
| 15 | 15 |
<label><%= l(:field_priority) %>: |
| 16 |
<%= select_tag('priority_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(Enumeration.priorities, :id, :name)) %></label>
|
|
| 16 |
<%= select_tag('priority_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(IssuePriority.all, :id, :name)) %></label>
|
|
| 17 | 17 |
<label><%= l(:field_category) %>: |
| 18 | 18 |
<%= select_tag('category_id', content_tag('option', l(:label_no_change_option), :value => '') +
|
| 19 | 19 |
content_tag('option', l(:label_none), :value => 'none') +
|
| app/views/my/blocks/_issuesassignedtome.rhtml | ||
|---|---|---|
| 4 | 4 |
:conditions => {:assigned_to_id => User.current.id},
|
| 5 | 5 |
:limit => 10, |
| 6 | 6 |
:include => [ :status, :project, :tracker, :priority ], |
| 7 |
:order => "#{Enumeration.table_name}.position DESC, #{Issue.table_name}.updated_on DESC") %>
|
|
| 7 |
:order => "#{IssuePriority.table_name}.position DESC, #{Issue.table_name}.updated_on DESC") %>
|
|
| 8 | 8 |
<%= render :partial => 'issues/list_simple', :locals => { :issues => assigned_issues } %>
|
| 9 | 9 |
<% if assigned_issues.length > 0 %> |
| 10 | 10 |
<p class="small"><%= link_to l(:label_issue_view_all), :controller => 'issues', |
| db/migrate/20090323224724_add_type_to_enumerations.rb | ||
|---|---|---|
| 1 |
class AddTypeToEnumerations < ActiveRecord::Migration |
|
| 2 |
def self.up |
|
| 3 |
add_column :enumerations, :type, :string |
|
| 4 |
end |
|
| 5 | ||
| 6 |
def self.down |
|
| 7 |
remove_column :enumerations, :type |
|
| 8 |
end |
|
| 9 |
end |
|
| db/migrate/20090401221305_update_enumerations_to_sti.rb | ||
|---|---|---|
| 1 |
class UpdateEnumerationsToSti < ActiveRecord::Migration |
|
| 2 |
def self.up |
|
| 3 |
Enumeration.update_all("type = 'IssuePriority'", "opt = 'IPRI'")
|
|
| 4 |
Enumeration.update_all("type = 'DocumentCategory'", "opt = 'DCAT'")
|
|
| 5 |
Enumeration.update_all("type = 'TimeEntryActivity'", "opt = 'ACTI'")
|
|
| 6 |
end |
|
| 7 | ||
| 8 |
def self.down |
|
| 9 |
# no-op |
|
| 10 |
end |
|
| 11 |
end |
|
| lib/redmine/info.rb | ||
|---|---|---|
| 5 | 5 |
def url; 'http://www.redmine.org/' end |
| 6 | 6 |
def help_url; 'http://www.redmine.org/guide' end |
| 7 | 7 |
def versioned_name; "#{app_name} #{Redmine::VERSION}" end
|
| 8 | ||
| 9 |
# Creates the url string to a specific Redmine issue |
|
| 10 |
def issue(issue_id) |
|
| 11 |
url + 'issues/' + issue_id.to_s |
|
| 12 |
end |
|
| 8 | 13 |
end |
| 9 | 14 |
end |
| 10 | 15 |
end |
| test/fixtures/enumerations.yml | ||
|---|---|---|
| 3 | 3 |
name: Uncategorized |
| 4 | 4 |
id: 1 |
| 5 | 5 |
opt: DCAT |
| 6 |
type: DocumentCategory |
|
| 6 | 7 |
enumerations_002: |
| 7 | 8 |
name: User documentation |
| 8 | 9 |
id: 2 |
| 9 | 10 |
opt: DCAT |
| 11 |
type: DocumentCategory |
|
| 10 | 12 |
enumerations_003: |
| 11 | 13 |
name: Technical documentation |
| 12 | 14 |
id: 3 |
| 13 | 15 |
opt: DCAT |
| 16 |
type: DocumentCategory |
|
| 14 | 17 |
enumerations_004: |
| 15 | 18 |
name: Low |
| 16 | 19 |
id: 4 |
| 17 | 20 |
opt: IPRI |
| 21 |
type: IssuePriority |
|
| 18 | 22 |
enumerations_005: |
| 19 | 23 |
name: Normal |
| 20 | 24 |
id: 5 |
| 21 | 25 |
opt: IPRI |
| 26 |
type: IssuePriority |
|
| 22 | 27 |
is_default: true |
| 23 | 28 |
enumerations_006: |
| 24 | 29 |
name: High |
| 25 | 30 |
id: 6 |
| 26 | 31 |
opt: IPRI |
| 32 |
type: IssuePriority |
|
| 27 | 33 |
enumerations_007: |
| 28 | 34 |
name: Urgent |
| 29 | 35 |
id: 7 |
| 30 | 36 |
opt: IPRI |
| 37 |
type: IssuePriority |
|
| 31 | 38 |
enumerations_008: |
| 32 | 39 |
name: Immediate |
| 33 | 40 |
id: 8 |
| 34 | 41 |
opt: IPRI |
| 42 |
type: IssuePriority |
|
| 35 | 43 |
enumerations_009: |
| 36 | 44 |
name: Design |
| 37 | 45 |
id: 9 |
| 38 | 46 |
opt: ACTI |
| 47 |
type: TimeEntryActivity |
|
| 39 | 48 |
enumerations_010: |
| 40 | 49 |
name: Development |
| 41 | 50 |
id: 10 |
| 42 | 51 |
opt: ACTI |
| 52 |
type: TimeEntryActivity |
|
| 43 | 53 |
is_default: true |
| 44 | 54 |
enumerations_011: |
| 45 | 55 |
name: QA |
| 46 | 56 |
id: 11 |
| 47 | 57 |
opt: ACTI |
| 48 |
|
|
| 58 |
type: TimeEntryActivity |
|
| 59 |
enumerations_012: |
|
| 60 |
name: Default Enumeration |
|
| 61 |
id: 12 |
|
| 62 |
opt: '' |
|
| 63 |
type: Enumeration |
|
| 64 |
is_default: true |
|
| 65 |
enumerations_013: |
|
| 66 |
name: Another Enumeration |
|
| 67 |
id: 13 |
|
| 68 |
opt: '' |
|
| 69 |
type: Enumeration |
|
| test/fixtures/issues.yml | ||
|---|---|---|
| 95 | 95 |
created_on: <%= 10.days.ago.to_date.to_s(:db) %> |
| 96 | 96 |
project_id: 1 |
| 97 | 97 |
updated_on: <%= 10.days.ago.to_date.to_s(:db) %> |
| 98 |
priority_id: 3
|
|
| 98 |
priority_id: 5
|
|
| 99 | 99 |
subject: Issue due today |
| 100 | 100 |
id: 7 |
| 101 | 101 |
fixed_version_id: |
| ... | ... | |
| 112 | 112 |
created_on: <%= 10.days.ago.to_date.to_s(:db) %> |
| 113 | 113 |
project_id: 1 |
| 114 | 114 |
updated_on: <%= 10.days.ago.to_date.to_s(:db) %> |
| 115 |
priority_id: 3
|
|
| 115 |
priority_id: 5
|
|
| 116 | 116 |
subject: Closed issue |
| 117 | 117 |
id: 8 |
| 118 | 118 |
fixed_version_id: |
| test/functional/issues_controller_test.rb | ||
|---|---|---|
| 670 | 670 |
:id => 1, |
| 671 | 671 |
:issue => { :status_id => 2, :assigned_to_id => 3 },
|
| 672 | 672 |
:notes => 'Assigned to dlopper', |
| 673 |
:time_entry => { :hours => '', :comments => '', :activity_id => Enumeration.activities.first }
|
|
| 673 |
:time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
|
|
| 674 | 674 |
end |
| 675 | 675 |
assert_redirected_to :action => 'show', :id => '1' |
| 676 | 676 |
issue.reload |
| ... | ... | |
| 706 | 706 |
post :edit, |
| 707 | 707 |
:id => 1, |
| 708 | 708 |
:notes => '2.5 hours added', |
| 709 |
:time_entry => { :hours => '2.5', :comments => '', :activity_id => Enumeration.activities.first }
|
|
| 709 |
:time_entry => { :hours => '2.5', :comments => '', :activity_id => TimeEntryActivity.first }
|
|
| 710 | 710 |
end |
| 711 | 711 |
assert_redirected_to :action => 'show', :id => '1' |
| 712 | 712 |
|
| test/integration/issues_test.rb | ||
|---|---|---|
| 41 | 41 |
|
| 42 | 42 |
post 'projects/1/issues', :tracker_id => "1", |
| 43 | 43 |
:issue => { :start_date => "2006-12-26",
|
| 44 |
:priority_id => "3",
|
|
| 44 |
:priority_id => "4",
|
|
| 45 | 45 |
:subject => "new test issue", |
| 46 | 46 |
:category_id => "", |
| 47 | 47 |
:description => "new issue", |
| test/unit/document_category_test.rb | ||
|---|---|---|
| 1 |
# redMine - project management software |
|
| 2 |
# Copyright (C) 2006-2008 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
require File.dirname(__FILE__) + '/../test_helper' |
|
| 19 | ||
| 20 |
class DocumentCategoryTest < Test::Unit::TestCase |
|
| 21 |
fixtures :enumerations, :documents |
|
| 22 | ||
| 23 |
def test_should_be_an_enumeration |
|
| 24 |
assert DocumentCategory.ancestors.include?(Enumeration) |
|
| 25 |
end |
|
| 26 |
|
|
| 27 |
def test_objects_count |
|
| 28 |
assert_equal 1, DocumentCategory.find_by_name("Uncategorized").objects_count
|
|
| 29 |
assert_equal 0, DocumentCategory.find_by_name("User documentation").objects_count
|
|
| 30 |
end |
|
| 31 | ||
| 32 |
def test_option_name |
|
| 33 |
assert_equal :enumeration_doc_categories, DocumentCategory.new.option_name |
|
| 34 |
end |
|
| 35 |
end |
|
| 36 | ||
| test/unit/enumeration_test.rb | ||
|---|---|---|
| 38 | 38 |
end |
| 39 | 39 |
|
| 40 | 40 |
def test_default |
| 41 |
e = Enumeration.priorities.default
|
|
| 41 |
e = Enumeration.default |
|
| 42 | 42 |
assert e.is_a?(Enumeration) |
| 43 | 43 |
assert e.is_default? |
| 44 |
assert_equal 'Normal', e.name
|
|
| 44 |
assert_equal 'Default Enumeration', e.name
|
|
| 45 | 45 |
end |
| 46 | 46 |
|
| 47 | 47 |
def test_create |
| 48 |
e = Enumeration.new(:opt => 'IPRI', :name => 'Very urgent', :is_default => false) |
|
| 48 |
e = Enumeration.new(:name => 'Not default', :is_default => false) |
|
| 49 |
e.type = 'Enumeration' |
|
| 49 | 50 |
assert e.save |
| 50 |
assert_equal 'Normal', Enumeration.priorities.default.name
|
|
| 51 |
assert_equal 'Default Enumeration', Enumeration.default.name
|
|
| 51 | 52 |
end |
| 52 | 53 |
|
| 53 | 54 |
def test_create_as_default |
| 54 |
e = Enumeration.new(:opt => 'IPRI', :name => 'Very urgent', :is_default => true) |
|
| 55 |
e = Enumeration.new(:name => 'Very urgent', :is_default => true) |
|
| 56 |
e.type = 'Enumeration' |
|
| 55 | 57 |
assert e.save |
| 56 |
assert_equal e, Enumeration.priorities.default
|
|
| 58 |
assert_equal e, Enumeration.default |
|
| 57 | 59 |
end |
| 58 | 60 |
|
| 59 | 61 |
def test_update_default |
| 60 |
e = Enumeration.priorities.default
|
|
| 62 |
e = Enumeration.default |
|
| 61 | 63 |
e.update_attributes(:name => 'Changed', :is_default => true) |
| 62 |
assert_equal e, Enumeration.priorities.default
|
|
| 64 |
assert_equal e, Enumeration.default |
|
| 63 | 65 |
end |
| 64 | 66 |
|
| 65 | 67 |
def test_update_default_to_non_default |
| 66 |
e = Enumeration.priorities.default
|
|
| 68 |
e = Enumeration.default |
|
| 67 | 69 |
e.update_attributes(:name => 'Changed', :is_default => false) |
| 68 |
assert_nil Enumeration.priorities.default
|
|
| 70 |
assert_nil Enumeration.default |
|
| 69 | 71 |
end |
| 70 | 72 |
|
| 71 | 73 |
def test_change_default |
| 72 |
e = Enumeration.find_by_name('Urgent')
|
|
| 73 |
e.update_attributes(:name => 'Urgent', :is_default => true)
|
|
| 74 |
assert_equal e, Enumeration.priorities.default
|
|
| 74 |
e = Enumeration.find_by_name('Default Enumeration')
|
|
| 75 |
e.update_attributes(:name => 'Changed Enumeration', :is_default => true)
|
|
| 76 |
assert_equal e, Enumeration.default |
|
| 75 | 77 |
end |
| 76 | 78 |
|
| 77 | 79 |
def test_destroy_with_reassign |
| test/unit/issue_priority_test.rb | ||
|---|---|---|
| 1 |
# redMine - project management software |
|
| 2 |
# Copyright (C) 2006-2008 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
require File.dirname(__FILE__) + '/../test_helper' |
|
| 19 | ||
| 20 |
class IssuePriorityTest < Test::Unit::TestCase |
|
| 21 |
fixtures :enumerations, :issues |
|
| 22 | ||
| 23 |
def test_should_be_an_enumeration |
|
| 24 |
assert IssuePriority.ancestors.include?(Enumeration) |
|
| 25 |
end |
|
| 26 |
|
|
| 27 |
def test_objects_count |
|
| 28 |
# low priority |
|
| 29 |
assert_equal 5, IssuePriority.find(4).objects_count |
|
| 30 |
# urgent |
|
| 31 |
assert_equal 0, IssuePriority.find(7).objects_count |
|
| 32 |
end |
|
| 33 | ||
| 34 |
def test_option_name |
|
| 35 |
assert_equal :enumeration_issue_priorities, IssuePriority.new.option_name |
|
| 36 |
end |
|
| 37 |
end |
|
| 38 | ||
| test/unit/issue_test.rb | ||
|---|---|---|
| 27 | 27 |
:time_entries |
| 28 | 28 | |
| 29 | 29 |
def test_create |
| 30 |
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.priorities.first, :subject => 'test_create', :description => 'IssueTest#test_create', :estimated_hours => '1:30')
|
|
| 30 |
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'test_create', :description => 'IssueTest#test_create', :estimated_hours => '1:30')
|
|
| 31 | 31 |
assert issue.save |
| 32 | 32 |
issue.reload |
| 33 | 33 |
assert_equal 1.5, issue.estimated_hours |
| 34 | 34 |
end |
| 35 | 35 |
|
| 36 | 36 |
def test_create_minimal |
| 37 |
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.priorities.first, :subject => 'test_create')
|
|
| 37 |
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'test_create')
|
|
| 38 | 38 |
assert issue.save |
| 39 | 39 |
assert issue.description.nil? |
| 40 | 40 |
end |
| ... | ... | |
| 123 | 123 |
end |
| 124 | 124 |
|
| 125 | 125 |
def test_category_based_assignment |
| 126 |
issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.priorities.first, :subject => 'Assignment test', :description => 'Assignment test', :category_id => 1)
|
|
| 126 |
issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'Assignment test', :description => 'Assignment test', :category_id => 1)
|
|
| 127 | 127 |
assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to |
| 128 | 128 |
end |
| 129 | 129 |
|
| ... | ... | |
| 139 | 139 |
|
| 140 | 140 |
def test_should_close_duplicates |
| 141 | 141 |
# Create 3 issues |
| 142 |
issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => Enumeration.priorities.first, :subject => 'Duplicates test', :description => 'Duplicates test')
|
|
| 142 |
issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'Duplicates test', :description => 'Duplicates test')
|
|
| 143 | 143 |
assert issue1.save |
| 144 | 144 |
issue2 = issue1.clone |
| 145 | 145 |
assert issue2.save |
| ... | ... | |
| 166 | 166 |
|
| 167 | 167 |
def test_should_not_close_duplicated_issue |
| 168 | 168 |
# Create 3 issues |
| 169 |
issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => Enumeration.priorities.first, :subject => 'Duplicates test', :description => 'Duplicates test')
|
|
| 169 |
issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'Duplicates test', :description => 'Duplicates test')
|
|
| 170 | 170 |
assert issue1.save |
| 171 | 171 |
issue2 = issue1.clone |
| 172 | 172 |
assert issue2.save |
| test/unit/time_entry_activity_test.rb | ||
|---|---|---|
| 1 |
# redMine - project management software |
|
| 2 |
# Copyright (C) 2006-2008 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
require File.dirname(__FILE__) + '/../test_helper' |
|
| 19 | ||
| 20 |
class TimeEntryActivityTest < Test::Unit::TestCase |
|
| 21 |
fixtures :enumerations, :time_entries |
|
| 22 | ||
| 23 |
def test_should_be_an_enumeration |
|
| 24 |
assert TimeEntryActivity.ancestors.include?(Enumeration) |
|
| 25 |
end |
|
| 26 |
|
|
| 27 |
def test_objects_count |
|
| 28 |
assert_equal 3, TimeEntryActivity.find_by_name("Design").objects_count
|
|
| 29 |
assert_equal 1, TimeEntryActivity.find_by_name("Development").objects_count
|
|
| 30 |
end |
|
| 31 | ||
| 32 |
def test_option_name |
|
| 33 |
assert_equal :enumeration_activities, TimeEntryActivity.new.option_name |
|
| 34 |
end |
|
| 35 |
end |
|
| 36 | ||