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 | 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 < ApplicationController | @@ -119,6 +119,13 @@ class ErrsController < 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 |