]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/changeset_controller.rb
Implemented changeset tags updating via the update method.
[rails.git] / app / controllers / changeset_controller.rb
index 29b5ef83efd89238e9dc708c9254b141c02d58fa..cd49176e63e105e16819cdc00f392189594e58d9 100644 (file)
@@ -4,7 +4,7 @@ class ChangesetController < ApplicationController
   require 'xml/libxml'
   require 'diff_reader'
 
-  before_filter :authorize, :only => [:create, :update, :delete, :upload, :include]
+  before_filter :authorize, :only => [:create, :update, :delete, :upload, :include, :close]
   before_filter :check_write_availability, :only => [:create, :update, :delete, :upload, :include]
   before_filter :check_read_availability, :except => [:create, :update, :delete, :upload, :download, :query]
   after_filter :compress_output
@@ -84,8 +84,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 +257,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 +319,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