@@ -1,5 +1,5 | |||||
1 |
# |
|
1 | # Redmine - project management software | |
2 |
# Copyright (C) 2006-20 |
|
2 | # Copyright (C) 2006-2011 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
@@ -44,7 +44,14 class WikiController < ApplicationController | |||||
44 |
|
44 | |||
45 | # List of pages, sorted alphabetically and by parent (hierarchy) |
|
45 | # List of pages, sorted alphabetically and by parent (hierarchy) | |
46 | def index |
|
46 | def index | |
47 | load_pages_grouped_by_date_without_content |
|
47 | load_pages_for_index | |
|
48 | @pages_by_parent_id = @pages.group_by(&:parent_id) | |||
|
49 | end | |||
|
50 | ||||
|
51 | # List of page, by last update | |||
|
52 | def date_index | |||
|
53 | load_pages_for_index | |||
|
54 | @pages_by_date = @pages.group_by {|p| p.updated_on.to_date} | |||
48 | end |
|
55 | end | |
49 |
|
56 | |||
50 | # display a page (in editing mode if it doesn't exist) |
|
57 | # display a page (in editing mode if it doesn't exist) | |
@@ -215,10 +222,6 class WikiController < ApplicationController | |||||
215 | redirect_to :action => 'show', :project_id => @project, :id => nil |
|
222 | redirect_to :action => 'show', :project_id => @project, :id => nil | |
216 | end |
|
223 | end | |
217 | end |
|
224 | end | |
218 |
|
||||
219 | def date_index |
|
|||
220 | load_pages_grouped_by_date_without_content |
|
|||
221 | end |
|
|||
222 |
|
225 | |||
223 | def preview |
|
226 | def preview | |
224 | page = @wiki.find_page(params[:id]) |
|
227 | page = @wiki.find_page(params[:id]) | |
@@ -266,14 +269,8 private | |||||
266 | extend helper unless self.instance_of?(helper) |
|
269 | extend helper unless self.instance_of?(helper) | |
267 | helper.instance_method(:initial_page_content).bind(self).call(page) |
|
270 | helper.instance_method(:initial_page_content).bind(self).call(page) | |
268 | end |
|
271 | end | |
269 |
|
||||
270 | # eager load information about last updates, without loading text |
|
|||
271 | def load_pages_grouped_by_date_without_content |
|
|||
272 | @pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on", |
|
|||
273 | :joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id", |
|
|||
274 | :order => 'title' |
|
|||
275 | @pages_by_date = @pages.group_by {|p| p.updated_on.to_date} |
|
|||
276 | @pages_by_parent_id = @pages.group_by(&:parent_id) |
|
|||
277 | end |
|
|||
278 |
|
272 | |||
|
273 | def load_pages_for_index | |||
|
274 | @pages = @wiki.pages.with_updated_on.all(:order => 'title', :include => {:wiki => :project}) | |||
|
275 | end | |||
279 | end |
|
276 | end |
@@ -1,5 +1,5 | |||||
1 | # Redmine - project management software |
|
1 | # Redmine - project management software | |
2 |
# Copyright (C) 2006-201 |
|
2 | # Copyright (C) 2006-2011 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
@@ -194,7 +194,7 module ApplicationHelper | |||||
194 | pages[node].each do |page| |
|
194 | pages[node].each do |page| | |
195 | content << "<li>" |
|
195 | content << "<li>" | |
196 | content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title}, |
|
196 | content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title}, | |
197 |
:title => (page. |
|
197 | :title => (page.updated_on ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil)) | |
198 | content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id] |
|
198 | content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id] | |
199 | content << "</li>\n" |
|
199 | content << "</li>\n" | |
200 | end |
|
200 | end |
@@ -41,6 +41,12 class WikiPage < ActiveRecord::Base | |||||
41 | validates_uniqueness_of :title, :scope => :wiki_id, :case_sensitive => false |
|
41 | validates_uniqueness_of :title, :scope => :wiki_id, :case_sensitive => false | |
42 | validates_associated :content |
|
42 | validates_associated :content | |
43 |
|
43 | |||
|
44 | # eager load information about last updates, without loading text | |||
|
45 | named_scope :with_updated_on, { | |||
|
46 | :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on", | |||
|
47 | :joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id" | |||
|
48 | } | |||
|
49 | ||||
44 | # Wiki pages that are protected by default |
|
50 | # Wiki pages that are protected by default | |
45 | DEFAULT_PROTECTED_PAGES = %w(sidebar) |
|
51 | DEFAULT_PROTECTED_PAGES = %w(sidebar) | |
46 |
|
52 | |||
@@ -121,6 +127,18 class WikiPage < ActiveRecord::Base | |||||
121 | content.text if content |
|
127 | content.text if content | |
122 | end |
|
128 | end | |
123 |
|
129 | |||
|
130 | def updated_on | |||
|
131 | unless @updated_on | |||
|
132 | if time = read_attribute(:updated_on) | |||
|
133 | # content updated_on was eager loaded with the page | |||
|
134 | @updated_on = Time.parse(time) rescue nil | |||
|
135 | else | |||
|
136 | @updated_on = content && content.updated_on | |||
|
137 | end | |||
|
138 | end | |||
|
139 | @updated_on | |||
|
140 | end | |||
|
141 | ||||
124 | # Returns true if usr is allowed to edit the page, otherwise false |
|
142 | # Returns true if usr is allowed to edit the page, otherwise false | |
125 | def editable_by?(usr) |
|
143 | def editable_by?(usr) | |
126 | !protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project) |
|
144 | !protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project) |
@@ -1,5 +1,5 | |||||
1 |
# |
|
1 | # Redmine - project management software | |
2 |
# Copyright (C) 2006-20 |
|
2 | # Copyright (C) 2006-2011 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
@@ -339,6 +339,7 class WikiControllerTest < ActionController::TestCase | |||||
339 | pages = assigns(:pages) |
|
339 | pages = assigns(:pages) | |
340 | assert_not_nil pages |
|
340 | assert_not_nil pages | |
341 | assert_equal Project.find(1).wiki.pages.size, pages.size |
|
341 | assert_equal Project.find(1).wiki.pages.size, pages.size | |
|
342 | assert_equal pages.first.content.updated_on, pages.first.updated_on | |||
342 |
|
343 | |||
343 | assert_tag :ul, :attributes => { :class => 'pages-hierarchy' }, |
|
344 | assert_tag :ul, :attributes => { :class => 'pages-hierarchy' }, | |
344 | :child => { :tag => 'li', :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/CookBook_documentation' }, |
|
345 | :child => { :tag => 'li', :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/CookBook_documentation' }, |
@@ -1,5 +1,5 | |||||
1 |
# |
|
1 | # Redmine - project management software | |
2 |
# Copyright (C) 2006-20 |
|
2 | # Copyright (C) 2006-2011 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
@@ -121,4 +121,11 class WikiPageTest < ActiveSupport::TestCase | |||||
121 | assert_nil child.parent_id |
|
121 | assert_nil child.parent_id | |
122 | end |
|
122 | end | |
123 | end |
|
123 | end | |
|
124 | ||||
|
125 | def test_updated_on_eager_load | |||
|
126 | page = WikiPage.with_updated_on.first | |||
|
127 | assert page.is_a?(WikiPage) | |||
|
128 | assert_not_nil page.read_attribute(:updated_on) | |||
|
129 | assert_equal page.content.updated_on, page.updated_on | |||
|
130 | end | |||
124 | end |
|
131 | end |
General Comments 0
You need to be logged in to leave comments.
Login now