X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/9263c5500cbec408406d2d131d97a7d8eb63078e..519d402cb2234844f3dfee62cdcb2f3f44d5d618:/app/controllers/changeset_controller.rb diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb index 2709a594c..1e6a44189 100644 --- a/app/controllers/changeset_controller.rb +++ b/app/controllers/changeset_controller.rb @@ -38,25 +38,28 @@ class ChangesetController < ApplicationController end end + ## + # marks a changeset as closed. this may be called multiple times + # on the same changeset, so is idempotent. def close - begin - unless request.put? - render :nothing => true, :status => :method_not_allowed - return - end - - changeset = Changeset.find(params[:id]) - - unless @user.id == changeset.user_id - raise OSM::APIUserChangesetMismatchError - end - - changeset.open = false - changeset.save! - render :nothing => true - rescue ActiveRecord::RecordNotFound - render :nothing => true, :status => :not_found + unless request.put? + render :nothing => true, :status => :method_not_allowed + return + end + + changeset = Changeset.find(params[:id]) + + unless @user.id == changeset.user_id + raise OSM::APIUserChangesetMismatchError end + + changeset.open = false + changeset.save! + render :nothing => true + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + rescue OSM::APIError => ex + render ex.render_opts end ## @@ -84,8 +87,8 @@ class ChangesetController < ApplicationController # abuse, maybe should change to some other format? doc = XML::Parser.string(request.raw_post).parse doc.find("//osm/node").each do |n| - lon << n['lon'].to_f * SCALE - lat << n['lat'].to_f * SCALE + lon << n['lon'].to_f * GeoRecord::SCALE + lat << n['lat'].to_f * GeoRecord::SCALE end # add the existing bounding box to the lon-lat array @@ -257,6 +260,42 @@ class ChangesetController < ApplicationController rescue String => s render :text => s, :content_type => "text/plain", :status => :bad_request end + + ## + # updates a changeset's tags. none of the changeset's attributes are + # user-modifiable, so they will be ignored. + # + # changesets are not (yet?) versioned, so we don't have to deal with + # history tables here. changesets are locked to a single user, however. + # + # after succesful update, returns the XML of the changeset. + def update + # request *must* be a PUT. + unless request.put? + render :nothing => true, :status => :method_not_allowed + return + end + + changeset = Changeset.find(params[:id]) + new_changeset = Changeset.from_xml(request.raw_post) + + unless new_changeset.nil? + changeset.update_from(new_changeset, @user) + render :text => changeset.to_xml, :mime_type => "text/xml" + else + + render :nothing => true, :status => :bad_request + end + + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + rescue OSM::APIError => ex + render ex.render_opts + end + + #------------------------------------------------------------ + # utility functions below. + #------------------------------------------------------------ ## # merge two conditions @@ -283,7 +322,7 @@ class ChangesetController < ApplicationController raise "Minimum longitude should be less than maximum." unless bbox[0] <= bbox[2] raise "Minimum latitude should be less than maximum." unless bbox[1] <= bbox[3] return ['min_lon < ? and max_lon > ? and min_lat < ? and max_lat > ?', - bbox[2] * SCALE, bbox[0] * SCALE, bbox[3]* SCALE, bbox[1] * SCALE] + bbox[2] * GeoRecord::SCALE, bbox[0] * GeoRecord::SCALE, bbox[3]* GeoRecord::SCALE, bbox[1] * GeoRecord::SCALE] else return nil end