diff --git a/app/controllers/errs_controller.rb b/app/controllers/errs_controller.rb index f1b4585..bbaafe1 100644 --- a/app/controllers/errs_controller.rb +++ b/app/controllers/errs_controller.rb @@ -1,9 +1,9 @@ class ErrsController < ApplicationController include ActionView::Helpers::TextHelper - before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several] - before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several] - before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several] + before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several] + before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several] + before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several] @@ -119,6 +119,13 @@ class ErrsController < ApplicationController end + def unmerge_several + all = @selected_problems.map(&:unmerge!).flatten + flash[:success] = "#{pluralize(all.length, 'err has', 'errs have')} been unmerged." + redirect_to :back + end + + def destroy_several @selected_problems.each(&:destroy) flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted." diff --git a/app/models/err.rb b/app/models/err.rb index e7af763..84193c3 100644 --- a/app/models/err.rb +++ b/app/models/err.rb @@ -13,9 +13,11 @@ class Err field :fingerprint belongs_to :problem + index :problem_id + has_many :notices, :inverse_of => :err, :dependent => :destroy - validates_presence_of :klass, :environment, :problem + validates_presence_of :klass, :environment delegate :app, :resolved?, diff --git a/app/models/problem.rb b/app/models/problem.rb index a0d0df5..12f2c0a 100644 --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -39,21 +39,21 @@ class Problem end + def resolve! self.update_attributes!(:resolved => true) end - def unresolve! self.update_attributes!(:resolved => false) end - def unresolved? !resolved? end + def self.merge!(*problems) problems = problems.flatten.uniq merged_problem = problems.shift @@ -62,11 +62,30 @@ class Problem problem.errs(true) # reload problem.errs (should be empty) before problem.destroy problem.destroy end - merged_problem.cache_notice_attributes + merged_problem.reset_cached_attributes merged_problem end + def merged? + errs.length > 1 + end + def unmerge! + [self] + errs[1..-1].map(&:id).map do |err_id| + err = Err.find(err_id) + app.problems.create.tap do |new_problem| + err.update_attribute(:problem_id, new_problem.id) + new_problem.reset_cached_attributes + end + end + end + + + + def reset_cached_attributes + update_attribute(:notices_count, notices.count) + cache_notice_attributes + end def cache_notice_attributes(notice=nil) notice ||= notices.first diff --git a/app/views/errs/_table.html.haml b/app/views/errs/_table.html.haml index 7ae8eb2..876fdb0 100644 --- a/app/views/errs/_table.html.haml +++ b/app/views/errs/_table.html.haml @@ -35,6 +35,7 @@ .tab-bar %ul %li= submit_tag 'Merge', :id => 'merge_errs', :class => 'button', 'data-action' => merge_several_errs_path + %li= submit_tag 'Unmerge', :id => 'unmerge_errs', :class => 'button', 'data-action' => unmerge_several_errs_path %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path %li= submit_tag 'Delete', :id => 'delete_errs', :class => 'button', 'data-action' => destroy_several_errs_path diff --git a/config/routes.rb b/config/routes.rb index 7b95ad3..2451316 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -15,6 +15,7 @@ Errbit::Application.routes.draw do post :resolve_several post :unresolve_several post :merge_several + post :unmerge_several get :all end end diff --git a/spec/controllers/errs_controller_spec.rb b/spec/controllers/errs_controller_spec.rb index 4cccb35..6c4516a 100644 --- a/spec/controllers/errs_controller_spec.rb +++ b/spec/controllers/errs_controller_spec.rb @@ -441,6 +441,17 @@ describe ErrsController do end end + context "POST /errs/unmerge_several" do + it "should unmerge a merged problem" do + merged_problem = Problem.merge!(@problem1, @problem2) + merged_problem.errs.length.should == 2 + lambda { + post :unmerge_several, :problems => [merged_problem.id.to_s] + merged_problem.reload.errs.length.should == 1 + }.should change(Problem, :count).by(1) + end + end + context "POST /errs/resolve_several" do it "should resolve the issue" do post :resolve_several, :problems => [@problem2.id.to_s] diff --git a/spec/models/problem_spec.rb b/spec/models/problem_spec.rb index 1b80868..afea25d 100644 --- a/spec/models/problem_spec.rb +++ b/spec/models/problem_spec.rb @@ -78,7 +78,7 @@ describe Problem do end - context "#merge!" do + context ".merge!" do it "collects the Errs from several problems into one and deletes the other problems" do problem1 = Factory(:err).problem problem2 = Factory(:err).problem @@ -93,6 +93,22 @@ describe Problem do end + context "#unmerge!" do + it "creates a separate problem for each err" do + problem1 = Factory(:notice).problem + problem2 = Factory(:notice).problem + merged_problem = Problem.merge!(problem1, problem2) + merged_problem.errs.length.should == 2 + + lambda { + problems = merged_problem.unmerge! + problems.length.should == 2 + merged_problem.errs(true).length.should == 1 + }.should change(Problem, :count).by(1) + end + end + + context "Scopes" do context "resolved" do it 'only finds resolved Problems' do -- libgit2 0.21.2