Vote #73312
完了Project copy fails when wiki module is disabled
0%
説明
Information
Redmine 2.1.2
Ruby version 1.9.3 (x86_64-linux)
RubyGems version 1.8.24
Rack version 1.4
Rails version 3.2.8
Active Record version 3.2.8
Action Pack version 3.2.8
Active Resource version 3.2.8
Action Mailer version 3.2.8
Active Support version 3.2.8
Environment production
Database adapter mysql2
Database: mysql Ver 14.16 Distrib 5.2.12-MariaDB, for suse-linux-gnu (x86_64) using readline 5.1
Problem
When you copy a project that it doesn't have the wiki module activated, the copy crash. When you copy a project that have the wiki module activated there's no problem.
Code
In app/models/project.rb
def copy_wiki(project)
# Check that the source project has a wiki first
unless project.wiki.nil?
self.wiki ||= Wiki.new
wiki.attributes = project.wiki.attributes.dup.except("id", "project_id")
wiki_pages_map = {}
project.wiki.pages.each do |page|
# Skip pages without content
next if page.content.nil?
new_wiki_content = WikiContent.new(page.content.attributes.dup.except("id", "page_id", "updated_on"))
new_wiki_page = WikiPage.new(page.attributes.dup.except("id", "wiki_id", "created_on", "parent_id"))
new_wiki_page.content = new_wiki_content
wiki.pages << new_wiki_page
wiki_pages_map[page.id] = new_wiki_page
end
wiki.save
# Reproduce page hierarchy
project.wiki.pages.each do |page|
if page.parent_id && wiki_pages_map[page.id]
wiki_pages_map[page.id].parent = wiki_pages_map[page.parent_id]
wiki_pages_map[page.id].save
end
end
end
end
if you change the code it works correctly
def copy_wiki(project)
# Check that the source project has a wiki first
unless project.wiki.nil?
wiki = Wiki.new
wiki.attributes = project.wiki.attributes.dup.except("id", "project_id")
wiki_pages_map = {}
project.wiki.pages.each do |page|
# Skip pages without content
next if page.content.nil?
new_wiki_content = WikiContent.new(page.content.attributes.dup.except("id", "page_id", "updated_on"))
new_wiki_page = WikiPage.new(page.attributes.dup.except("id", "wiki_id", "created_on", "parent_id"))
new_wiki_page.content = new_wiki_content
wiki.pages << new_wiki_page
wiki_pages_map[page.id] = new_wiki_page
end
self.wiki = wiki
wiki.save
# Reproduce page hierarchy
project.wiki.pages.each do |page|
if page.parent_id && wiki_pages_map[page.id]
wiki_pages_map[page.id].parent = wiki_pages_map[page.parent_id]
wiki_pages_map[page.id].save
end
end
end
end
Error log
Started POST "/projects/prova/copy" for 127.0.0.1 at 2013-02-07 11:54:14 +0100
Processing by ProjectsController#copy as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"R/TuuUitlFGsay8MNeshen6pJWpRaquVDl+fyFTVMN8=", "project"=>{"name"=>"testttt", "parent_id"=>"", "description"=>"dasdas", "identifier"=>"testttt", "homepage"=>"", "is_public"=>"0", "custom_field_values"=>{"1"=>"prova"}, "enabled_module_names"=>["issue_tracking", "time_tracking", "news", "documents", "files", "repository", "boards", "calendar", "gantt", "alfresco", "wiki_extensions", ""], "tracker_ids"=>["1", "2", "3", ""]}, "only"=>["members", "versions", "issue_categories", "issues", "queries", "boards", "wiki", ""], "commit"=>"Copia", "id"=>"prova"}
[1m[36m (0.4ms)[0m [1mSELECT MAX(settings.updated_on) AS max_id FROM settings [0m
[1m[35mUser Load (0.6ms)[0m SELECT users.* FROM users WHERE users.type IN ('User', 'AnonymousUser') AND users.id = 3 AND (users.status = 1) LIMIT 1
Current user: gtanya (id=3)
[1m[36m (0.1ms)[0m [1mBEGIN[0m
[1m[35m (0.2ms)[0m SELECT * FROM concurrency_redmine FOR UPDATE
[1m[36mIssueCustomField Load (0.3ms)[0m [1mSELECT custom_fields.* FROM custom_fields WHERE custom_fields.type IN ('IssueCustomField') ORDER BY custom_fields.position[0m
[1m[35mTracker Load (0.3ms)[0m SELECT trackers.* FROM trackers ORDER BY trackers.position ASC
[1m[36mProject Load (0.8ms)[0m [1mSELECT projects.* FROM projects WHERE (parent_id IS NULL AND status = 1) ORDER BY name[0m
[1m[35mProject Load (0.3ms)[0m SELECT projects.* FROM projects WHERE projects.identifier = 'prova' LIMIT 1
[1m[36mSetting Load (0.3ms)[0m [1mSELECT settings.* FROM settings WHERE settings.name = 'default_projects_public' LIMIT 1[0m
[1m[35mCACHE (0.0ms)[0m SELECT trackers.* FROM trackers ORDER BY trackers.position ASC
[1m[36mTracker Load (0.3ms)[0m [1mSELECT trackers.* FROM trackers WHERE trackers.id IN (1, 2, 3)[0m
[1m[35m (0.1ms)[0m DELETE FROM projects_trackers WHERE projects_trackers.project_id IS NULL AND projects_trackers.tracker_id IN (4)
[1m[36mCustomField Load (0.2ms)[0m [1mSELECT custom_fields.* FROM custom_fields WHERE (type = 'ProjectCustomField') ORDER BY position[0m
[1m[35mEnabledModule Exists (0.4ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'issue_tracking' AND enabled_modules.project_id IS NULL) LIMIT 1
[1m[36mEnabledModule Exists (0.3ms)[0m [1mSELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'time_tracking' AND enabled_modules.project_id IS NULL) LIMIT 1[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'news' AND enabled_modules.project_id IS NULL) LIMIT 1
[1m[36mEnabledModule Exists (0.2ms)[0m [1mSELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'documents' AND enabled_modules.project_id IS NULL) LIMIT 1[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'files' AND enabled_modules.project_id IS NULL) LIMIT 1
[1m[36mEnabledModule Exists (0.2ms)[0m [1mSELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'repository' AND enabled_modules.project_id IS NULL) LIMIT 1[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'boards' AND enabled_modules.project_id IS NULL) LIMIT 1
[1m[36mEnabledModule Exists (0.2ms)[0m [1mSELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'calendar' AND enabled_modules.project_id IS NULL) LIMIT 1[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'gantt' AND enabled_modules.project_id IS NULL) LIMIT 1
[1m[36mEnabledModule Exists (0.2ms)[0m [1mSELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'alfresco' AND enabled_modules.project_id IS NULL) LIMIT 1[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'wiki_extensions' AND enabled_modules.project_id IS NULL) LIMIT 1
[1m[36mProject Exists (0.2ms)[0m [1mSELECT 1 AS one FROM projects WHERE projects.identifier = BINARY 'testttt' LIMIT 1[0m
[1m[35mProject Load (0.4ms)[0m SELECT projects.* FROM projects ORDER BY rgt desc LIMIT 1 FOR UPDATE
[1m[36mSQL (0.3ms)[0m [1mINSERT INTO projects (created_on, description, homepage, identifier, is_public, lft, name, parent_id, rgt, status, updated_on) VALUES ('2013-02-07 11:54:14', 'dasdas', '', 'testttt', 0, 141, 'testttt', NULL, 142, 1, '2013-02-07 11:54:14')[0m
[1m[35mEnabledModule Exists (0.5ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'issue_tracking' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.8ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('issue_tracking', 87)[0m
[1m[35mEnabledModule Exists (0.3ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'time_tracking' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('time_tracking', 87)[0m
[1m[35mEnabledModule Exists (0.3ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'news' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('news', 87)[0m
[1m[35mEnabledModule Exists (0.3ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'documents' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('documents', 87)[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'files' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.1ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('files', 87)[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'repository' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.3ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('repository', 87)[0m
[1m[35mEnabledModule Exists (0.3ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'boards' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('boards', 87)[0m
[1m[35mEnabledModule Exists (0.3ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'calendar' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('calendar', 87)[0m
[1m[35mEnabledModule Exists (0.3ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'gantt' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.1ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('gantt', 87)[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'alfresco' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('alfresco', 87)[0m
[1m[35mEnabledModule Exists (0.2ms)[0m SELECT 1 AS one FROM enabled_modules WHERE (enabled_modules.name = BINARY 'wiki_extensions' AND enabled_modules.project_id = 87) LIMIT 1
[1m[36mSQL (0.1ms)[0m [1mINSERT INTO enabled_modules (name, project_id) VALUES ('wiki_extensions', 87)[0m
[1m[35m (0.1ms)[0m INSERT INTO projects_trackers (project_id, tracker_id) VALUES (87, 1)
[1m[36m (0.1ms)[0m [1mINSERT INTO projects_trackers (project_id, tracker_id) VALUES (87, 2)[0m
[1m[35m (0.1ms)[0m INSERT INTO projects_trackers (project_id, tracker_id) VALUES (87, 3)
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO custom_values (custom_field_id, customized_id, customized_type, value) VALUES (1, 87, 'Project', '')[0m
[1m[35m (0.3ms)[0m UPDATE custom_values SET value = 'prova' WHERE custom_values.id = 87
[1m[36mProject Load (0.7ms)[0m [1mSELECT projects.* FROM projects WHERE projects.parent_id IS NULL ORDER BY lft[0m
[1m[35mProject Load (0.3ms)[0m SELECT lft, rgt, parent_id FROM projects WHERE projects.id = 25 LIMIT 1 FOR UPDATE
[1m[36mProject Load (0.2ms)[0m [1mSELECT lft, rgt, parent_id FROM projects WHERE projects.id = 87 LIMIT 1 FOR UPDATE[0m
[1m[35mSQL (1.0ms)[0m UPDATE projects SET lft = CASE WHEN lft BETWEEN 123 AND 140 THEN lft + 142 - 140 WHEN lft BETWEEN 141 AND 142 THEN lft + 123 - 141 ELSE lft END, rgt = CASE WHEN rgt BETWEEN 123 AND 140 THEN rgt + 142 - 140 WHEN rgt BETWEEN 141 AND 142 THEN rgt + 123 - 141 ELSE rgt END, parent_id = CASE WHEN id = 87 THEN NULL ELSE parent_id END ORDER BY projects.lft
[1m[36mProject Load (0.3ms)[0m [1mSELECT lft, rgt, parent_id FROM projects WHERE projects.id = 25 LIMIT 1 FOR UPDATE[0m
[1m[35mProject Load (0.3ms)[0m SELECT lft, rgt, parent_id FROM projects WHERE projects.id = 87 LIMIT 1 FOR UPDATE
[1m[36mProject Load (0.3ms)[0m [1mSELECT projects.* FROM projects WHERE projects.id = 87 LIMIT 1[0m
[1m[35mWiki Load (0.4ms)[0m SELECT wikis.* FROM wikis WHERE wikis.project_id = 1 LIMIT 1
[1m[36mWiki Load (0.3ms)[0m [1mSELECT wikis.* FROM wikis WHERE wikis.project_id = 87 LIMIT 1[0m
[1m[35m (0.3ms)[0m UPDATE concurrency_redmine SET id=id+1
[1m[36m (14.6ms)[0m [1mROLLBACK[0m
Completed 500 Internal Server Error in 121ms
ActiveRecord::RecordNotSaved (Failed to save the new associated wiki.):
app/models/project.rb:724:in copy_wiki'block (2 levels) in copy'
app/models/project.rb:675:in
app/models/project.rb:674:in each'block in copy'
app/models/project.rb:674:in
app/models/project.rb:671:in copy'block in copy'
app/controllers/projects_controller.rb:128:in
app/models/mailer.rb:364:in with_deliveries'copy'
app/controllers/projects_controller.rb:125:in
journals
Confirmed on demo (2.1.0), even if there's no wiki page created before wiki module has been deactivated.
Untested on trunk but don't remember any related fix.
--------------------------------------------------------------------------------
Fixed in r11332, thanks for pointing this out.
--------------------------------------------------------------------------------
Thanks you for fix it ;-)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------