Class: WikiController

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

Instance Method Summary

Methods included from AttachmentsHelper

#link_to_attachments, #to_utf8

Methods inherited from ApplicationController

accept_key_auth, #accept_key_auth_actions, #api_request?, #authorize, #authorize_global, #check_if_login_required, #check_project_privacy, #delete_broken_cookies, #deny_access, #filename_for_content_disposition, #find_current_user, #find_model_object, #find_project, #find_project_from_association, #invalid_authenticity_token, #logged_user=, model_object, #parse_qvalues, #per_page_option, #redirect_back_or_default, #render_403, #render_404, #render_attachment_warning_if_needed, #render_error, #render_feed, #require_admin, #require_login, #set_localization, #user_setup

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

Methods included from Redmine::Search::Controller

#default_search_scope, #default_search_scopes, included

Methods included from Redmine::MenuManager::MenuController

#current_menu_item, included, #menu_items, #redirect_to_project_menu_item

Instance Method Details

- (Object) add_attachment



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

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

- (Object) annotate



138
139
140
141
# File 'app/controllers/wiki_controller.rb', line 138

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

- (Object) destroy

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



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'app/controllers/wiki_controller.rb', line 145

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 => 'special', :id => @project, :page => 'Page_index'
end

- (Object) diff



133
134
135
136
# File 'app/controllers/wiki_controller.rb', line 133

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

- (Object) edit

edit an existing page or a new one



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/controllers/wiki_controller.rb', line 65

def edit
  @page = @wiki.find_or_new_page(params[:page])    
  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 request.get?
    # To prevent StaleObjectError exception when reverting to a previous version
    @content.version = @page.content.version
  else
    if !@page.new_record? && @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 => 'index', :id => @project, :page => @page.title
      return
    end
    #@content.text = params[:content][:text]
    #@content.comments = params[:content][:comments]
    @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 => 'index', :id => @project, :page => @page.title
    end
  end
rescue ActiveRecord::StaleObjectError
  # Optimistic locking exception
  flash[:error] = l(:notice_locking_conflict)
end

- (Object) history

show page history



120
121
122
123
124
125
126
127
128
129
130
131
# File 'app/controllers/wiki_controller.rb', line 120

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

- (Object) index

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



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/controllers/wiki_controller.rb', line 32

def index
  page_title = params[:page]
  @page = @wiki.find_or_new_page(page_title)
  if @page.new_record?
    if User.current.allowed_to?(:edit_wiki_pages, @project)
      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

- (Object) preview



202
203
204
205
206
207
208
209
210
211
212
# File 'app/controllers/wiki_controller.rb', line 202

def preview
  page = @wiki.find_page(params[:page])
  # 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

- (Object) protect



114
115
116
117
# File 'app/controllers/wiki_controller.rb', line 114

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

- (Object) rename

rename a page



103
104
105
106
107
108
109
110
111
112
# File 'app/controllers/wiki_controller.rb', line 103

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 => 'index', :id => @project, :page => @page.title
  end
end

- (Object) special

display special pages



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'app/controllers/wiki_controller.rb', line 173

def special
  page_title = params[:page].downcase
  case page_title
  # show pages index, sorted by title
  when 'page_index', 'date_index'
    # eager load information about last updates, without loading text
    @pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
                                    :joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id",
                                    :order => 'title'
    @pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
    @pages_by_parent_id = @pages.group_by(&:parent_id)
  # export wiki to a single html file
  when '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 => 'index', :id => @project, :page => nil
    end
    return      
  else
    # requested special page doesn't exist, redirect to default page
    redirect_to :action => 'index', :id => @project, :page => nil
    return
  end
  render :action => "special_#{page_title}"
end