]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/changeset.rb
Implemented changeset tags updating via the update method.
[rails.git] / app / models / changeset.rb
index b00dfa8af46600ae2158188d48ef39f0a30311da..047569dca5cf15db682c9c1fbd8fe72a85b3a942 100644 (file)
@@ -104,13 +104,13 @@ class Changeset < ActiveRecord::Base
   def save_with_tags!
     t = Time.now
 
+    # do the changeset update and the changeset tags update in the
+    # same transaction to ensure consistency.
     Changeset.transaction do
       # fixme update modified_at time?
       # FIXME there is no modified_at time, should it be added
       self.save!
-    end
 
-    ChangesetTag.transaction do
       tags = self.tags
       ChangesetTag.delete_all(['id = ?', self.id])
 
@@ -145,6 +145,7 @@ class Changeset < ActiveRecord::Base
     end
 
     el1['user'] = user_display_name_cache[self.user_id] unless user_display_name_cache[self.user_id].nil?
+    el1['uid'] = self.user_id.to_s if self.user.data_public?
 
     self.tags.each do |k,v|
       el2 = XML::Node.new('tag')
@@ -156,10 +157,10 @@ class Changeset < ActiveRecord::Base
     el1['created_at'] = self.created_at.xmlschema
     el1['open'] = self.open.to_s
 
-    el1['min_lon'] = (bbox[0] / SCALE).to_s unless bbox[0].nil?
-    el1['min_lat'] = (bbox[1] / SCALE).to_s unless bbox[1].nil?
-    el1['max_lon'] = (bbox[2] / SCALE).to_s unless bbox[2].nil?
-    el1['max_lat'] = (bbox[3] / SCALE).to_s unless bbox[3].nil?
+    el1['min_lon'] = (bbox[0].to_f / GeoRecord::SCALE).to_s unless bbox[0].nil?
+    el1['min_lat'] = (bbox[1].to_f / GeoRecord::SCALE).to_s unless bbox[1].nil?
+    el1['max_lon'] = (bbox[2].to_f / GeoRecord::SCALE).to_s unless bbox[2].nil?
+    el1['max_lat'] = (bbox[3].to_f / GeoRecord::SCALE).to_s unless bbox[3].nil?
     
     # NOTE: changesets don't include the XML of the changes within them,
     # they are just structures for tagging. to get the osmChange of a
@@ -167,4 +168,25 @@ class Changeset < ActiveRecord::Base
 
     return el1
   end
+
+  ##
+  # update this instance from another instance given and the user who is
+  # doing the updating. note that this method is not for updating the
+  # bounding box, only the tags of the changeset.
+  def update_from(other, user)
+    # ensure that only the user who opened the changeset may modify it.
+    unless user.id == self.user_id 
+      raise OSM::APIUserChangesetMismatchError 
+    end
+    
+    # can't change a closed changeset
+    unless open
+      raise OSM::APIChangesetAlreadyClosedError
+    end
+
+    # copy the other's tags
+    self.tags = other.tags
+
+    save_with_tags!
+  end
 end