| 
									
										
										
										
											2019-03-16 09:37:35 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							| 
									
										
										
										
											2019-03-15 01:32:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2020-03-03 00:24:10 +00:00
										 |  |  | # Copyright (C) 2006-2020  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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2016-07-14 07:27:31 +00:00
										 |  |  |   before_action :find_wiki, :authorize | 
					
						
							| 
									
										
										
										
											2019-05-15 13:21:35 +00:00
										 |  |  |   before_action :find_existing_or_new_page, :only => [:show, :edit] | 
					
						
							| 
									
										
										
										
											2016-07-14 07:27:31 +00:00
										 |  |  |   before_action :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version] | 
					
						
							|  |  |  |   before_action :find_attachments, :only => [:preview] | 
					
						
							| 
									
										
										
										
											2012-10-28 20:17:38 +00:00
										 |  |  |   accept_api_auth :index, :show, :update, :destroy | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 17:47:11 +00:00
										 |  |  |   def new | 
					
						
							|  |  |  |     @page = WikiPage.new(:wiki => @wiki, :title => params[:title]) | 
					
						
							| 
									
										
										
										
											2016-08-30 19:21:42 +00:00
										 |  |  |     unless User.current.allowed_to?(:edit_wiki_pages, @project) | 
					
						
							| 
									
										
										
										
											2016-04-22 17:47:11 +00:00
										 |  |  |       render_403 | 
					
						
							| 
									
										
										
										
											2016-08-30 19:21:42 +00:00
										 |  |  |       return | 
					
						
							| 
									
										
										
										
											2016-04-22 17:47:11 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |     if request.post? | 
					
						
							| 
									
										
										
										
											2016-08-30 19:21:42 +00:00
										 |  |  |       @page.title = '' unless editable? | 
					
						
							| 
									
										
										
										
											2016-04-22 17:47:11 +00:00
										 |  |  |       @page.validate | 
					
						
							|  |  |  |       if @page.errors[:title].blank? | 
					
						
							| 
									
										
										
										
											2017-07-08 13:54:26 +00:00
										 |  |  |         path = project_wiki_page_path(@project, @page.title, :parent => params[:parent]) | 
					
						
							| 
									
										
										
										
											2016-04-22 17:47:11 +00:00
										 |  |  |         respond_to do |format| | 
					
						
							|  |  |  |           format.html { redirect_to path } | 
					
						
							|  |  |  |           format.js   { render :js => "window.location = #{path.to_json}" } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   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 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:19:47 +00:00
										 |  |  |     if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project) | 
					
						
							|  |  |  |       deny_access | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     @content = @page.content_for_version(params[:version]) | 
					
						
							|  |  |  |     if @content.nil? | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2016-09-03 07:39:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     call_hook :controller_wiki_show_before_render, content: @content, format: params[:format] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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' | 
					
						
							| 
									
										
										
										
											2017-08-30 15:46:45 +00:00
										 |  |  |         send_file_headers! :type => 'application/pdf', :filename => filename_for_content_disposition("#{@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 | 
					
						
							| 
									
										
										
										
											2017-08-30 15:46:45 +00:00
										 |  |  |         send_data(export, :type => 'text/html', :filename => filename_for_content_disposition("#{@page.title}.html")) | 
					
						
							| 
									
										
										
										
											2010-02-06 09:30:53 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |       elsif params[:format] == 'txt' | 
					
						
							| 
									
										
										
										
											2017-08-30 15:46:45 +00:00
										 |  |  |         send_data(@content.text, :type => 'text/plain', :filename => filename_for_content_disposition("#{@page.title}.txt")) | 
					
						
							| 
									
										
										
										
											2010-02-06 09:30:53 +00:00
										 |  |  |         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? | 
					
						
							|  |  |  |       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]) | 
					
						
							| 
									
										
										
										
											2013-10-13 11:19:47 +00:00
										 |  |  |     @content ||= WikiContent.new(:page => @page) | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:19:47 +00:00
										 |  |  |     @content.version = @page.content.version if @page.content | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2019-05-15 13:21:35 +00:00
										 |  |  |     @page = @wiki.find_or_new_page(params[:id]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  |     return render_403 unless editable? | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |     was_new_page = @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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:19:47 +00:00
										 |  |  |     @content = @page.content || WikiContent.new(:page => @page) | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |     content_params = params[:content] | 
					
						
							| 
									
										
										
										
											2017-06-03 09:21:27 +00:00
										 |  |  |     if content_params.nil? && params[:wiki_page].present? | 
					
						
							| 
									
										
										
										
											2012-10-25 20:38:29 +00:00
										 |  |  |       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] | 
					
						
							| 
									
										
										
										
											2013-10-26 09:03:08 +00:00
										 |  |  |       @content.text = Redmine::WikiFormatting.formatter.new(@content.text).update_section(@section, @text, @section_hash) | 
					
						
							| 
									
										
										
										
											2011-11-18 16:25:00 +00:00
										 |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:19:47 +00:00
										 |  |  |     if @page.save_with_content(@content) | 
					
						
							| 
									
										
										
										
											2016-05-16 06:29:52 +00:00
										 |  |  |       attachments = Attachment.attach_files(@page, params[:attachments] || (params[:wiki_page] && params[:wiki_page][:uploads])) | 
					
						
							| 
									
										
										
										
											2010-10-22 16:20:20 +00:00
										 |  |  |       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| | 
					
						
							| 
									
										
										
										
											2013-10-26 09:03:08 +00:00
										 |  |  |         format.html { | 
					
						
							|  |  |  |           anchor = @section ? "section-#{@section}" : nil | 
					
						
							|  |  |  |           redirect_to project_wiki_page_path(@project, @page.title, :anchor => anchor) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2014-11-23 13:36:01 +00:00
										 |  |  |     @page.safe_attributes = params[:wiki_page] | 
					
						
							|  |  |  |     if request.post? && @page.save | 
					
						
							| 
									
										
										
										
											2007-09-09 17:05:38 +00:00
										 |  |  |       flash[:notice] = l(:notice_successful_update) | 
					
						
							| 
									
										
										
										
											2014-11-23 13:36:01 +00:00
										 |  |  |       redirect_to project_wiki_page_path(@page.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 | 
					
						
							| 
									
										
										
										
											2013-01-08 20:18:12 +00:00
										 |  |  |     @version_pages = Paginator.new @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'). | 
					
						
							| 
									
										
										
										
											2013-02-17 11:35:42 +00:00
										 |  |  |       limit(@version_pages.per_page + 1). | 
					
						
							| 
									
										
										
										
											2013-01-08 20:18:12 +00:00
										 |  |  |       offset(@version_pages.offset). | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |       to_a | 
					
						
							| 
									
										
										
										
											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| | 
					
						
							| 
									
										
										
										
											2020-04-04 00:43:28 +00:00
										 |  |  |       format.html { | 
					
						
							|  |  |  |         flash[:notice] = l(:notice_successful_delete) | 
					
						
							|  |  |  |         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? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-09 17:53:13 +00:00
										 |  |  |     if content = @page.content.versions.find_by_version(params[:version]) | 
					
						
							|  |  |  |       content.destroy | 
					
						
							|  |  |  |       redirect_to_referer_or history_project_wiki_page_path(@project, @page.title) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       render_404 | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2014-01-11 06:03:38 +00:00
										 |  |  |     @pages = @wiki.pages. | 
					
						
							|  |  |  |                       includes([:content, {:attachments => :author}]). | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |                       to_a | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2015-01-25 09:04:52 +00:00
										 |  |  |         send_file_headers! :type => 'application/pdf', :filename => "#{@project.identifier}.pdf" | 
					
						
							| 
									
										
										
										
											2012-01-30 18:42:14 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2018-09-26 07:27:30 +00:00
										 |  |  |     @text = params[:content].present? ? params[:content][:text] : params[: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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-22 15:54:00 +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? | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |       redirect_to_page @page | 
					
						
							| 
									
										
										
										
											2011-04-11 19:21:57 +00:00
										 |  |  |     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? | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |       redirect_to_page @page | 
					
						
							| 
									
										
										
										
											2011-04-11 19:21:57 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2008-12-19 10:43:06 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-17 04:34:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |   def redirect_to_page(page) | 
					
						
							| 
									
										
										
										
											2014-11-23 13:36:01 +00:00
										 |  |  |     if page.project && page.project.visible? | 
					
						
							|  |  |  |       redirect_to :action => action_name, :project_id => page.project, :id => page.title | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       render_404 | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2014-01-11 05:51:18 +00:00
										 |  |  |     @pages = @wiki.pages.with_updated_on. | 
					
						
							|  |  |  |                 includes(:wiki => :project). | 
					
						
							|  |  |  |                 includes(:parent). | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |                 to_a | 
					
						
							| 
									
										
										
										
											2011-03-12 18:09:46 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2007-03-10 15:09:49 +00:00
										 |  |  | end |