- # Returns 0 (success), unchanged way id.
-
- def deleteway(usertoken, changeset_id, way_id, way_version, node_id_version) #:doc:
- user = getuser(usertoken)
- unless user then return -1,"You are not logged in, so the way could not be deleted." end
-
- way_id = way_id.to_i
- # Need a transaction so that if one item fails to delete, the whole delete fails.
- Way.transaction do
-
- # FIXME: would be good not to make two history entries when removing
- # two nodes from the same relation
- old_way = Way.find(way_id)
- #old_way.unshared_node_ids.each do |n|
- # deleteitemrelations(n, 'node')
- #end
- #deleteitemrelations(way_id, 'way')
-
-
- #way.delete_with_relations_and_nodes_and_history(changeset_id.to_i)
- old_way.unshared_node_ids.each do |node_id|
- # delete the node
- node = Node.find(node_id)
- delete_node = Node.new
- delete_node.version = node_id_version[node_id]
- node.delete_with_history!(delete_node, user)
- end
- # delete the way
- delete_way = Way.new
- delete_way.version = way_version
- old_way.delete_with_history!(delete_way, user)
- end # transaction
- [0, way_id]
- rescue OSM::APIChangesetAlreadyClosedError => ex
- return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}"]
- rescue OSM::APIVersionMismatchError => ex
- # Really need to check to see whether this is a server load issue, and the
- # last version was in the same changeset, or belongs to the same user, then
- # we can return something different
- return [-3, "You have taken too long to edit, please reload the area"]
- rescue OSM::APIAlreadyDeletedError => ex
- return [-1, "The object has already been deleted"]
- rescue OSM::APIError => ex
- # Some error that we don't specifically catch
- return [-2, "Something really bad happened :-()"]
+ # Returns 0 (success), unchanged way id, new way version, new node versions.
+
+ def deleteway(usertoken, changeset_id, way_id, way_version, deletednodes) #:doc:
+ amf_handle_error("'deleteway' #{way_id}", "way", way_id) do
+ user = getuser(usertoken)
+ return -1, "You are not logged in, so the way could not be deleted." unless user
+ return -1, t("application.setup_user_auth.blocked") if user.blocks.active.exists?
+ return -1, "You must accept the contributor terms before you can edit." if REQUIRE_TERMS_AGREED && user.terms_agreed.nil?
+
+ way_id = way_id.to_i
+ nodeversions = {}
+ old_way = nil # returned, so scope it outside the transaction
+ # Need a transaction so that if one item fails to delete, the whole delete fails.
+ Way.transaction do
+ # -- Delete the way
+
+ old_way = Way.find(way_id)
+ delete_way = Way.new
+ delete_way.version = way_version
+ delete_way.changeset_id = changeset_id
+ delete_way.id = way_id
+ old_way.delete_with_history!(delete_way, user)
+
+ # -- Delete unwanted nodes
+
+ deletednodes.each do |id, v|
+ node = Node.find(id.to_i)
+ new_node = Node.new
+ new_node.changeset_id = changeset_id
+ new_node.version = v.to_i
+ new_node.id = id.to_i
+ begin
+ node.delete_with_history!(new_node, user)
+ nodeversions[node.id] = node.version
+ rescue OSM::APIPreconditionFailedError
+ # We don't do anything with the exception as the node is in use
+ # elsewhere and we don't want to delete it
+ end
+ end
+ end # transaction
+ [0, "", way_id, old_way.version, nodeversions]
+ end