]> source.dussan.org Git - redmine.git/commitdiff
Refactor: extract method in WikiController#special to create a new #export method
authorEric Davis <edavis@littlestreamsoftware.com>
Wed, 13 Oct 2010 17:13:50 +0000 (17:13 +0000)
committerEric Davis <edavis@littlestreamsoftware.com>
Wed, 13 Oct 2010 17:13:50 +0000 (17:13 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4251 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/wiki_controller.rb
app/views/wiki/special_date_index.rhtml
app/views/wiki/special_page_index.rhtml
config/routes.rb
lib/redmine.rb
test/functional/wiki_controller_test.rb
test/integration/routing_test.rb

index 55194e0487dd5ef4538e6df14dd1eeba94c50b33..10890495f3c0be170be832321ef869b330a14dee 100644 (file)
@@ -181,16 +181,9 @@ class WikiController < ApplicationController
                                       :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      
+      redirect_to :action => 'export', :id => @project # Compatibility stub while refactoring
+      return
     else
       # requested special page doesn't exist, redirect to default page
       redirect_to :action => 'index', :id => @project, :page => nil
@@ -198,6 +191,17 @@ class WikiController < ApplicationController
     end
     render :action => "special_#{page_title}"
   end
+
+  # Export wiki to a single html file
+  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 => 'index', :id => @project, :page => nil
+    end
+  end
   
   def preview
     page = @wiki.find_page(params[:page])
index b34fb84645a691e7a39635f41f49eacdfd48ec0b..957c15967d46e817fb0ac24a5af1bae29538580c 100644 (file)
@@ -24,7 +24,7 @@
 <% unless @pages.empty? %>
 <% other_formats_links do |f| %>
        <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
-       <%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
+       <%= f.link_to('HTML', :url => {:action => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
 <% end %>
 <% end %>
 
index e2d1e44ad8b451e7b89b0ff9b417168e37d29d18..e85f83b91e66d0a7d4050ee6fd397e976ed459df 100644 (file)
@@ -17,7 +17,7 @@
 <% unless @pages.empty? %>
 <% other_formats_links do |f| %>
        <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
-       <%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
+       <%= f.link_to('HTML', :url => {:action => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
 <% end %>
 <% end %>
 
index 0d52476d05a941b661e2cf832c2dac29605d1076..4bb893dae2f05a3fdc687c27e310fc2428b788b1 100644 (file)
@@ -29,7 +29,8 @@ ActionController::Routing::Routes.draw do |map|
   map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :post}
   map.with_options :controller => 'wiki' do |wiki_routes|
     wiki_routes.with_options :conditions => {:method => :get} do |wiki_views|
-      wiki_views.connect 'projects/:id/wiki/:page', :action => 'special', :page => /page_index|date_index|export/i
+      wiki_views.connect 'projects/:id/wiki/export', :action => 'export'
+      wiki_views.connect 'projects/:id/wiki/:page', :action => 'special', :page => /page_index|date_index/i
       wiki_views.connect 'projects/:id/wiki/:page', :action => 'index', :page => nil
       wiki_views.connect 'projects/:id/wiki/:page/edit', :action => 'edit'
       wiki_views.connect 'projects/:id/wiki/:page/rename', :action => 'rename'
index e5694a705d7a249de25cb37db3bec9e8ef53d6dc..9537077811067f5f9b3cfdd0c8ec72eebb3e8437 100644 (file)
@@ -112,7 +112,7 @@ Redmine::AccessControl.map do |map|
     map.permission :rename_wiki_pages, {:wiki => :rename}, :require => :member
     map.permission :delete_wiki_pages, {:wiki => :destroy}, :require => :member
     map.permission :view_wiki_pages, :wiki => [:index, :special]
-    map.permission :export_wiki_pages, {}
+    map.permission :export_wiki_pages, :wiki => [:export]
     map.permission :view_wiki_edits, :wiki => [:history, :diff, :annotate]
     map.permission :edit_wiki_pages, :wiki => [:edit, :preview, :add_attachment]
     map.permission :delete_wiki_pages_attachments, {}
index 76aa024675ea92f06a977fccd46cdbc85babe400..6b0a6cc5ce831529f4125b92786ac5454a2f2423 100644 (file)
@@ -256,6 +256,34 @@ class WikiControllerTest < ActionController::TestCase
                     :child => { :tag => 'li', :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Another_page' },
                                                                        :content => 'Another page' } }
   end
+
+  context "GET :export" do
+    context "with an authorized user to export the wiki" do
+      setup do
+        @request.session[:user_id] = 2
+        get :export, :id => 'ecookbook'
+      end
+      
+      should_respond_with :success
+      should_assign_to :pages
+      should_respond_with_content_type "text/html"
+      should "export all of the wiki pages to a single html file" do
+        assert_select "a[name=?]", "CookBook_documentation"
+        assert_select "a[name=?]", "Another_page"
+        assert_select "a[name=?]", "Page_with_an_inline_image"
+      end
+      
+    end
+
+    context "with an unauthorized user" do
+      setup do
+        get :export, :id => 'ecookbook'
+
+        should_respond_with :redirect
+        should_redirect_to('wiki index') { {:action => 'index', :id => @project, :page => nil} }
+      end
+    end
+  end
   
   def test_not_found
     get :index, :id => 999
index 25755dc3639c869bdca7d9ac7429c84b06d6521b..e20d8ad19df48782b066367830452614c63a6efe 100644 (file)
@@ -321,7 +321,7 @@ class RoutingTest < ActionController::IntegrationTest
     should_route :get, "/projects/567/wiki/page_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'page_index'
     should_route :get, "/projects/567/wiki/Page_Index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'Page_Index'
     should_route :get, "/projects/567/wiki/date_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'date_index'
-    should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'special', :id => '567', :page => 'export'
+    should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'export', :id => '567'
     
     should_route :post, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
     should_route :post, "/projects/567/wiki/CookBook_documentation/preview", :controller => 'wiki', :action => 'preview', :id => '567', :page => 'CookBook_documentation'