[PATCH] RM3311 added date select, ordering options, and csv export to log history

Tzu-Mainn Chen tzumainn at redhat.com
Mon Jun 4 04:25:32 UTC 2012


---
 src/app/controllers/logs_controller.rb |   80 ++++++++++++++++++++++++++++++--
 src/app/views/logs/index.html.haml     |   12 +++++
 src/config/locales/en.yml              |   10 ++++
 src/config/routes.rb                   |    5 ++-
 src/features/logs.feature              |    3 +-
 5 files changed, 103 insertions(+), 7 deletions(-)

diff --git a/src/app/controllers/logs_controller.rb b/src/app/controllers/logs_controller.rb
index 8b9e5c4..2441fd5 100644
--- a/src/app/controllers/logs_controller.rb
+++ b/src/app/controllers/logs_controller.rb
@@ -30,11 +30,42 @@ class LogsController < ApplicationController
   end
 
   def filter
-    redirect_to_original({"source_type" => params[:source_type],
+    redirect_to_original({ "source_type" => params[:source_type],
                            "pool_select" => params[:pool_select],
                            "provider_select" => params[:provider_select],
                            "owner_id" => params[:owner_id],
-                           "state" => params[:state]})
+                           "state" => params[:state],
+                           "from_date" => params[:from_date],
+                           "to_date" => params[:to_date],
+                           "order" => params[:order] })
+  end
+
+  def export_logs
+    load_logs
+    load_headers
+
+    csvm = Object.const_defined?(:FasterCSV) ? FasterCSV : CSV
+    csv_string = csvm.generate(:col_sep => ";", :row_sep => "\r\n") do |csv|
+      csv << @header.map {|header| header[:name].capitalize }
+
+      unless @events.nil?
+        @events.each do |event|
+          source = event.source
+          provider_account = source.nil? ? nil : source.provider_account
+          csv << [ event.event_time.strftime("%d-%b-%Y %H:%M:%S"),
+                   source.nil? ? t('logs.index.not_available') : source.name,
+                   source.nil? ? t('logs.index.not_available') : source.state,
+                   source.nil? ? t('logs.index.not_available') : source.pool_family.name + "/" + source.pool.name,
+                   provider_account.nil? ? t('logs.index.not_available') : provider_account.provider.name + "/" + provider_account.name,
+                   source.nil? ? t('logs.index.not_available') : source.owner.login,
+                   event.summary ]
+        end
+      end
+    end
+
+    send_data(csv_string,
+              :type => 'text/csv; charset=utf-8; header=present',
+              :filename => "export.csv")
   end
 
   protected
@@ -46,16 +77,29 @@ class LogsController < ApplicationController
       params[:provider_select].nil? ? "" : params[:provider_select]
     @owner_id = params[:owner_id].nil? ? "" : params[:owner_id]
     @state = params[:state].nil? ? "" : params[:state]
+    @order = params[:order].nil? ? t('logs.options.time_order') : params[:order]
+    @from_date = params[:from_date].nil? ? Date.today - 7.days :
+      Date.civil(params[:from_date][:year].to_i,
+                 params[:from_date][:month].to_i,
+                 params[:from_date][:day].to_i)
+    @to_date = params[:to_date].nil? ? Date.today + 1.days :
+      Date.civil(params[:to_date][:year].to_i,
+                 params[:to_date][:month].to_i,
+                 params[:to_date][:day].to_i)
 
-    conditions = []
     if @source_type.present?
-      conditions += ["source_type = ?", @source_type]
+      conditions = ["event_time between ? and ? and source_type = ?",
+                    @from_date, @to_date, @source_type]
+    else
+      conditions = ["event_time between ? and ?",
+                    @from_date, @to_date]
     end
 
     @events = Event.unscoped.find(:all,
                                   :include =>
                                   {:source => [:pool_family, :pool, :owner]},
-                                  :conditions => conditions
+                                  :conditions => conditions,
+                                  :order => "event_time asc"
                                   )
     deployments = Deployment.unscoped.list_for_user(current_user,
                                                     Privilege::VIEW)
@@ -100,6 +144,25 @@ class LogsController < ApplicationController
       true
     }
 
+    case @order
+    when t('logs.options.deployment_instance_order')
+      @events = @events.sort_by {|event|
+        (event.source.nil? ? "" : event.source.name)}
+    when t('logs.options.state_order')
+      @events = @events.sort_by {|event|
+        (event.source.nil? ? "" : 
+         (event.source.state.nil? ? "" : event.source.state))}
+    when t('logs.options.pool_order')
+      @events = @events.sort_by {|event|
+        (event.source.nil? ? "" : event.source.pool_family.name)}
+    when t('logs.options.provider_order')
+      @events = @events.sort_by {|event|
+        (event.source.nil? ? "" : event.source.provider_account.name)}
+    when t('logs.options.owner_order')
+      @events = @events.sort_by {|event|
+        (event.source.nil? ? "" : event.source.owner.login)}
+    end
+
     @paginated_events = paginate_collection(@events, params[:page], PER_PAGE)
   end
 
@@ -128,6 +191,12 @@ class LogsController < ApplicationController
     @owner_options = [[t('logs.options.default_users'), ""]] +
       User.find(:all, :order => "login",
                 :select => ["id", "login"]).map{|x| [x.login, x.id]}
+    @order_options = [t('logs.options.time_order'),
+                      t('logs.options.deployment_instance_order'),
+                      t('logs.options.state_order'),
+                      t('logs.options.pool_order'),
+                      t('logs.options.provider_order'),
+                      t('logs.options.owner_order')]
   end
 
   def load_headers
@@ -142,4 +211,5 @@ class LogsController < ApplicationController
       { :name => "", :sortable => false },
     ]
   end
+
 end
diff --git a/src/app/views/logs/index.html.haml b/src/app/views/logs/index.html.haml
index b76d620..36cd965 100644
--- a/src/app/views/logs/index.html.haml
+++ b/src/app/views/logs/index.html.haml
@@ -16,6 +16,18 @@
         = select_tag "owner_id", options_for_select(@owner_options, @owner_id)
         = restful_submit_tag t("filter_table.apply_filters"), "index", filter_logs_path, 'POST', :class => 'button', :id => 'apply_logs_filter'
         %span.label.badge.dark= @events.count
+      %br
+        = t('filter_table.from')
+        = select_date @from_date, :prefix => :from_date
+        = t('filter_table.to')
+        = select_date @to_date, :prefix => :to_date
+        = t('filter_table.order_by')
+        = select_tag "order", options_for_select(@order_options, @order)
+        %li.more_actions
+          %span
+            = image_tag "more_actions_drop.png"
+          %ul
+            %li= link_to "#{t'logs.index.export_logs'}", export_logs_logs_path(:source_type => @source_type, :state => @state, :pool_select => @pool_select, :provider_select => @provider_select, :owner_id => @owner_id, :from_date => {:day => @from_date.day, :month => @from_date.month, :year => @from_date.year}, :to_date => {:day => @to_date.day, :month => @to_date.month, :year => @to_date.year}, :order => @order)
 
     = filter_table(@header, @paginated_events) do |event|
       - source = event.source
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index b198935..a4a2ddd 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -19,6 +19,12 @@ en:
       instance_event_type: Instance
       default_pools: All Pools
       default_providers: All Providers
+      time_order: Time
+      deployment_instance_order: Deployment/Instance
+      state_order: State
+      pool_order: Pool
+      provider_order: Provider
+      owner_order: Owner
     index:
       title: Logs
       not_available: N/A
@@ -35,6 +41,7 @@ en:
       frontend_realm: Frontend Realm
       image: Image
       hwp: Hardware Profile
+      export_logs: Export logs
   users:
     users: "Users"
     return_to: "Return to:"
@@ -1235,6 +1242,9 @@ en:
     none: None
   filter_table:
     viewing: Viewing
+    from: From
+    to: To
+    order_by: Order By
     results: Results
     search: Search
     apply_filters: "Apply filters"
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 265f752..fe72be1 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -157,7 +157,10 @@ Conductor::Application.routes.draw do
   end
 
   resources :logs do
-    post :filter, :on => :collection
+    collection do
+      post 'filter'
+      get 'export_logs'
+    end
   end
 
   resources :config_servers do
diff --git a/src/features/logs.feature b/src/features/logs.feature
index 98bbe34..3ebe42b 100644
--- a/src/features/logs.feature
+++ b/src/features/logs.feature
@@ -8,7 +8,8 @@ Feature: View Logs
     And I am logged in
 
   Scenario: View logs
-    Given there is a deployment named "MySQL Cluster" belonging to "Databases" owned by "bob"
+    Given there is a deployment named "Test-Deployment" belonging to "Databases" owned by "bob"
+    And deployement "Test-Deployment" has associated event "testevent"
     And I am on the logs page
     Then I should see "created"
     When I select "stopped" from "state"
-- 
1.7.6.5




More information about the aeolus-devel mailing list