]> 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 5938d0835f068850ea989657563866c948780a68..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')
@@ -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