X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/40647c53dff5f04f0ecfd4db891c4d3bf76b4a8d..60834f33f9f38f94fd824ea8cd0a3fe210fbf86b:/app/controllers/amf_controller.rb diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index ea58c2866..80472fe25 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -130,7 +130,7 @@ class AmfController < ApplicationController # Start new changeset def startchangeset(usertoken, cstags, closeid, closecomment) - user = getuserid(usertoken) + user = getuser(usertoken) if !user then return -1,"You are not logged in, so Potlatch can't write any changes to the database." end # close previous changeset and add comment @@ -153,7 +153,7 @@ class AmfController < ApplicationController cs.user_id = user.id # smsm1 doesn't like the next two lines and thinks they need to be abstracted to the model more/better cs.created_at = Time.now - cs.closed_at = Time.new + Changeset::IDLE_TIMEOUT + cs.closed_at = cs.created_at + Changeset::IDLE_TIMEOUT cs.save_with_tags! return [0,cs.id] end @@ -341,17 +341,17 @@ class AmfController < ApplicationController # Returns array listing GPXs, each one comprising id, name and description. def findgpx(searchterm, usertoken) - uid = getuserid(usertoken) + user = getuser(usertoken) if !uid then return -1,"You must be logged in to search for GPX traces." end gpxs = [] if searchterm.to_i>0 then - gpx = Trace.find(searchterm.to_i, :conditions => ["visible=? AND (public=? OR user_id=?)",true,true,uid] ) + gpx = Trace.find(searchterm.to_i, :conditions => ["visible=? AND (public=? OR user_id=?)",true,true,user.id] ) if gpx then gpxs.push([gpx.id, gpx.name, gpx.description]) end else - Trace.find(:all, :limit => 21, :conditions => ["visible=? AND (public=? OR user_id=?) AND MATCH(name) AGAINST (?)",true,true,uid,searchterm] ).each do |gpx| + Trace.find(:all, :limit => 21, :conditions => ["visible=? AND (public=? OR user_id=?) AND MATCH(name) AGAINST (?)",true,true,user.id,searchterm] ).each do |gpx| gpxs.push([gpx.id, gpx.name, gpx.description]) end end @@ -403,7 +403,7 @@ class AmfController < ApplicationController # 2. new relation id. def putrelation(renumberednodes, renumberedways, usertoken, changeset, version, relid, tags, members, visible) #:doc: - user = getuserid(usertoken) + user = getuser(usertoken) if !user then return -1,"You are not logged in, so the relation could not be saved." end relid = relid.to_i @@ -458,12 +458,12 @@ class AmfController < ApplicationController return [0, relid, relation.id, relation.version] end rescue OSM::APIChangesetAlreadyClosedError => ex - return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}"] + return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}."] rescue OSM::APIVersionMismatchError => ex # Really need to check to see whether this is a server load issue, and the # last version was in the same changeset, or belongs to the same user, then # we can return something different - return [-3, "You have taken too long to edit, please reload the area"] + return [-3, "You have taken too long to edit, please reload the area."] rescue OSM::APIAlreadyDeletedError => ex return [-1, "The object has already been deleted"] rescue OSM::APIError => ex @@ -475,7 +475,7 @@ class AmfController < ApplicationController # version and no longer used are deleted. # # Parameters: - # 0. hash of renumbered nodes + # 0. hash of renumbered nodes (added by amf_controller) # 1. current user token (for authentication) # 2. current changeset # 3. new way version @@ -501,22 +501,23 @@ class AmfController < ApplicationController if pointlist.length < 2 then return -2,"Server error - way is only #{points.length} points long." end originalway = originalway.to_i + pointlist.collect! {|a| a.to_i } + + way=nil # this is returned, so scope it outside the transaction + nodeversions = {} Way.transaction do # -- Get unique nodes if originalway <= 0 - way = nil uniques = [] else way = Way.find(originalway) uniques = way.unshared_node_ids end - new_way = Way.new - #Ê-- Update each changed node + #-- Update each changed node - nodeversions = {} nodes.each do |a| lon = a[0].to_f lat = a[1].to_f @@ -537,12 +538,12 @@ class AmfController < ApplicationController # We're creating the node node.create_with_history(user) renumberednodes[id] = node.id - nodeversions[id] = node.version + nodeversions[node.id] = node.version else # We're updating an existing node previous=Node.find(id) previous.update_from(node, user) - nodeversions[id] = previous.version + nodeversions[previous.id] = previous.version end end @@ -559,31 +560,37 @@ class AmfController < ApplicationController # -- Save revised way - if way.tags!=attributes or way.nds!=nodes or !way.visible? - new_way = Way.new - new_way.tags = attributes - new_way.nds = pointlist - new_way.changeset_id = changeset - new_way.version = version + pointlist.collect! {|a| + renumberednodes[a] ? renumberednodes[a]:a + } # renumber nodes + new_way = Way.new + new_way.tags = attributes + new_way.nds = pointlist + new_way.changeset_id = changeset + new_way.version = version + if originalway <= 0 + new_way.create_with_history(user) + way=new_way # so we can get way.id and way.version + elsif way.tags!=attributes or way.nds!=pointlist or !way.visible? way.update_from(new_way, user) end end # transaction [0, originalway, way.id, renumberednodes, way.version, nodeversions] rescue OSM::APIChangesetAlreadyClosedError => ex - return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}"] + return [-2, "Sorry, your changeset #{ex.changeset.id} has been closed (at #{ex.changeset.closed_at})."] rescue OSM::APIVersionMismatchError => ex # Really need to check to see whether this is a server load issue, and the # last version was in the same changeset, or belongs to the same user, then # we can return something different return [-3, "Sorry, someone else has changed this way since you started editing - please reload the area"] rescue OSM::APITooManyWayNodesError => ex - return [-1, "You have tried to upload a way with #{ex.provided}, however only #{ex.max} are allowed."] + return [-1, "You have tried to upload a really long way with #{ex.provided} points: only #{ex.max} are allowed."] rescue OSM::APIAlreadyDeletedError => ex - return [-1, "The object has already been deleted"] + return [-1, "The object has already been deleted."] rescue OSM::APIError => ex # Some error that we don't specifically catch - return [-2, "Something really bad happened :-()"] + return [-2, "Something really bad happened :-(."] end # Save POI to the database. @@ -777,17 +784,6 @@ class AmfController < ApplicationController end return user end - - def getuserid(token) - user = getuser(token) - return user ? user.id : nil; - end - - # Compare two floating-point numbers to within 0.0000001 - - def fpcomp(a,b) #:doc: - return ((a/0.0000001).round==(b/0.0000001).round) - end # Send AMF response