Commit 8ac42ca34f1934a6e3d11ab2305e53f237d872b1

Authored by Bob Lail
1 parent 8e57c587
Exists in master and in 1 other branch production

added an 'Unmerge' bulk action

app/controllers/errs_controller.rb
1 class ErrsController < ApplicationController 1 class ErrsController < ApplicationController
2 include ActionView::Helpers::TextHelper 2 include ActionView::Helpers::TextHelper
3 3
4 - before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several]  
5 - before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several]  
6 - before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several] 4 + before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several]
  5 + before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several]
  6 + before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several]
7 7
8 8
9 9
@@ -119,6 +119,13 @@ class ErrsController &lt; ApplicationController @@ -119,6 +119,13 @@ class ErrsController &lt; ApplicationController
119 end 119 end
120 120
121 121
  122 + def unmerge_several
  123 + all = @selected_problems.map(&:unmerge!).flatten
  124 + flash[:success] = "#{pluralize(all.length, 'err has', 'errs have')} been unmerged."
  125 + redirect_to :back
  126 + end
  127 +
  128 +
122 def destroy_several 129 def destroy_several
123 @selected_problems.each(&:destroy) 130 @selected_problems.each(&:destroy)
124 flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted." 131 flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted."
app/models/err.rb
@@ -13,9 +13,11 @@ class Err @@ -13,9 +13,11 @@ class Err
13 field :fingerprint 13 field :fingerprint
14 14
15 belongs_to :problem 15 belongs_to :problem
  16 + index :problem_id
  17 +
16 has_many :notices, :inverse_of => :err, :dependent => :destroy 18 has_many :notices, :inverse_of => :err, :dependent => :destroy
17 19
18 - validates_presence_of :klass, :environment, :problem 20 + validates_presence_of :klass, :environment
19 21
20 delegate :app, 22 delegate :app,
21 :resolved?, 23 :resolved?,
app/models/problem.rb
@@ -39,21 +39,21 @@ class Problem @@ -39,21 +39,21 @@ class Problem
39 end 39 end
40 40
41 41
  42 +
42 def resolve! 43 def resolve!
43 self.update_attributes!(:resolved => true) 44 self.update_attributes!(:resolved => true)
44 end 45 end
45 46
46 -  
47 def unresolve! 47 def unresolve!
48 self.update_attributes!(:resolved => false) 48 self.update_attributes!(:resolved => false)
49 end 49 end
50 50
51 -  
52 def unresolved? 51 def unresolved?
53 !resolved? 52 !resolved?
54 end 53 end
55 54
56 55
  56 +
57 def self.merge!(*problems) 57 def self.merge!(*problems)
58 problems = problems.flatten.uniq 58 problems = problems.flatten.uniq
59 merged_problem = problems.shift 59 merged_problem = problems.shift
@@ -62,11 +62,30 @@ class Problem @@ -62,11 +62,30 @@ class Problem
62 problem.errs(true) # reload problem.errs (should be empty) before problem.destroy 62 problem.errs(true) # reload problem.errs (should be empty) before problem.destroy
63 problem.destroy 63 problem.destroy
64 end 64 end
65 - merged_problem.cache_notice_attributes 65 + merged_problem.reset_cached_attributes
66 merged_problem 66 merged_problem
67 end 67 end
68 68
  69 + def merged?
  70 + errs.length > 1
  71 + end
69 72
  73 + def unmerge!
  74 + [self] + errs[1..-1].map(&:id).map do |err_id|
  75 + err = Err.find(err_id)
  76 + app.problems.create.tap do |new_problem|
  77 + err.update_attribute(:problem_id, new_problem.id)
  78 + new_problem.reset_cached_attributes
  79 + end
  80 + end
  81 + end
  82 +
  83 +
  84 +
  85 + def reset_cached_attributes
  86 + update_attribute(:notices_count, notices.count)
  87 + cache_notice_attributes
  88 + end
70 89
71 def cache_notice_attributes(notice=nil) 90 def cache_notice_attributes(notice=nil)
72 notice ||= notices.first 91 notice ||= notices.first
app/views/errs/_table.html.haml
@@ -35,6 +35,7 @@ @@ -35,6 +35,7 @@
35 .tab-bar 35 .tab-bar
36 %ul 36 %ul
37 %li= submit_tag 'Merge', :id => 'merge_errs', :class => 'button', 'data-action' => merge_several_errs_path 37 %li= submit_tag 'Merge', :id => 'merge_errs', :class => 'button', 'data-action' => merge_several_errs_path
  38 + %li= submit_tag 'Unmerge', :id => 'unmerge_errs', :class => 'button', 'data-action' => unmerge_several_errs_path
38 %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path 39 %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path
39 %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path 40 %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path
40 %li= submit_tag 'Delete', :id => 'delete_errs', :class => 'button', 'data-action' => destroy_several_errs_path 41 %li= submit_tag 'Delete', :id => 'delete_errs', :class => 'button', 'data-action' => destroy_several_errs_path
config/routes.rb
@@ -15,6 +15,7 @@ Errbit::Application.routes.draw do @@ -15,6 +15,7 @@ Errbit::Application.routes.draw do
15 post :resolve_several 15 post :resolve_several
16 post :unresolve_several 16 post :unresolve_several
17 post :merge_several 17 post :merge_several
  18 + post :unmerge_several
18 get :all 19 get :all
19 end 20 end
20 end 21 end
spec/controllers/errs_controller_spec.rb
@@ -441,6 +441,17 @@ describe ErrsController do @@ -441,6 +441,17 @@ describe ErrsController do
441 end 441 end
442 end 442 end
443 443
  444 + context "POST /errs/unmerge_several" do
  445 + it "should unmerge a merged problem" do
  446 + merged_problem = Problem.merge!(@problem1, @problem2)
  447 + merged_problem.errs.length.should == 2
  448 + lambda {
  449 + post :unmerge_several, :problems => [merged_problem.id.to_s]
  450 + merged_problem.reload.errs.length.should == 1
  451 + }.should change(Problem, :count).by(1)
  452 + end
  453 + end
  454 +
444 context "POST /errs/resolve_several" do 455 context "POST /errs/resolve_several" do
445 it "should resolve the issue" do 456 it "should resolve the issue" do
446 post :resolve_several, :problems => [@problem2.id.to_s] 457 post :resolve_several, :problems => [@problem2.id.to_s]
spec/models/problem_spec.rb
@@ -78,7 +78,7 @@ describe Problem do @@ -78,7 +78,7 @@ describe Problem do
78 end 78 end
79 79
80 80
81 - context "#merge!" do 81 + context ".merge!" do
82 it "collects the Errs from several problems into one and deletes the other problems" do 82 it "collects the Errs from several problems into one and deletes the other problems" do
83 problem1 = Factory(:err).problem 83 problem1 = Factory(:err).problem
84 problem2 = Factory(:err).problem 84 problem2 = Factory(:err).problem
@@ -93,6 +93,22 @@ describe Problem do @@ -93,6 +93,22 @@ describe Problem do
93 end 93 end
94 94
95 95
  96 + context "#unmerge!" do
  97 + it "creates a separate problem for each err" do
  98 + problem1 = Factory(:notice).problem
  99 + problem2 = Factory(:notice).problem
  100 + merged_problem = Problem.merge!(problem1, problem2)
  101 + merged_problem.errs.length.should == 2
  102 +
  103 + lambda {
  104 + problems = merged_problem.unmerge!
  105 + problems.length.should == 2
  106 + merged_problem.errs(true).length.should == 1
  107 + }.should change(Problem, :count).by(1)
  108 + end
  109 + end
  110 +
  111 +
96 context "Scopes" do 112 context "Scopes" do
97 context "resolved" do 113 context "resolved" do
98 it 'only finds resolved Problems' do 114 it 'only finds resolved Problems' do