List all objects that are blocking a delete, in a well defined order
authorTom Hughes <tom@compton.nu>
Sat, 2 Apr 2011 10:51:36 +0000 (11:51 +0100)
committerTom Hughes <tom@compton.nu>
Mon, 14 Nov 2011 09:42:49 +0000 (09:42 +0000)
app/models/node.rb
app/models/way.rb
test/functional/changeset_controller_test.rb
test/functional/node_controller_test.rb
test/functional/way_controller_test.rb

index 70c6fb880ed9c46c2047150780d816342be022c8..8f154b4739db0fde7ee7f846d8f9a92cf98d2a59 100644 (file)
@@ -136,13 +136,11 @@ class Node < ActiveRecord::Base
     Node.transaction do
       self.lock!
       check_consistency(self, new_node, user)
-      way = WayNode.find(:first, :joins => :way, 
-                         :conditions => [ "current_ways.visible = ? AND current_way_nodes.node_id = ?", true, self.id ])
-      raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by way #{way.way.id}.") unless way.nil?
+      ways = Way.joins(:way_nodes).where(:visible => true, :current_way_nodes => { :node_id => id }).order(:id)
+      raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by ways #{ways.collect { |w| w.id }.join(",")}.") unless ways.empty?
       
-      rel = RelationMember.find(:first, :joins => :relation, 
-                                :conditions => [ "visible = ? AND member_type='Node' and member_id=? ", true, self.id])
-      raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by relation #{rel.relation.id}.") unless rel.nil?
+      rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Node", :member_id => id }).order(:id)
+      raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by relations #{rels.collect { |r| r.id }.join(",")}.") unless rels.empty?
 
       self.changeset_id = new_node.changeset_id
       self.tags = {}
index 8206eecb30e0f1e54ffb5d7cb16f3346f199149b..23475785c88f1ecc069268f6df85dd2e76fd730c 100644 (file)
@@ -268,10 +268,9 @@ class Way < ActiveRecord::Base
     Way.transaction do
       self.lock!
       check_consistency(self, new_way, user)
-      rel = RelationMember.find(:first, :joins => :relation,
-                             :conditions => [ "visible = ? AND member_type='Way' and member_id=? ", true, self.id])
-      raise OSM::APIPreconditionFailedError.new("Way #{self.id} still used by relation #{rel.relation.id}.") if rel
-      
+      rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Way", :member_id => id }).order(:id)
+      raise OSM::APIPreconditionFailedError.new("Way #{self.id} is still used by relations #{rels.collect { |r| r.id }.join(",")}.") unless rels.empty?
+
       self.changeset_id = new_way.changeset_id
       self.changeset = new_way.changeset
 
index 0d062ab2d801cf6477fdc3f84ca279b131606c00..964e18a12a133d220e78254ce038bab7af59b1f1 100644 (file)
@@ -489,7 +489,7 @@ EOF
     post :upload, :id => 2
     assert_response :precondition_failed, 
       "shouldn't be able to upload a invalid deletion diff: #{@response.body}"
-    assert_equal "Precondition failed: Way 3 still used by relation 1.", @response.body
+    assert_equal "Precondition failed: Way 3 is still used by relations 1.", @response.body
 
     # check that nothing was, in fact, deleted
     assert_equal true, Node.find(current_nodes(:node_used_by_relationship).id).visible
index b5f93c4587eb0381073fbe22a93ee5c10527ce6e..3fc2d83f659a3fa946c649563a188a9aec966168 100644 (file)
@@ -221,14 +221,14 @@ class NodeControllerTest < ActionController::TestCase
     delete :delete, :id => current_nodes(:used_node_1).id
     assert_response :precondition_failed,
        "shouldn't be able to delete a node used in a way (#{@response.body})"
-    assert_equal "Precondition failed: Node 3 is still used by way 1.", @response.body
+    assert_equal "Precondition failed: Node 3 is still used by ways 1,3.", @response.body
 
     # in a relation...
     content(nodes(:node_used_by_relationship).to_xml)
     delete :delete, :id => current_nodes(:node_used_by_relationship).id
     assert_response :precondition_failed,
        "shouldn't be able to delete a node used in a relation (#{@response.body})"
-    assert_match /Precondition failed: Node 5 is still used by relation [13]./, @response.body
+    assert_equal "Precondition failed: Node 5 is still used by relations 1,3.", @response.body
   end
 
   ##
index 3452be6d04a120ed771a2a1a1b05367e36117ab0..52ba263e031f8947946ee29fe3e11363d4183e98 100644 (file)
@@ -297,7 +297,7 @@ class WayControllerTest < ActionController::TestCase
     delete :delete, :id => current_ways(:used_way).id
     assert_response :precondition_failed, 
        "shouldn't be able to delete a way used in a relation (#{@response.body})"
-    assert_equal "Precondition failed: Way 3 still used by relation 1.", @response.body
+    assert_equal "Precondition failed: Way 3 is still used by relations 1.", @response.body
 
     # this won't work since the way never existed
     delete :delete, :id => 0