From: Daniel Pittman <[email protected]>

Now that we perform various tasks, such as report imports, in the background
we don't have any immediate way to give users feedback on the outcome of their
task.

This adds infrastructure for collecting and displaying those problems to the
user as part of the normal operation of the dashboard.

The UI is partially completed; all the data is present, but the design is
awful.  This merges in sufficient functionality for our UX team to work on.

Paired-With: Josh Cooper <[email protected]>
Paired-With: Matt Robinson <[email protected]>
Signed-off-by: Josh Cooper <[email protected]>
---
Local-branch: feature/master/7967-display-report-import-failures
 app/controllers/delayed_job_failures_controller.rb |   24 ++++++++++++++++++++
 app/models/delayed_job_failure.rb                  |    5 ++++
 app/models/report.rb                               |    4 +++
 app/views/delayed_job_failures/index.html.haml     |   17 ++++++++++++++
 app/views/shared/_node_manager_sidebar.html.haml   |    5 ++++
 .../20110620111500_create_delayed_job_failures.rb  |   14 +++++++++++
 .../controllers/delayed_job_failures_controller.rb |   15 ++++++++++++
 7 files changed, 84 insertions(+), 0 deletions(-)
 create mode 100644 app/controllers/delayed_job_failures_controller.rb
 create mode 100644 app/models/delayed_job_failure.rb
 create mode 100644 app/views/delayed_job_failures/index.html.haml
 create mode 100644 db/migrate/20110620111500_create_delayed_job_failures.rb
 create mode 100644 spec/controllers/delayed_job_failures_controller.rb

diff --git a/app/controllers/delayed_job_failures_controller.rb 
b/app/controllers/delayed_job_failures_controller.rb
new file mode 100644
index 0000000..e121d9d
--- /dev/null
+++ b/app/controllers/delayed_job_failures_controller.rb
@@ -0,0 +1,24 @@
+class DelayedJobFailuresController < ApplicationController
+  def index
+    respond_to do |format|
+      format.html do
+        @delayed_job_failures = paginate_scope(DelayedJobFailure.all(:order => 
'created_at DESC'))
+      end
+
+      format.all do
+        @delayed_job_failures = DelayedJobFailure.all(:order => 'created_at 
DESC')
+      end
+    end
+
+    if params.has_key? :mark_all_read then
+      DelayedJobFailure.transaction do
+        # Can't just update_all, because this is a WillPaginate collection,
+        # and it has a limited API.  Alas. --daniel 2011-06-20
+        @delayed_job_failures.each do |event|
+          event.read = true
+          event.save!
+        end
+      end
+    end
+  end
+end
diff --git a/app/models/delayed_job_failure.rb 
b/app/models/delayed_job_failure.rb
new file mode 100644
index 0000000..c046d75
--- /dev/null
+++ b/app/models/delayed_job_failure.rb
@@ -0,0 +1,5 @@
+class DelayedJobFailure < ActiveRecord::Base
+  def self.per_page; 25 end
+
+  named_scope :unread, :conditions => { :read => nil }
+end
diff --git a/app/models/report.rb b/app/models/report.rb
index 5012b04..09c2b9e 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -83,6 +83,10 @@ class Report < ActiveRecord::Base
     report = create_from_yaml(File.read(report_file))
     File.unlink(report_file) if options[:delete]
     return report
+  rescue Exception => e
+    DelayedJobFailure.create!(:summary => "Importing report 
#{File.basename(report_file)}",
+                              :details => e.to_s)
+    return nil
   end
 
   def self.create_from_yaml(report_yaml)
diff --git a/app/views/delayed_job_failures/index.html.haml 
b/app/views/delayed_job_failures/index.html.haml
new file mode 100644
index 0000000..cb1e0e6
--- /dev/null
+++ b/app/views/delayed_job_failures/index.html.haml
@@ -0,0 +1,17 @@
+#sidebar= render 'shared/node_manager_sidebar'
+#main
+  .header
+    %h2
+      Delayed Job Failures
+      %span.count= page_entries_info(@delayed_job_failures, { :entry_name => 
"failure" } )
+    - form_tag request.url, :class => 'REVISIT', :method => :post do
+      %button{:name => :mark_all_read} Mark all Read
+
+  .item
+    %ul
+      - @delayed_job_failures.each do |e|
+        %li{:class => e.read ? :read : :unread}
+          &= "#{e.summary} (#{e.created_at})"
+          %pre
+            &= e.details
+    = pagination_for @delayed_job_failures
diff --git a/app/views/shared/_node_manager_sidebar.html.haml 
b/app/views/shared/_node_manager_sidebar.html.haml
index 109175b..1ccb186 100644
--- a/app/views/shared/_node_manager_sidebar.html.haml
+++ b/app/views/shared/_node_manager_sidebar.html.haml
@@ -1,4 +1,9 @@
 .group
+  %h3= link_to "Delayed Job Status", "/delayed_job_failures"
+  %h4= link_to "#{DelayedJobFailure.unread.count} unread failures", 
"/delayed_job_failures"
+  %h4= "#{Delayed::Job.count} pending reports"
+
+.group
   %h3{:class => active_if(controller_name == "nodes" && action_name == 
"index")}= link_to "Nodes", nodes_path
   -# %span.count= Node.unhidden.count
   %p.help
diff --git a/db/migrate/20110620111500_create_delayed_job_failures.rb 
b/db/migrate/20110620111500_create_delayed_job_failures.rb
new file mode 100644
index 0000000..23a9ac4
--- /dev/null
+++ b/db/migrate/20110620111500_create_delayed_job_failures.rb
@@ -0,0 +1,14 @@
+class CreateDelayedJobFailures < ActiveRecord::Migration
+  def self.up
+    create_table :delayed_job_failures do |t|
+      t.string      :summary, :limit => 255
+      t.text        :details
+      t.boolean     :read
+      t.timestamps
+    end
+  end
+
+  def self.down
+    drop_table :delayed_job_failures
+  end
+end
diff --git a/spec/controllers/delayed_job_failures_controller.rb 
b/spec/controllers/delayed_job_failures_controller.rb
new file mode 100644
index 0000000..5b9433d
--- /dev/null
+++ b/spec/controllers/delayed_job_failures_controller.rb
@@ -0,0 +1,15 @@
+require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+
+require 'shared_behaviors/controller_mixins'
+
+describe DelayedJobFailuresController do
+  def model; DelayedJobFailure end
+  it_should_behave_like "without JSON pagination"
+
+  it "should mark events read when asked" do
+    event = DelayedJobFailure.create!(:summary => "foo").id
+    DelayedJobFailure.find(event).read.should be_false
+    post :index, :mark_all_read => nil
+    DelayedJobFailure.find(event).read.should be_true
+  end
+end
-- 
1.7.4.4

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to