diff --git a/app/models/deliverable.rb b/app/models/deliverable.rb index 1a7ddef..78a395d 100644 --- a/app/models/deliverable.rb +++ b/app/models/deliverable.rb @@ -33,6 +33,9 @@ class Deliverable < ActiveRecord::Base delegate "locked?", :to => :contract, :prefix => true, :allow_nil => true # Callbacks + before_destroy :block_on_locked_contracts + before_destroy :block_on_closed_contracts + def after_initialize self.status = "open" unless self.status.present? end @@ -139,6 +142,14 @@ class Deliverable < ActiveRecord::Base def noop(message="") end + def block_on_locked_contracts + !contract_locked? + end + + def block_on_closed_contracts + !contract_closed? + end + def to_s title end diff --git a/app/views/deliverables/_details_row.html.erb b/app/views/deliverables/_details_row.html.erb index 10bcc4c..c301f60 100644 --- a/app/views/deliverables/_details_row.html.erb +++ b/app/views/deliverables/_details_row.html.erb @@ -7,7 +7,7 @@
<%= link_to(l(:button_edit), edit_contract_deliverable_path(@project, contract, deliverable), :class => 'icon icon-edit') %> - <%= link_to(l(:button_delete), contract_deliverable_path(@project, contract, deliverable), :method => :delete, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') %> + <%= link_to(l(:button_delete), contract_deliverable_path(@project, contract, deliverable), :method => :delete, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') if contract.open? %>
<%= textilizable(deliverable, :notes) %> diff --git a/test/unit/deliverable_test.rb b/test/unit/deliverable_test.rb index 08b2d75..fa32573 100644 --- a/test/unit/deliverable_test.rb +++ b/test/unit/deliverable_test.rb @@ -50,6 +50,17 @@ class DeliverableTest < ActiveSupport::TestCase assert !deliverable.valid? assert deliverable.errors.on_base.include?("Can't create a deliverable on a locked contract") end + + should "block deleting a deliverable" do + contract = Contract.generate! + deliverable = FixedDeliverable.generate!(:contract => contract).reload + assert contract.lock! + + assert_no_difference("Deliverable.count") do + deliverable.destroy + end + + end end context "with a closed contract" do @@ -60,5 +71,16 @@ class DeliverableTest < ActiveSupport::TestCase assert !deliverable.valid? assert deliverable.errors.on_base.include?("Can't create a deliverable on a closed contract") end + + should "block deleting a deliverable" do + contract = Contract.generate! + deliverable = FixedDeliverable.generate!(:contract => contract).reload + assert contract.close! + + assert_no_difference("Deliverable.count") do + deliverable.destroy + end + + end end end