| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2012-05-05 12:56:53 +00:00
										 |  |  | # Copyright (C) 2006-2012  Jean-Philippe Lang | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # 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. | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | # 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. | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | # 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-14 11:25:03 +00:00
										 |  |  | require 'diff' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-25 16:16:46 +00:00
										 |  |  | # The WikiController follows the Rails REST controller pattern but with | 
					
						
							|  |  |  | # a few differences | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # * index - shows a list of WikiPages grouped by page or date | 
					
						
							|  |  |  | # * new - not used | 
					
						
							|  |  |  | # * create - not used | 
					
						
							|  |  |  | # * show - will also show the form for creating a new wiki page | 
					
						
							|  |  |  | # * edit - used to edit an existing or new page | 
					
						
							|  |  |  | # * update - used to save a wiki page update to the database, including new pages | 
					
						
							|  |  |  | # * destroy - normal | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Other member and collection methods are also used | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # TODO: still being worked on | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | class WikiController < ApplicationController | 
					
						
							| 
									
										
										
										
											2009-10-21 17:07:18 +00:00
										 |  |  |   default_search_scope :wiki_pages | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |   before_filter :find_wiki, :authorize | 
					
						
							| 
									
										
										
										
											2011-04-11 19:04:39 +00:00
										 |  |  |   before_filter :find_existing_or_new_page, :only => [:show, :edit, :update] | 
					
						
							| 
									
										
										
										
											2012-10-23 18:45:14 +00:00
										 |  |  |   before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version] | 
					
						
							| 
									
										
										
										
											2012-10-28 20:17:38 +00:00
										 |  |  |   accept_api_auth :index, :show, :update, :destroy | 
					
						
							| 
									
										
										
										
											2012-12-10 20:09:41 +00:00
										 |  |  |   before_filter :find_attachments, :only => [:preview] | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-26 15:42:37 +00:00
										 |  |  |   helper :attachments | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  |   include AttachmentsHelper | 
					
						
							| 
									
										
										
										
											2009-05-25 19:02:28 +00:00
										 |  |  |   helper :watchers | 
					
						
							| 
									
										
										
										
											2011-11-06 10:49:09 +00:00
										 |  |  |   include Redmine::Export::PDF | 
					
						
							| 
									
										
										
										
											2010-10-21 16:07:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-25 16:16:46 +00:00
										 |  |  |   # List of pages, sorted alphabetically and by parent (hierarchy) | 
					
						
							|  |  |  |   def index | 
					
						
							| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  |     load_pages_for_index | 
					
						
							| 
									
										
										
										
											2012-10-25 19:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     respond_to do |format| | 
					
						
							|  |  |  |       format.html { | 
					
						
							|  |  |  |         @pages_by_parent_id = @pages.group_by(&:parent_id) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       format.api | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  |   # List of page, by last update | 
					
						
							|  |  |  |   def date_index | 
					
						
							|  |  |  |     load_pages_for_index | 
					
						
							|  |  |  |     @pages_by_date = @pages.group_by {|p| p.updated_on.to_date} | 
					
						
							| 
									
										
										
										
											2010-10-25 16:16:46 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   # display a page (in editing mode if it doesn't exist) | 
					
						
							| 
									
										
										
										
											2010-10-21 16:07:28 +00:00
										 |  |  |   def show | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |     if @page.new_record? | 
					
						
							| 
									
										
										
										
											2012-10-25 19:44:04 +00:00
										 |  |  |       if User.current.allowed_to?(:edit_wiki_pages, @project) && editable? && !api_request? | 
					
						
							| 
									
										
										
										
											2007-10-10 21:18:10 +00:00
										 |  |  |         edit | 
					
						
							|  |  |  |         render :action => 'edit' | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         render_404 | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       return | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2008-09-13 16:45:01 +00:00
										 |  |  |     if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project) | 
					
						
							| 
									
										
										
										
											2012-10-25 19:44:04 +00:00
										 |  |  |       deny_access | 
					
						
							| 
									
										
										
										
											2008-09-13 16:45:01 +00:00
										 |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2007-04-05 14:45:44 +00:00
										 |  |  |     @content = @page.content_for_version(params[:version]) | 
					
						
							| 
									
										
										
										
											2010-02-06 09:30:53 +00:00
										 |  |  |     if User.current.allowed_to?(:export_wiki_pages, @project) | 
					
						
							| 
									
										
										
										
											2011-11-06 10:49:09 +00:00
										 |  |  |       if params[:format] == 'pdf' | 
					
						
							| 
									
										
										
										
											2012-01-30 18:42:14 +00:00
										 |  |  |         send_data(wiki_page_to_pdf(@page, @project), :type => 'application/pdf', :filename => "#{@page.title}.pdf") | 
					
						
							| 
									
										
										
										
											2011-11-06 10:49:09 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |       elsif params[:format] == 'html' | 
					
						
							| 
									
										
										
										
											2010-02-06 09:30:53 +00:00
										 |  |  |         export = render_to_string :action => 'export', :layout => false | 
					
						
							|  |  |  |         send_data(export, :type => 'text/html', :filename => "#{@page.title}.html") | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       elsif params[:format] == 'txt' | 
					
						
							|  |  |  |         send_data(@content.text, :type => 'text/plain', :filename => "#{@page.title}.txt") | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-02-06 09:30:53 +00:00
										 |  |  |     @editable = editable? | 
					
						
							| 
									
										
										
										
											2011-11-18 16:41:54 +00:00
										 |  |  |     @sections_editable = @editable && User.current.allowed_to?(:edit_wiki_pages, @page.project) && | 
					
						
							| 
									
										
										
										
											2011-11-28 20:12:03 +00:00
										 |  |  |       @content.current_version? && | 
					
						
							| 
									
										
										
										
											2011-11-18 16:41:54 +00:00
										 |  |  |       Redmine::WikiFormatting.supports_section_edit? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-25 19:44:04 +00:00
										 |  |  |     respond_to do |format| | 
					
						
							|  |  |  |       format.html | 
					
						
							|  |  |  |       format.api | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   # edit an existing page or a new one | 
					
						
							|  |  |  |   def edit | 
					
						
							| 
									
										
										
										
											2008-05-04 15:05:38 +00:00
										 |  |  |     return render_403 unless editable? | 
					
						
							| 
									
										
										
										
											2011-12-17 11:44:04 +00:00
										 |  |  |     if @page.new_record? | 
					
						
							|  |  |  |       @page.content = WikiContent.new(:page => @page) | 
					
						
							|  |  |  |       if params[:parent].present? | 
					
						
							|  |  |  |         @page.parent = @page.wiki.find_page(params[:parent].to_s) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-05 14:45:44 +00:00
										 |  |  |     @content = @page.content_for_version(params[:version]) | 
					
						
							| 
									
										
										
										
											2008-10-27 11:08:29 +00:00
										 |  |  |     @content.text = initial_page_content(@page) if @content.text.blank? | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |     # don't keep previous comment | 
					
						
							| 
									
										
										
										
											2007-04-25 15:06:20 +00:00
										 |  |  |     @content.comments = nil | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # To prevent StaleObjectError exception when reverting to a previous version | 
					
						
							|  |  |  |     @content.version = @page.content.version | 
					
						
							| 
									
										
										
										
											2012-08-31 23:01:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-18 16:25:00 +00:00
										 |  |  |     @text = @content.text | 
					
						
							| 
									
										
										
										
											2011-11-18 16:41:54 +00:00
										 |  |  |     if params[:section].present? && Redmine::WikiFormatting.supports_section_edit? | 
					
						
							| 
									
										
										
										
											2011-11-18 16:25:00 +00:00
										 |  |  |       @section = params[:section].to_i | 
					
						
							|  |  |  |       @text, @section_hash = Redmine::WikiFormatting.formatter.new(@text).get_section(@section) | 
					
						
							|  |  |  |       render_404 if @text.blank? | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Creates a new page or updates an existing one | 
					
						
							|  |  |  |   def update | 
					
						
							|  |  |  |     return render_403 unless editable? | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |     was_new_page = @page.new_record? | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  |     @page.content = WikiContent.new(:page => @page) if @page.new_record? | 
					
						
							| 
									
										
										
										
											2012-02-05 14:35:27 +00:00
										 |  |  |     @page.safe_attributes = params[:wiki_page] | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |     @content = @page.content | 
					
						
							|  |  |  |     content_params = params[:content] | 
					
						
							|  |  |  |     if content_params.nil? && params[:wiki_page].is_a?(Hash) | 
					
						
							|  |  |  |       content_params = params[:wiki_page].slice(:text, :comments, :version) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     content_params ||= {} | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |     @content.comments = content_params[:comments] | 
					
						
							|  |  |  |     @text = content_params[:text] | 
					
						
							| 
									
										
										
										
											2011-11-18 16:41:54 +00:00
										 |  |  |     if params[:section].present? && Redmine::WikiFormatting.supports_section_edit? | 
					
						
							| 
									
										
										
										
											2011-11-18 16:25:00 +00:00
										 |  |  |       @section = params[:section].to_i | 
					
						
							|  |  |  |       @section_hash = params[:section_hash] | 
					
						
							|  |  |  |       @content.text = Redmine::WikiFormatting.formatter.new(@content.text).update_section(params[:section].to_i, @text, @section_hash) | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |       @content.version = content_params[:version] if content_params[:version] | 
					
						
							| 
									
										
										
										
											2011-11-18 16:25:00 +00:00
										 |  |  |       @content.text = @text | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  |     @content.author = User.current | 
					
						
							| 
									
										
										
										
											2012-11-18 16:01:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if @page.save_with_content | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  |       attachments = Attachment.attach_files(@page, params[:attachments]) | 
					
						
							|  |  |  |       render_attachment_warning_if_needed(@page) | 
					
						
							|  |  |  |       call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page}) | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       respond_to do |format| | 
					
						
							| 
									
										
										
										
											2012-12-11 19:39:47 +00:00
										 |  |  |         format.html { redirect_to project_wiki_page_path(@project, @page.title) } | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |         format.api { | 
					
						
							|  |  |  |           if was_new_page | 
					
						
							| 
									
										
										
										
											2012-12-11 19:39:47 +00:00
										 |  |  |             render :action => 'show', :status => :created, :location => project_wiki_page_path(@project, @page.title) | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |           else | 
					
						
							|  |  |  |             render_api_ok | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2010-11-27 10:34:44 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |       respond_to do |format| | 
					
						
							|  |  |  |         format.html { render :action => 'edit' } | 
					
						
							|  |  |  |         format.api { render_validation_errors(@content) } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-18 16:25:00 +00:00
										 |  |  |   rescue ActiveRecord::StaleObjectError, Redmine::WikiFormatting::StaleSectionError | 
					
						
							| 
									
										
										
										
											2007-05-26 17:22:27 +00:00
										 |  |  |     # Optimistic locking exception | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |     respond_to do |format| | 
					
						
							|  |  |  |       format.html { | 
					
						
							|  |  |  |         flash.now[:error] = l(:notice_locking_conflict) | 
					
						
							|  |  |  |         render :action => 'edit' | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       format.api { render_api_head :conflict } | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-04-25 17:17:49 +00:00
										 |  |  |   rescue ActiveRecord::RecordNotSaved | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |     respond_to do |format| | 
					
						
							|  |  |  |       format.html { render :action => 'edit' } | 
					
						
							|  |  |  |       format.api { render_validation_errors(@content) } | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-09 17:05:38 +00:00
										 |  |  |   # rename a page | 
					
						
							|  |  |  |   def rename | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |     return render_403 unless editable? | 
					
						
							| 
									
										
										
										
											2007-09-09 17:05:38 +00:00
										 |  |  |     @page.redirect_existing_links = true | 
					
						
							|  |  |  |     # used to display the *original* title if some AR validation errors occur | 
					
						
							|  |  |  |     @original_title = @page.pretty_title | 
					
						
							|  |  |  |     if request.post? && @page.update_attributes(params[:wiki_page]) | 
					
						
							|  |  |  |       flash[:notice] = l(:notice_successful_update) | 
					
						
							| 
									
										
										
										
											2012-12-11 19:39:47 +00:00
										 |  |  |       redirect_to project_wiki_page_path(@project, @page.title) | 
					
						
							| 
									
										
										
										
											2007-09-09 17:05:38 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-04 15:05:38 +00:00
										 |  |  |   def protect | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |     @page.update_attribute :protected, params[:protected] | 
					
						
							| 
									
										
										
										
											2012-12-11 19:39:47 +00:00
										 |  |  |     redirect_to project_wiki_page_path(@project, @page.title) | 
					
						
							| 
									
										
										
										
											2008-05-04 15:05:38 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   # show page history | 
					
						
							|  |  |  |   def history | 
					
						
							| 
									
										
										
										
											2007-06-23 18:53:45 +00:00
										 |  |  |     @version_count = @page.content.versions.count | 
					
						
							| 
									
										
										
										
											2012-10-28 20:27:50 +00:00
										 |  |  |     @version_pages = Paginator.new self, @version_count, per_page_option, params['page'] | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  |     # don't load text | 
					
						
							| 
									
										
										
										
											2012-12-03 21:30:10 +00:00
										 |  |  |     @versions = @page.content.versions. | 
					
						
							|  |  |  |       select("id, author_id, comments, updated_on, version"). | 
					
						
							|  |  |  |       reorder('version DESC'). | 
					
						
							|  |  |  |       limit(@version_pages.items_per_page + 1). | 
					
						
							|  |  |  |       offset(@version_pages.current.offset). | 
					
						
							|  |  |  |       all | 
					
						
							| 
									
										
										
										
											2007-06-23 18:53:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     render :layout => false if request.xhr? | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-14 11:25:03 +00:00
										 |  |  |   def diff | 
					
						
							|  |  |  |     @diff = @page.diff(params[:version], params[:version_from]) | 
					
						
							|  |  |  |     render_404 unless @diff | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-20 19:10:24 +00:00
										 |  |  |   def annotate | 
					
						
							|  |  |  |     @annotate = @page.annotate(params[:version]) | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |     render_404 unless @annotate | 
					
						
							| 
									
										
										
										
											2007-12-20 19:10:24 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-10-26 15:59:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-21 12:19:56 +00:00
										 |  |  |   # Removes a wiki page and its history | 
					
						
							|  |  |  |   # Children can be either set as root pages, removed or reassigned to another parent page | 
					
						
							| 
									
										
										
										
											2007-05-25 16:44:50 +00:00
										 |  |  |   def destroy | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |     return render_403 unless editable? | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-21 12:19:56 +00:00
										 |  |  |     @descendants_count = @page.descendants.size | 
					
						
							|  |  |  |     if @descendants_count > 0
 | 
					
						
							|  |  |  |       case params[:todo] | 
					
						
							|  |  |  |       when 'nullify' | 
					
						
							|  |  |  |         # Nothing to do | 
					
						
							|  |  |  |       when 'destroy' | 
					
						
							|  |  |  |         # Removes all its descendants | 
					
						
							|  |  |  |         @page.descendants.each(&:destroy) | 
					
						
							|  |  |  |       when 'reassign' | 
					
						
							|  |  |  |         # Reassign children to another parent page | 
					
						
							|  |  |  |         reassign_to = @wiki.pages.find_by_id(params[:reassign_to_id].to_i) | 
					
						
							|  |  |  |         return unless reassign_to | 
					
						
							|  |  |  |         @page.children.each do |child| | 
					
						
							|  |  |  |           child.update_attribute(:parent, reassign_to) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         @reassignable_to = @wiki.pages - @page.self_and_descendants | 
					
						
							| 
									
										
										
										
											2012-10-28 20:17:38 +00:00
										 |  |  |         # display the destroy form if it's a user request | 
					
						
							|  |  |  |         return unless api_request? | 
					
						
							| 
									
										
										
										
											2009-04-21 12:19:56 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |     @page.destroy | 
					
						
							| 
									
										
										
										
											2012-10-28 20:17:38 +00:00
										 |  |  |     respond_to do |format| | 
					
						
							| 
									
										
										
										
											2012-12-11 19:39:47 +00:00
										 |  |  |       format.html { redirect_to project_wiki_index_path(@project) } | 
					
						
							| 
									
										
										
										
											2012-10-28 20:17:38 +00:00
										 |  |  |       format.api { render_api_ok } | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2007-05-25 16:44:50 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-23 18:45:14 +00:00
										 |  |  |   def destroy_version | 
					
						
							|  |  |  |     return render_403 unless editable? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @content = @page.content_for_version(params[:version]) | 
					
						
							|  |  |  |     @content.destroy | 
					
						
							| 
									
										
										
										
											2012-12-11 19:39:47 +00:00
										 |  |  |     redirect_to_referer_or history_project_wiki_page_path(@project, @page.title)  | 
					
						
							| 
									
										
										
										
											2012-10-23 18:45:14 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-30 18:42:14 +00:00
										 |  |  |   # Export wiki to a single pdf or html file | 
					
						
							| 
									
										
										
										
											2010-10-13 17:13:50 +00:00
										 |  |  |   def export | 
					
						
							| 
									
										
										
										
											2012-11-18 14:37:37 +00:00
										 |  |  |     @pages = @wiki.pages.all(:order => 'title', :include => [:content, {:attachments => :author}]) | 
					
						
							| 
									
										
										
										
											2012-01-30 18:42:14 +00:00
										 |  |  |     respond_to do |format| | 
					
						
							|  |  |  |       format.html { | 
					
						
							|  |  |  |         export = render_to_string :action => 'export_multiple', :layout => false | 
					
						
							|  |  |  |         send_data(export, :type => 'text/html', :filename => "wiki.html") | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       format.pdf { | 
					
						
							|  |  |  |         send_data(wiki_pages_to_pdf(@pages, @project), :type => 'application/pdf', :filename => "#{@project.identifier}.pdf") | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2010-10-13 17:13:50 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   def preview | 
					
						
							| 
									
										
										
										
											2010-10-27 16:27:06 +00:00
										 |  |  |     page = @wiki.find_page(params[:id]) | 
					
						
							| 
									
										
										
										
											2008-05-23 16:29:40 +00:00
										 |  |  |     # page is nil when previewing a new page | 
					
						
							|  |  |  |     return render_403 unless page.nil? || editable?(page) | 
					
						
							| 
									
										
										
										
											2008-07-26 12:54:54 +00:00
										 |  |  |     if page | 
					
						
							| 
									
										
										
										
											2012-12-10 20:09:41 +00:00
										 |  |  |       @attachments += page.attachments | 
					
						
							| 
									
										
										
										
											2008-07-26 12:54:54 +00:00
										 |  |  |       @previewed = page.content | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |     @text = params[:content][:text] | 
					
						
							| 
									
										
										
										
											2007-10-06 08:54:05 +00:00
										 |  |  |     render :partial => 'common/preview' | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-26 15:42:37 +00:00
										 |  |  |   def add_attachment | 
					
						
							| 
									
										
										
										
											2008-05-04 15:05:38 +00:00
										 |  |  |     return render_403 unless editable? | 
					
						
							| 
									
										
										
										
											2010-03-02 19:26:03 +00:00
										 |  |  |     attachments = Attachment.attach_files(@page, params[:attachments]) | 
					
						
							| 
									
										
										
										
											2010-03-03 17:05:00 +00:00
										 |  |  |     render_attachment_warning_if_needed(@page) | 
					
						
							| 
									
										
										
										
											2010-10-28 21:25:38 +00:00
										 |  |  |     redirect_to :action => 'show', :id => @page.title, :project_id => @project | 
					
						
							| 
									
										
										
										
											2007-05-26 15:42:37 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | private | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   def find_wiki | 
					
						
							| 
									
										
										
										
											2010-10-20 21:26:30 +00:00
										 |  |  |     @project = Project.find(params[:project_id]) | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |     @wiki = @project.wiki | 
					
						
							| 
									
										
										
										
											2007-06-14 18:26:27 +00:00
										 |  |  |     render_404 unless @wiki | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  |   rescue ActiveRecord::RecordNotFound | 
					
						
							|  |  |  |     render_404 | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-11 19:04:39 +00:00
										 |  |  |   # Finds the requested page or a new page if it doesn't exist | 
					
						
							|  |  |  |   def find_existing_or_new_page | 
					
						
							|  |  |  |     @page = @wiki.find_or_new_page(params[:id]) | 
					
						
							| 
									
										
										
										
											2011-04-11 19:21:57 +00:00
										 |  |  |     if @wiki.page_found_with_redirect? | 
					
						
							|  |  |  |       redirect_to params.update(:id => @page.title) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-04-11 19:04:39 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |   # Finds the requested page and returns a 404 error if it doesn't exist | 
					
						
							|  |  |  |   def find_existing_page | 
					
						
							| 
									
										
										
										
											2010-10-27 16:27:06 +00:00
										 |  |  |     @page = @wiki.find_page(params[:id]) | 
					
						
							| 
									
										
										
										
											2011-04-11 19:21:57 +00:00
										 |  |  |     if @page.nil? | 
					
						
							|  |  |  |       render_404 | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     if @wiki.page_found_with_redirect? | 
					
						
							|  |  |  |       redirect_to params.update(:id => @page.title) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-04 15:05:38 +00:00
										 |  |  |   # Returns true if the current user is allowed to edit the page, otherwise false | 
					
						
							|  |  |  |   def editable?(page = @page) | 
					
						
							|  |  |  |     page.editable_by?(User.current) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2008-10-27 11:08:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # Returns the default content of a new wiki page | 
					
						
							|  |  |  |   def initial_page_content(page) | 
					
						
							|  |  |  |     helper = Redmine::WikiFormatting.helper_for(Setting.text_formatting) | 
					
						
							|  |  |  |     extend helper unless self.instance_of?(helper) | 
					
						
							|  |  |  |     helper.instance_method(:initial_page_content).bind(self).call(page) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  |   def load_pages_for_index | 
					
						
							| 
									
										
										
										
											2012-10-25 19:44:04 +00:00
										 |  |  |     @pages = @wiki.pages.with_updated_on.order("#{WikiPage.table_name}.title").includes(:wiki => :project).includes(:parent).all | 
					
						
							| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | end |