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 1 class ErrsController < ApplicationController
2 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 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 129 def destroy_several
123 130 @selected_problems.each(&:destroy)
124 131 flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted."
... ...
app/models/err.rb
... ... @@ -13,9 +13,11 @@ class Err
13 13 field :fingerprint
14 14  
15 15 belongs_to :problem
  16 + index :problem_id
  17 +
16 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 22 delegate :app,
21 23 :resolved?,
... ...
app/models/problem.rb
... ... @@ -39,21 +39,21 @@ class Problem
39 39 end
40 40  
41 41  
  42 +
42 43 def resolve!
43 44 self.update_attributes!(:resolved => true)
44 45 end
45 46  
46   -
47 47 def unresolve!
48 48 self.update_attributes!(:resolved => false)
49 49 end
50 50  
51   -
52 51 def unresolved?
53 52 !resolved?
54 53 end
55 54  
56 55  
  56 +
57 57 def self.merge!(*problems)
58 58 problems = problems.flatten.uniq
59 59 merged_problem = problems.shift
... ... @@ -62,11 +62,30 @@ class Problem
62 62 problem.errs(true) # reload problem.errs (should be empty) before problem.destroy
63 63 problem.destroy
64 64 end
65   - merged_problem.cache_notice_attributes
  65 + merged_problem.reset_cached_attributes
66 66 merged_problem
67 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 90 def cache_notice_attributes(notice=nil)
72 91 notice ||= notices.first
... ...
app/views/errs/_table.html.haml
... ... @@ -35,6 +35,7 @@
35 35 .tab-bar
36 36 %ul
37 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 39 %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path
39 40 %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path
40 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 15 post :resolve_several
16 16 post :unresolve_several
17 17 post :merge_several
  18 + post :unmerge_several
18 19 get :all
19 20 end
20 21 end
... ...
spec/controllers/errs_controller_spec.rb
... ... @@ -441,6 +441,17 @@ describe ErrsController do
441 441 end
442 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 455 context "POST /errs/resolve_several" do
445 456 it "should resolve the issue" do
446 457 post :resolve_several, :problems => [@problem2.id.to_s]
... ...
spec/models/problem_spec.rb
... ... @@ -78,7 +78,7 @@ describe Problem do
78 78 end
79 79  
80 80  
81   - context "#merge!" do
  81 + context ".merge!" do
82 82 it "collects the Errs from several problems into one and deletes the other problems" do
83 83 problem1 = Factory(:err).problem
84 84 problem2 = Factory(:err).problem
... ... @@ -93,6 +93,22 @@ describe Problem do
93 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 112 context "Scopes" do
97 113 context "resolved" do
98 114 it 'only finds resolved Problems' do
... ...