Class: WikiController

Inherits:
ApplicationController show all
Includes:
AttachmentsHelper
Defined in:
app/controllers/wiki_controller.rb

Overview

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

Instance Method Summary collapse

Methods included from AttachmentsHelper

#link_to_attachments, #to_utf8

Methods inherited from ApplicationController

accept_key_auth, #accept_key_auth_actions, #api_key_from_request, #api_offset_and_limit, #api_request?, #authorize, #authorize_global, #back_url, #check_if_login_required, #check_project_privacy, #check_project_uniqueness, #default_template, #delete_broken_cookies, #deny_access, #filename_for_content_disposition, #find_current_user, #find_issues, #find_model_object, #find_optional_project, #find_project, #find_project_by_project_id, #find_project_from_association, #invalid_authenticity_token, #logged_user=, model_object, #object_errors_to_json, #parse_qvalues, #per_page_option, #pick_layout, #query_statement_invalid, #redirect_back_or_default, #render_403, #render_404, #render_attachment_warning_if_needed, #render_error, #render_feed, #render_validation_errors, #require_admin, #require_login, #set_flash_from_bulk_issue_save, #set_localization, #use_layout, #user_setup

Methods included from Redmine::MenuManager::MenuController

#current_menu_item, included, #menu_items, #redirect_to_project_menu_item

Methods included from Redmine::Search::Controller

#default_search_scope, #default_search_scopes, included

Methods included from Redmine::I18n

#current_language, #day_name, #find_language, #format_date, #format_time, included, #l, #l_hours, #l_or_humanize, #ll, #month_name, #set_language_if_valid, #valid_languages

Instance Method Details

#add_attachmentObject



236
237
238
239
240
241
# File 'app/controllers/wiki_controller.rb', line 236

def add_attachment
  return render_403 unless editable?
  attachments = Attachment.attach_files(@page, params[:attachments])
  render_attachment_warning_if_needed(@page)
  redirect_to :action => 'show', :id => @page.title, :project_id => @project
end

#annotateObject



178
179
180
181
# File 'app/controllers/wiki_controller.rb', line 178

def annotate
  @annotate = @page.annotate(params[:version])
  render_404 unless @annotate
end

#date_indexObject

List of page, by last update



52
53
54
55
# File 'app/controllers/wiki_controller.rb', line 52

def date_index
  load_pages_for_index
  @pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
end

#destroyObject

Removes a wiki page and its history Children can be either set as root pages, removed or reassigned to another parent page



186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# File 'app/controllers/wiki_controller.rb', line 186

def destroy
  return render_403 unless editable?
  
  @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
      return
    end
  end
  @page.destroy
  redirect_to :action => 'index', :project_id => @project
end

#diffObject



173
174
175
176
# File 'app/controllers/wiki_controller.rb', line 173

def diff
  @diff = @page.diff(params[:version], params[:version_from])
  render_404 unless @diff
end

#editObject

edit an existing page or a new one



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'app/controllers/wiki_controller.rb', line 91

def edit
  @page = @wiki.find_or_new_page(params[:id])    
  return render_403 unless editable?
  @page.content = WikiContent.new(:page => @page) if @page.new_record?
  
  @content = @page.content_for_version(params[:version])
  @content.text = initial_page_content(@page) if @content.text.blank?
  # don't keep previous comment
  @content.comments = nil

  # To prevent StaleObjectError exception when reverting to a previous version
  @content.version = @page.content.version
end

#exportObject

Export wiki to a single html file



214
215
216
217
218
219
220
221
222
# File 'app/controllers/wiki_controller.rb', line 214

def export
  if User.current.allowed_to?(:export_wiki_pages, @project)
    @pages = @wiki.pages.find :all, :order => 'title'
    export = render_to_string :action => 'export_multiple', :layout => false
    send_data(export, :type => 'text/html', :filename => "wiki.html")
  else
    redirect_to :action => 'show', :project_id => @project, :id => nil
  end
end

#historyObject

show page history



160
161
162
163
164
165
166
167
168
169
170
171
# File 'app/controllers/wiki_controller.rb', line 160

def history
  @version_count = @page.content.versions.count
  @version_pages = Paginator.new self, @version_count, per_page_option, params['p']
  # don't load text    
  @versions = @page.content.versions.find :all, 
                                          :select => "id, author_id, comments, updated_on, version",
                                          :order => 'version DESC',
                                          :limit  =>  @version_pages.items_per_page + 1,
                                          :offset =>  @version_pages.current.offset

  render :layout => false if request.xhr?
end

#indexObject

List of pages, sorted alphabetically and by parent (hierarchy)



46
47
48
49
# File 'app/controllers/wiki_controller.rb', line 46

def index
  load_pages_for_index
  @pages_by_parent_id = @pages.group_by(&:parent_id)
end

#previewObject



224
225
226
227
228
229
230
231
232
233
234
# File 'app/controllers/wiki_controller.rb', line 224

def preview
  page = @wiki.find_page(params[:id])
  # page is nil when previewing a new page
  return render_403 unless page.nil? || editable?(page)
  if page
    @attachements = page.attachments
    @previewed = page.content
  end
  @text = params[:content][:text]
  render :partial => 'common/preview'
end

#protectObject



154
155
156
157
# File 'app/controllers/wiki_controller.rb', line 154

def protect
  @page.update_attribute :protected, params[:protected]
  redirect_to :action => 'show', :project_id => @project, :id => @page.title
end

#renameObject

rename a page



143
144
145
146
147
148
149
150
151
152
# File 'app/controllers/wiki_controller.rb', line 143

def rename
  return render_403 unless editable?
  @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)
    redirect_to :action => 'show', :project_id => @project, :id => @page.title
  end
end

#showObject

display a page (in editing mode if it doesn’t exist)



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'app/controllers/wiki_controller.rb', line 58

def show
  page_title = params[:id]
  @page = @wiki.find_or_new_page(page_title)
  if @page.new_record?
    if User.current.allowed_to?(:edit_wiki_pages, @project) && editable?
      edit
      render :action => 'edit'
    else
      render_404
    end
    return
  end
  if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project)
    # Redirects user to the current version if he's not allowed to view previous versions
    redirect_to :version => nil
    return
  end
  @content = @page.content_for_version(params[:version])
  if User.current.allowed_to?(:export_wiki_pages, @project)
    if params[:format] == 'html'
      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
  end
  @editable = editable?
  render :action => 'show'
end

#updateObject

Creates a new page or updates an existing one



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'app/controllers/wiki_controller.rb', line 107

def update
  @page = @wiki.find_or_new_page(params[:id])    
  return render_403 unless editable?
  @page.content = WikiContent.new(:page => @page) if @page.new_record?
  
  @content = @page.content_for_version(params[:version])
  @content.text = initial_page_content(@page) if @content.text.blank?
  # don't keep previous comment
  @content.comments = nil

  if !@page.new_record? && params[:content].present? && @content.text == params[:content][:text]
    attachments = Attachment.attach_files(@page, params[:attachments])
    render_attachment_warning_if_needed(@page)
    # don't save if text wasn't changed
    redirect_to :action => 'show', :project_id => @project, :id => @page.title
    return
  end
  @content.attributes = params[:content]
  @content.author = User.current
  # if page is new @page.save will also save content, but not if page isn't a new record
  if (@page.new_record? ? @page.save : @content.save)
    attachments = Attachment.attach_files(@page, params[:attachments])
    render_attachment_warning_if_needed(@page)
    call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
    redirect_to :action => 'show', :project_id => @project, :id => @page.title
  else
    render :action => 'edit'
  end

rescue ActiveRecord::StaleObjectError
  # Optimistic locking exception
  flash.now[:error] = l(:notice_locking_conflict)
  render :action => 'edit'
end