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 70c6fb8..8f154b4 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 8206eec..2347578 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 0d062ab..964e18a 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 b5f93c4..3fc2d83 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 3452be6..52ba263 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