From 58792737394c59ecac08db2cea0eeebb836f160a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 11 Apr 2010 12:56:18 +0000 Subject: [PATCH] Makes the wiki sidebar editable (#5208). The content of the wiki page named 'Sidebar' is rendered in the sidebar if it exists. Permission to edit protected pages is required to create this page. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3632 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/wiki_controller.rb | 2 +- app/models/wiki.rb | 6 ++++++ app/models/wiki_content.rb | 4 ++++ app/models/wiki_page.rb | 9 +++++++++ app/views/wiki/_sidebar.rhtml | 4 ++++ test/functional/wiki_controller_test.rb | 11 +++++++++++ test/unit/wiki_page_test.rb | 7 +++++++ test/unit/wiki_test.rb | 19 +++++++++++++++++++ 8 files changed, 61 insertions(+), 1 deletion(-) diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index 60b59ff5f..55194e048 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -33,7 +33,7 @@ class WikiController < ApplicationController 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) + if User.current.allowed_to?(:edit_wiki_pages, @project) && editable? edit render :action => 'edit' else diff --git a/app/models/wiki.rb b/app/models/wiki.rb index b9a76fb32..9bd245955 100644 --- a/app/models/wiki.rb +++ b/app/models/wiki.rb @@ -29,6 +29,12 @@ class Wiki < ActiveRecord::Base !user.nil? && user.allowed_to?(:view_wiki_pages, project) end + # Returns the wiki page that acts as the sidebar content + # or nil if no such page exists + def sidebar + @sidebar ||= find_page('Sidebar', :with_redirect => false) + end + # find the page with the given title # if page doesn't exist, return a new page def find_or_new_page(title) diff --git a/app/models/wiki_content.rb b/app/models/wiki_content.rb index f81aa9e78..1f0eb9a62 100644 --- a/app/models/wiki_content.rb +++ b/app/models/wiki_content.rb @@ -34,6 +34,10 @@ class WikiContent < ActiveRecord::Base page.project end + def attachments + page.nil? ? [] : page.attachments + end + # Returns the mail adresses of users that should be notified def recipients notified = project.notified_users diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index ad2d8135a..010a8532c 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -41,6 +41,15 @@ class WikiPage < ActiveRecord::Base validates_uniqueness_of :title, :scope => :wiki_id, :case_sensitive => false validates_associated :content + # Wiki pages that are protected by default + DEFAULT_PROTECTED_PAGES = %w(sidebar) + + def after_initialize + if new_record? && DEFAULT_PROTECTED_PAGES.include?(title.to_s.downcase) + self.protected = true + end + end + def visible?(user=User.current) !user.nil? && user.allowed_to?(:view_wiki_pages, project) end diff --git a/app/views/wiki/_sidebar.rhtml b/app/views/wiki/_sidebar.rhtml index 20c087123..ad4b1d250 100644 --- a/app/views/wiki/_sidebar.rhtml +++ b/app/views/wiki/_sidebar.rhtml @@ -1,3 +1,7 @@ +<% if @wiki && @wiki.sidebar -%> + <%= textilizable @wiki.sidebar.content, :text %> +<% end -%> +

<%= l(:label_wiki) %>

<%= link_to l(:field_start_page), {:action => 'index', :page => nil} %>
diff --git a/test/functional/wiki_controller_test.rb b/test/functional/wiki_controller_test.rb index 3f9ac7eac..298cfee9c 100644 --- a/test/functional/wiki_controller_test.rb +++ b/test/functional/wiki_controller_test.rb @@ -70,6 +70,17 @@ class WikiControllerTest < ActionController::TestCase :alt => 'This is a logo' } end + def test_show_with_sidebar + page = Project.find(1).wiki.pages.new(:title => 'Sidebar') + page.content = WikiContent.new(:text => 'Side bar content for test_show_with_sidebar') + page.save! + + get :index, :id => 1, :page => 'Another_page' + assert_response :success + assert_tag :tag => 'div', :attributes => {:id => 'sidebar'}, + :content => /Side bar content for test_show_with_sidebar/ + end + def test_show_unexistent_page_without_edit_right get :index, :id => 1, :page => 'Unexistent page' assert_response 404 diff --git a/test/unit/wiki_page_test.rb b/test/unit/wiki_page_test.rb index 5c0def179..c8fd1b298 100644 --- a/test/unit/wiki_page_test.rb +++ b/test/unit/wiki_page_test.rb @@ -33,11 +33,18 @@ class WikiPageTest < ActiveSupport::TestCase page.title = "Page" assert page.save page.reload + assert !page.protected? @wiki.reload assert @wiki.pages.include?(page) end + def test_sidebar_should_be_protected_by_default + page = @wiki.find_or_new_page('sidebar') + assert page.new_record? + assert page.protected? + end + def test_find_or_new_page page = @wiki.find_or_new_page("CookBook documentation") assert_kind_of WikiPage, page diff --git a/test/unit/wiki_test.rb b/test/unit/wiki_test.rb index 6595e6dce..9303ce784 100644 --- a/test/unit/wiki_test.rb +++ b/test/unit/wiki_test.rb @@ -43,4 +43,23 @@ class WikiTest < ActiveSupport::TestCase assert_equal 'Page_title_with_CAPITALES', Wiki.titleize('page title with CAPITALES') assert_equal 'テスト', Wiki.titleize('テスト') end + + context "#sidebar" do + setup do + @wiki = Wiki.find(1) + end + + should "return nil if undefined" do + assert_nil @wiki.sidebar + end + + should "return a WikiPage if defined" do + page = @wiki.pages.new(:title => 'Sidebar') + page.content = WikiContent.new(:text => 'Side bar content for test_show_with_sidebar') + page.save! + + assert_kind_of WikiPage, @wiki.sidebar + assert_equal 'Sidebar', @wiki.sidebar.title + end + end end