]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/node.rb
Added first attempt at bounding box support in changesets and tests for the same.
[rails.git] / app / models / node.rb
index 3b59ac80ea558960ade0cb97437da82f639d88d5..e58a1d8969cd7d39b3dc891e632e39df63cbde01 100644 (file)
@@ -75,20 +75,25 @@ class Node < ActiveRecord::Base
   def self.from_xml_node(pt, create=false)
     node = Node.new
     
-    node.version = pt['version'].to_i
     node.lat = pt['lat'].to_f
     node.lon = pt['lon'].to_f
     node.changeset_id = pt['changeset'].to_i
 
     return nil unless node.in_world?
 
+    # version must be present unless creating
+    return nil unless create or not pt['version'].nil?
+    node.version = pt['version'].to_i
+
     unless create
       if pt['id'] != '0'
         node.id = pt['id'].to_i
       end
     end
 
-    node.visible = pt['visible'] and pt['visible'] == 'true'
+    # visible if it says it is, or as the default if the attribute
+    # is missing.
+    node.visible = pt['visible'].nil? or pt['visible'] == 'true'
 
     if create
       node.timestamp = Time.now
@@ -107,6 +112,12 @@ class Node < ActiveRecord::Base
     return node
   end
 
+  ##
+  # the bounding box around a node
+  def bbox
+    [ longitude, latitude, longitude, latitude ]
+  end
+
   def save_with_history!
     t = Time.now
     Node.transaction do
@@ -129,11 +140,14 @@ class Node < ActiveRecord::Base
       old_node = OldNode.from_node(self)
       old_node.timestamp = t
       old_node.save_with_dependencies!
+
+      # 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)
+  def delete_with_history!(new_node, user)
     if self.visible
       check_consistency(self, new_node, user)
       if WayNode.find(:first, :joins => "INNER JOIN current_ways ON current_ways.id = current_way_nodes.id", :conditions => [ "current_ways.visible = 1 AND current_way_nodes.node_id = ?", self.id ])
@@ -143,6 +157,10 @@ class Node < ActiveRecord::Base
       else
         self.changeset_id = new_node.changeset_id
         self.visible = 0
+
+        # update the changeset with the deleted position
+        changeset.update_bbox!(bbox)
+
         save_with_history!
       end
     else
@@ -153,12 +171,19 @@ class Node < ActiveRecord::Base
   def update_from(new_node, user)
     check_consistency(self, new_node, user)
 
+    # update changeset with *old* position first
+    changeset.update_bbox!(bbox);
+
     # FIXME logic needs to be double checked
     self.changeset_id = new_node.changeset_id
     self.latitude = new_node.latitude 
     self.longitude = new_node.longitude
     self.tags = new_node.tags
     self.visible = true
+
+    # update changeset with *new* position
+    changeset.update_bbox!(bbox);
+
     save_with_history!
   end
   
@@ -166,6 +191,10 @@ class Node < ActiveRecord::Base
     check_create_consistency(self, user)
     self.version = 0
     self.visible = true
+
+    # update the changeset to include the new location
+    changeset.update_bbox!(bbox)
+
     save_with_history!
   end
 
@@ -235,4 +264,11 @@ class Node < ActiveRecord::Base
     @tags[k] = v
   end
 
+  ##
+  # dummy method to make the interfaces of node, way and relation
+  # more consistent.
+  def fix_placeholders!(id_map)
+    # nodes don't refer to anything, so there is nothing to do here
+  end
+
 end