X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/02fbcf5f06917d7dea546b90932da82b8ed29d2a..28839fd1504004bd10f30eeba3d7212c77adfbb4:/app/models/changeset.rb diff --git a/app/models/changeset.rb b/app/models/changeset.rb index b00dfa8af..047569dca 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -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