]> source.dussan.org Git - redmine.git/commitdiff
Added fragment caching for calendar and gantt views
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 6 May 2007 16:40:33 +0000 (16:40 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 6 May 2007 16:40:33 +0000 (16:40 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@515 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/controllers/projects_controller.rb
app/sweepers/issue_sweeper.rb [new file with mode: 0644]
app/views/projects/calendar.rhtml
app/views/projects/gantt.rhtml
config/environment.rb

index 9c16d299bb5be8573d3c490a5bf5a789e8f61f0b..cec126dd3fe87148f83e9e0b080cf1a67987e755 100644 (file)
@@ -18,6 +18,8 @@
 class IssuesController < ApplicationController
   layout 'base', :except => :export_pdf
   before_filter :find_project, :authorize
+  
+  cache_sweeper :issue_sweeper, :only => [ :edit, :change_status, :destroy ]
 
   helper :custom_fields
   include CustomFieldsHelper
index a870cca2a9dec9b4246b01808c49020f333fe106..ca6ea8d8e7af6a6a1068fa086ca793e0dc530c83 100644 (file)
@@ -21,6 +21,8 @@ class ProjectsController < ApplicationController
   layout 'base'
   before_filter :find_project, :authorize, :except => [ :index, :list, :add ]
   before_filter :require_admin, :only => [ :add, :destroy ]
+  
+  cache_sweeper :issue_sweeper, :only => [ :add_issue ]
 
   helper :sort
   include SortHelper
diff --git a/app/sweepers/issue_sweeper.rb b/app/sweepers/issue_sweeper.rb
new file mode 100644 (file)
index 0000000..dc90205
--- /dev/null
@@ -0,0 +1,38 @@
+# redMine - project management software
+# Copyright (C) 2006-2007  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+class IssueSweeper < ActionController::Caching::Sweeper
+  observe Issue
+
+  def after_save(issue)
+    expire_cache_for(issue)
+  end
+  
+  def after_destroy(issue)
+    expire_cache_for(issue)
+  end
+          
+private
+  def expire_cache_for(issue)
+    # fragments of the main project
+    expire_fragment(Regexp.new("projects/(calendar|gantt)/#{issue.project_id}\\."))
+    # fragments of the root project that include subprojects issues
+    unless issue.project.parent_id.nil?
+      expire_fragment(Regexp.new("projects/(calendar|gantt)/#{issue.project.parent_id}\\..*subprojects"))
+    end
+  end
+end
index c63365b6c87e16adf062791f3a4ee91b7370a8cf..2a53831fee1cf9a4f217573083033cfe93e9621f 100644 (file)
@@ -1,3 +1,4 @@
+<% cache(:year => @year, :month => @month, :tracker_ids => @selected_tracker_ids, :subprojects => params[:with_subprojects], :lang => current_language) do %>
 <h2><%= l(:label_calendar) %></h2>
 
 <% form_tag do %>
@@ -87,4 +88,5 @@ end %>
 
 <%= image_tag 'arrow_from.png' %>&nbsp;&nbsp;<%= l(:text_tip_task_begin_day) %><br />
 <%= image_tag 'arrow_to.png' %>&nbsp;&nbsp;<%= l(:text_tip_task_end_day) %><br />
-<%= image_tag 'arrow_bw.png' %>&nbsp;&nbsp;<%= l(:text_tip_task_begin_end_day) %><br />
\ No newline at end of file
+<%= image_tag 'arrow_bw.png' %>&nbsp;&nbsp;<%= l(:text_tip_task_begin_end_day) %><br />
+<% end %>
index 6359f04293af5bf96d6ed73c6485cca3c2824f17..317fd993d8d6008dfae73528ee99d257853fd7f6 100644 (file)
@@ -1,3 +1,28 @@
+<% zoom = 1
+@zoom.times { zoom = zoom * 2 }
+
+subject_width = 330
+header_heigth = 18
+
+headers_height = header_heigth
+show_weeks = false
+show_days = false
+
+if @zoom >1
+    show_weeks = true
+    headers_height = 2*header_heigth
+    if @zoom > 2
+        show_days = true
+        headers_height = 3*header_heigth
+    end
+end
+
+g_width = (@date_to - @date_from + 1)*zoom
+g_height = [(20 * @events.length + 6)+150, 206].max
+t_height = g_height + headers_height
+%>
+
+<% cache(:year => @year_from, :month => @month_from, :months => @months, :zoom => @zoom, :tracker_ids => @selected_tracker_ids, :subprojects => params[:with_subprojects], :lang => current_language) do %>
 <div class="contextual">
 <%= l(:label_export_to) %>
 <%= link_to 'PDF', {:zoom => @zoom, :year => @year_from, :month => @month_from, :months => @months, :tracker_ids => @selected_tracker_ids, :with_subprojects => params[:with_subprojects], :output => 'pdf'}, :class => 'icon icon-pdf' %>
 </table>
 <% end %>
 
-<% zoom = 1
-@zoom.times { zoom = zoom * 2 }
-
-subject_width = 330
-header_heigth = 18
-
-headers_height = header_heigth
-show_weeks = false
-show_days = false
-
-if @zoom >1
-    show_weeks = true
-    headers_height = 2*header_heigth
-    if @zoom > 2
-        show_days = true
-        headers_height = 3*header_heigth
-    end
-end
-
-g_width = (@date_to - @date_from + 1)*zoom
-g_height = [(20 * @events.length + 6)+150, 206].max
-t_height = g_height + headers_height
-%>
-
 <table width="100%" style="border:0; border-collapse: collapse;">
 <tr>
 <td style="width:<%= subject_width %>px;">
@@ -171,14 +172,6 @@ if show_days
        end
 end %>
 
-<%
-#
-# Today red line
-#
-if Date.today >= @date_from and Date.today <= @date_to %>
-    <div style="position: absolute;height:<%= g_height %>px;top:<%= headers_height + 1 %>px;left:<%= ((Date.today-@date_from+1)*zoom).floor()-1 %>px;width:10px;border-left: 1px dashed red;">&nbsp;</div>
-<% end %>
-
 <%
 #
 # Tasks
@@ -226,6 +219,18 @@ top = headers_height + 10
 <% end %>
        <% top = top + 20
 end %>
+
+<% end # cache 
+%>
+
+<%
+#
+# Today red line (excluded from cache)
+#
+if Date.today >= @date_from and Date.today <= @date_to %>
+    <div style="position: absolute;height:<%= g_height %>px;top:<%= headers_height + 1 %>px;left:<%= ((Date.today-@date_from+1)*zoom).floor()-1 %>px;width:10px;border-left: 1px dashed red;">&nbsp;</div>
+<% end %>
+
 </div>
 </td>
 </tr>
@@ -236,4 +241,4 @@ end %>
 <td align="left"><%= link_to ('&#171; ' + l(:label_previous)), :year => (@date_from << @months).year, :month => (@date_from << @months).month, :zoom => @zoom, :months => @months, :tracker_ids => @selected_tracker_ids, :with_subprojects => params[:with_subprojects] %></td>
 <td align="right"><%= link_to (l(:label_next) + ' &#187;'), :year => (@date_from >> @months).year, :month => (@date_from >> @months).month, :zoom => @zoom, :months => @months, :tracker_ids => @selected_tracker_ids, :with_subprojects => params[:with_subprojects] %></td>
 </tr>
-</table>
\ No newline at end of file
+</table>
index 8ff43e0ac88eb4446dfd7d0491ede4a3dfca7e8f..e5e7d0e4b1c0c5f206f0ee7bb76db961b37196d6 100644 (file)
@@ -13,8 +13,8 @@ Rails::Initializer.run do |config|
   # Skip frameworks you're not going to use
   # config.frameworks -= [ :action_web_service, :action_mailer ]
 
-  # Add additional load paths for your own custom dirs
-  # config.load_paths += %W( #{RAILS_ROOT}/extras )
+  # Add additional load paths for sweepers
+  config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
 
   # Force all environments to use the same logger level 
   # (by default production uses :info, the others :debug)