summaryrefslogtreecommitdiffstats
path: root/app/models/project.rb
diff options
context:
space:
mode:
authorEric Davis <edavis@littlestreamsoftware.com>2009-05-03 21:25:37 +0000
committerEric Davis <edavis@littlestreamsoftware.com>2009-05-03 21:25:37 +0000
commitfa7bd1c71dca1e9c74e6d83277336321393dac9f (patch)
tree4f1adac8a535ae7424887ea21f6171a22eb698ea /app/models/project.rb
parent29c0dae1518ecb8a86d10da8e05caf70f731d746 (diff)
downloadredmine-fa7bd1c71dca1e9c74e6d83277336321393dac9f.tar.gz
redmine-fa7bd1c71dca1e9c74e6d83277336321393dac9f.zip
Added the ability to copy a project in the Project Administration panel.
* Added Copy project button. * Added Project#copy_from to duplicate a project to be modified and saved by the user * Added a ProjectsController#copy based off the add method ** Used Project#copy_from to create a duplicate project in memory * Implemented Project#copy to copy data for a project from another and save it. ** Members ** Project level queries ** Project custom fields * Added a plugin hook for Project#copy. #1125 #1556 #886 #309 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2704 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/project.rb')
-rw-r--r--app/models/project.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index bddd66362..261844e8e 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -318,6 +318,66 @@ class Project < ActiveRecord::Base
p.nil? ? nil : p.identifier.to_s.succ
end
+ # Copies and saves the Project instance based on the +project+.
+ # Will duplicate the source project's:
+ # * Issues
+ # * Members
+ # * Queries
+ def copy(project)
+ project = project.is_a?(Project) ? project : Project.find(project)
+
+ Project.transaction do
+ # Issues
+ project.issues.each do |issue|
+ new_issue = Issue.new
+ new_issue.copy_from(issue)
+ self.issues << new_issue
+ end
+
+ # Members
+ project.members.each do |member|
+ new_member = Member.new
+ new_member.attributes = member.attributes.dup.except("project_id")
+ new_member.project = self
+ self.members << new_member
+ end
+
+ # Queries
+ project.queries.each do |query|
+ new_query = Query.new
+ new_query.attributes = query.attributes.dup.except("project_id", "sort_criteria")
+ new_query.sort_criteria = query.sort_criteria if query.sort_criteria
+ new_query.project = self
+ self.queries << new_query
+ end
+
+ Redmine::Hook.call_hook(:model_project_copy_before_save, :source_project => project, :destination_project => self)
+ self.save
+ end
+ end
+
+
+ # Copies +project+ and returns the new instance. This will not save
+ # the copy
+ def self.copy_from(project)
+ begin
+ project = project.is_a?(Project) ? project : Project.find(project)
+ if project
+ # clear unique attributes
+ attributes = project.attributes.dup.except('name', 'identifier', 'id', 'status')
+ copy = Project.new(attributes)
+ copy.enabled_modules = project.enabled_modules
+ copy.trackers = project.trackers
+ copy.custom_values = project.custom_values.collect {|v| v.clone}
+ return copy
+ else
+ return nil
+ end
+ rescue ActiveRecord::RecordNotFound
+ return nil
+ end
+ end
+
protected
def validate
errors.add(:identifier, :invalid) if !identifier.blank? && identifier.match(/^\d*$/)