X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/e989b1a880f79fd1835a44d16de115a778f890af..62b6d159672ad29344c7b7074a37d23b16dbb5d9:/app/models/node.rb?ds=inline diff --git a/app/models/node.rb b/app/models/node.rb index e90c32950..f2ad3a78a 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -83,12 +83,13 @@ class Node < ActiveRecord::Base raise OSM::APIBadXMLError.new("node", pt, "lon missing") if pt['lon'].nil? node.lat = pt['lat'].to_f node.lon = pt['lon'].to_f + raise OSM::APIBadXMLError.new("node", pt, "changeset id missing") if pt['changeset'].nil? node.changeset_id = pt['changeset'].to_i raise OSM::APIBadUserInput.new("The node is outside this world") unless node.in_world? # version must be present unless creating - return nil unless create or not pt['version'].nil? + raise OSM::APIBadXMLError.new("node", pt, "Version is required when updating") unless create or not pt['version'].nil? node.version = create ? 0 : pt['version'].to_i unless create @@ -99,15 +100,10 @@ class Node < ActiveRecord::Base # visible if it says it is, or as the default if the attribute # is missing. - node.visible = pt['visible'].nil? or pt['visible'] == 'true' + # Don't need to set the visibility, when it is set explicitly in the create/update/delete + #node.visible = pt['visible'].nil? or pt['visible'] == 'true' - if create - node.timestamp = Time.now - else - if pt['timestamp'] - node.timestamp = Time.parse(pt['timestamp']) - end - end + # We don't care about the time, as it is explicitly set on create/update/delete tags = [] @@ -119,42 +115,12 @@ class Node < ActiveRecord::Base end ## - # the bounding box around a node + # the bounding box around a node, which is used for determining the changeset's + # bounding box def bbox [ longitude, latitude, longitude, latitude ] end - def save_with_history! - t = Time.now - Node.transaction do - self.version += 1 - self.timestamp = t - self.save! - - # Create a NodeTag - tags = self.tags - NodeTag.delete_all(['id = ?', self.id]) - tags.each do |k,v| - tag = NodeTag.new - tag.k = k - tag.v = v - tag.id = self.id - tag.save! - end - - # Create an OldNode - old_node = OldNode.from_node(self) - old_node.timestamp = t - old_node.save_with_dependencies! - - # tell the changeset we updated one element only - changeset.add_changes! 1 - - # save the changeset in case of bounding box updates - changeset.save! - end - end - # Should probably be renamed delete_from to come in line with update def delete_with_history!(new_node, user) unless self.visible @@ -203,6 +169,7 @@ class Node < ActiveRecord::Base def create_with_history(user) check_create_consistency(self, user) + self.id = nil self.version = 0 self.visible = true @@ -294,5 +261,38 @@ class Node < ActiveRecord::Base def fix_placeholders!(id_map) # nodes don't refer to anything, so there is nothing to do here end + + private + + def save_with_history! + t = Time.now + Node.transaction do + self.version += 1 + self.timestamp = t + self.save! + # Create a NodeTag + tags = self.tags + NodeTag.delete_all(['id = ?', self.id]) + tags.each do |k,v| + tag = NodeTag.new + tag.k = k + tag.v = v + tag.id = self.id + tag.save! + end + + # Create an OldNode + old_node = OldNode.from_node(self) + old_node.timestamp = t + old_node.save_with_dependencies! + + # tell the changeset we updated one element only + changeset.add_changes! 1 + + # save the changeset in case of bounding box updates + changeset.save! + end + end + end