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 | ... | ... |