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])
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')
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
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