From 1da4cecaf6f8bdae527553e61165cc41fc07533b Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sat, 2 Apr 2011 11:51:36 +0100 Subject: [PATCH] List all objects that are blocking a delete, in a well defined order --- app/models/node.rb | 10 ++++------ app/models/way.rb | 7 +++---- test/functional/changeset_controller_test.rb | 2 +- test/functional/node_controller_test.rb | 4 ++-- test/functional/way_controller_test.rb | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/app/models/node.rb b/app/models/node.rb index 70c6fb880..8f154b473 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -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 = {} diff --git a/app/models/way.rb b/app/models/way.rb index 8206eecb3..23475785c 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -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 diff --git a/test/functional/changeset_controller_test.rb b/test/functional/changeset_controller_test.rb index 0d062ab2d..964e18a12 100644 --- a/test/functional/changeset_controller_test.rb +++ b/test/functional/changeset_controller_test.rb @@ -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 diff --git a/test/functional/node_controller_test.rb b/test/functional/node_controller_test.rb index b5f93c458..3fc2d83f6 100644 --- a/test/functional/node_controller_test.rb +++ b/test/functional/node_controller_test.rb @@ -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 ## diff --git a/test/functional/way_controller_test.rb b/test/functional/way_controller_test.rb index 3452be6d0..52ba263e0 100644 --- a/test/functional/way_controller_test.rb +++ b/test/functional/way_controller_test.rb @@ -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 -- 2.43.2