Commit 8ac42ca34f1934a6e3d11ab2305e53f237d872b1
1 parent
8e57c587
Exists in
master
and in
1 other branch
added an 'Unmerge' bulk action
Showing
7 changed files
with
65 additions
and
8 deletions
Show diff stats
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 < 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
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 | ... | ... |