]> source.dussan.org Git - redmine.git/commitdiff
Adds an application setting to limit the number of items that can be displayed on...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 15 Dec 2010 21:18:06 +0000 (21:18 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 15 Dec 2010 21:18:06 +0000 (21:18 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4513 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/views/gantts/show.html.erb
app/views/settings/_issues.rhtml
config/locales/en.yml
config/locales/fr.yml
config/settings.yml
lib/redmine/helpers/gantt.rb
test/unit/lib/redmine/helpers/gantt_test.rb

index 4f3026065da3bf792be1670694d3b386c8f57ef9..d0f4f9f294476791cb1d90ad2d2cc301cb6fcc97 100644 (file)
@@ -67,6 +67,11 @@ t_height = g_height + headers_height
 
 
 %>
+
+<% if @gantt.truncated %>
+       <p class="warning"><%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %></p>
+<% end %>
+
 <table width="100%" style="border:0; border-collapse: collapse;">
 <tr>
 <td style="width:<%= subject_width %>px; padding:0px;">
index 4280e44b58fa4bccfbba8a9ad95a0189081fb94b..273d4b581bcad5d5148378aef583f35cad532f32 100644 (file)
@@ -8,6 +8,8 @@
 <p><%= setting_select :issue_done_ratio, Issue::DONE_RATIO_OPTIONS.collect {|i| [l("setting_issue_done_ratio_#{i}"), i]} %></p>
 
 <p><%= setting_text_field :issues_export_limit, :size => 6 %></p>
+
+<p><%= setting_text_field :gantt_items_limit, :size => 6 %></p>
 </div>
 
 <fieldset class="box settings"><legend><%= l(:setting_issue_list_default_columns) %></legend>
index e559d01c24e785f7fb65d9fc75883681f4a8690c..0cd45deed809599d1f04eac4415317d05b9638e2 100644 (file)
@@ -163,6 +163,7 @@ en:
   notice_unable_delete_version: Unable to delete version.
   notice_unable_delete_time_entry: Unable to delete time log entry.
   notice_issue_done_ratios_updated: Issue done ratios updated.
+  notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed ({{max}})"
   
   error_can_t_load_default_data: "Default configuration could not be loaded: {{value}}"
   error_scm_not_found: "The entry or revision was not found in the repository."
@@ -356,6 +357,7 @@ en:
   setting_default_notification_option: Default notification option
   setting_commit_logtime_enabled: Enable time logging
   setting_commit_logtime_activity_id: Activity for logged time
+  setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
   
   permission_add_project: Create project
   permission_add_subprojects: Create subprojects
index 897c6312f8116244690fe3ab859331658865a7db..f7438c1589053946180240da5325fdf964a6b55c 100644 (file)
@@ -180,6 +180,7 @@ fr:
   notice_unable_delete_version: Impossible de supprimer cette version.
   notice_issue_done_ratios_updated: L'avancement des demandes a été mis à jour.
   notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée.
+  notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés ({{max}})"
   
   error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramétrage : {{value}}"
   error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt."
@@ -360,6 +361,7 @@ fr:
   setting_cache_formatted_text: Mettre en cache le texte formaté
   setting_commit_logtime_enabled: Permettre la saisie de temps
   setting_commit_logtime_activity_id: Activité pour le temps saisi
+  setting_gantt_items_limit: Nombre maximum d'éléments affichés sur le gantt
   
   permission_add_project: Créer un projet
   permission_add_subprojects: Créer des sous-projets
index 74647eb5a146922f069d1549e7d9e844a72c05fb..6a9676a9085715130fd3d425daa04ebb4dba47b4 100644 (file)
@@ -66,6 +66,9 @@ protocol:
 feeds_limit:
   format: int
   default: 15
+gantt_items_limit:
+  format: int
+  default: 500
 # Maximum size of files that can be displayed
 # inline through the file viewer (in KB)
 file_max_size_displayed:
index 79088dfe54736b22073aabbf1e3dd284f5da602d..754d31de61b0f84ac26d94fa5d53edd88c9e7856 100644 (file)
@@ -34,7 +34,7 @@ module Redmine
         end
       end
 
-      attr_reader :year_from, :month_from, :date_from, :date_to, :zoom, :months
+      attr_reader :year_from, :month_from, :date_from, :date_to, :zoom, :months, :truncated, :max_rows
       attr_accessor :query
       attr_accessor :project
       attr_accessor :view
@@ -71,6 +71,13 @@ module Redmine
         @subjects = ''
         @lines = ''
         @number_of_rows = nil
+        
+        @truncated = false
+        if options.has_key?(:max_rows)
+          @max_rows = options[:max_rows]
+        else
+          @max_rows = Setting.gantt_items_limit.blank? ? nil : Setting.gantt_items_limit.to_i
+        end
       end
 
       def common_params
@@ -94,13 +101,15 @@ module Redmine
       def number_of_rows
         return @number_of_rows if @number_of_rows
         
-        if @project
-          return number_of_rows_on_project(@project)
+        rows = if @project
+          number_of_rows_on_project(@project)
         else
           Project.roots.visible.has_module('issue_tracking').inject(0) do |total, project|
             total += number_of_rows_on_project(project)
           end
         end
+        
+        rows > @max_rows ? @max_rows : rows
       end
 
       # Returns the number of rows that will be used to list a project on
@@ -156,6 +165,7 @@ module Redmine
         else
           Project.roots.visible.has_module('issue_tracking').each do |project|
             render_project(project, options)
+            break if abort?
           end
         end
         
@@ -176,22 +186,26 @@ module Redmine
         options[:top] += options[:top_increment]
         options[:indent] += options[:indent_increment]
         @number_of_rows += 1
+        return if abort?
         
         # Second, Issues without a version
-        issues = project.issues.for_gantt.without_version.with_query(@query)
+        issues = project.issues.for_gantt.without_version.with_query(@query).all(:limit => current_limit)
         sort_issues!(issues)
         if issues
           render_issues(issues, options)
+          return if abort?
         end
 
         # Third, Versions
         project.versions.sort.each do |version|
           render_version(version, options)
+          return if abort?
         end
 
         # Fourth, subprojects
         project.children.visible.has_module('issue_tracking').each do |project|
           render_project(project, options)
+          return if abort?
         end
 
         # Remove indent to hit the next sibling
@@ -205,6 +219,7 @@ module Redmine
           
           options[:top] += options[:top_increment]
           @number_of_rows += 1
+          return if abort?
         end
       end
 
@@ -215,13 +230,14 @@ module Redmine
         
         options[:top] += options[:top_increment]
         @number_of_rows += 1
+        return if abort?
         
         # Remove the project requirement for Versions because it will
         # restrict issues to only be on the current project.  This
         # ends up missing issues which are assigned to shared versions.
         @query.project = nil if @query.project
         
-        issues = version.fixed_issues.for_gantt.with_query(@query)
+        issues = version.fixed_issues.for_gantt.with_query(@query).all(:limit => current_limit)
         if issues
           sort_issues!(issues)
           # Indent issues
@@ -961,6 +977,20 @@ module Redmine
         end
       end
       
+      def current_limit
+        if @max_rows
+          @max_rows - @number_of_rows
+        else
+          nil
+        end
+      end
+      
+      def abort?
+        if @max_rows && @number_of_rows >= @max_rows
+          @truncated = true
+        end
+      end
+      
       def pdf_new_page?(options)
         if options[:top] > 180
           options[:pdf].Line(15, options[:top], PDF::TotalWidth, options[:top])
index f54dfe350e93c9d85c3a21e6923f11372e206a6e..401eabf4358362df94af39a87b0854a8666342f5 100644 (file)
@@ -53,9 +53,9 @@ class Redmine::Helpers::GanttTest < ActiveSupport::TestCase
   end
 
   # Creates a Gantt chart for a 4 week span
-  def create_gantt(project=Project.generate!)
+  def create_gantt(project=Project.generate!, options={})
     @project = project
-    @gantt = Redmine::Helpers::Gantt.new
+    @gantt = Redmine::Helpers::Gantt.new(options)
     @gantt.project = @project
     @gantt.query = Query.generate_default!(:project => @project)
     @gantt.view = build_view
@@ -73,6 +73,22 @@ class Redmine::Helpers::GanttTest < ActiveSupport::TestCase
       should "return the total number of rows for all the projects, resursively"
     end
 
+    should "not exceed max_rows option" do
+      p = Project.generate!
+      5.times do
+        Issue.generate_for_project!(p)
+      end
+      
+      create_gantt(p)
+      @gantt.render
+      assert_equal 6, @gantt.number_of_rows
+      assert !@gantt.truncated
+
+      create_gantt(p, :max_rows => 3)
+      @gantt.render
+      assert_equal 3, @gantt.number_of_rows
+      assert @gantt.truncated
+    end
   end
 
   context "#number_of_rows_on_project" do