include MapBoundary
session :off
- before_filter :check_write_availability
+ before_filter :check_api_writable
# Main AMF handlers: process the raw AMF string (using AMF library) and
# calls each action (private method) accordingly.
# Parse request
- headers=AMF.getint(req) # Read number of headers
+ headers=AMF.getint(req) # Read number of headers
headers.times do # Read each header
name=AMF.getstring(req) # |
index=AMF.getstring(req) # | get index in response sequence
bytes=AMF.getlong(req) # | get total size in bytes
args=AMF.getvalue(req) # | get response (probably an array)
- logger.info "Executing AMF #{message}:#{index}"
+ logger.info("Executing AMF #{message}:#{index}")
case message
when 'getpresets'; results[index]=AMF.putdata(index,getpresets())
bytes=AMF.getlong(req) # | get total size in bytes
args=AMF.getvalue(req) # | get response (probably an array)
+ logger.info("Executing AMF #{message}:#{index}")
case message
when 'putway'; r=putway(renumberednodes,*args)
renumberednodes=r[3]
when 'startchangeset'; results[index]=AMF.putdata(index,startchangeset(*args))
end
end
+ logger.info("encoding AMF results")
sendresponse(results)
end
cs.tags = cstags
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.created_at = Time.now.getutc
cs.closed_at = cs.created_at + Changeset::IDLE_TIMEOUT
cs.save_with_tags!
return [0,cs.id]
[wayid, points, tags, version]
end
-
+
# Get an old version of a way, and all constituent nodes.
#
# For undelete (version<0), always uses the most recent version of each node,
old_way = OldWay.find(:first, :conditions => ['visible = ? AND id = ?', true, id], :order => 'version DESC')
points = old_way.get_nodes_undelete unless old_way.nil?
else
- # revert
- timestamp = DateTime.strptime(timestamp, "%d %b %Y, %H:%M:%S")
- old_way = OldWay.find(:first, :conditions => ['id = ? AND timestamp <= ?', id, timestamp], :order => 'timestamp DESC')
- points = old_way.get_nodes_revert(timestamp) unless old_way.nil?
- if !old_way.visible
- return [-1, "Sorry, the way was deleted at that time - please revert to a previous version."]
+ begin
+ # revert
+ timestamp = DateTime.strptime(timestamp.to_s, "%d %b %Y, %H:%M:%S")
+ old_way = OldWay.find(:first, :conditions => ['id = ? AND timestamp <= ?', id, timestamp], :order => 'timestamp DESC')
+ unless old_way.nil?
+ points = old_way.get_nodes_revert(timestamp)
+ if !old_way.visible
+ return [-1, "Sorry, the way was deleted at that time - please revert to a previous version."]
+ end
+ end
+ rescue ArgumentError
+ # thrown by date parsing method. leave old_way as nil for
+ # the superb error handler below.
end
end
# 1. original relation id (unchanged),
# 2. new relation id.
- def putrelation(renumberednodes, renumberedways, usertoken, changeset, version, relid, tags, members, visible) #:doc:
+ def putrelation(renumberednodes, renumberedways, usertoken, changeset_id, version, relid, tags, members, visible) #:doc:
user = getuser(usertoken)
if !user then return -1,"You are not logged in, so the relation could not be saved." end
new_relation.members = typedmembers
new_relation.tags = tags
new_relation.visible = visible
- new_relation.changeset_id = changeset
+ new_relation.changeset_id = changeset_id
new_relation.version = version
-
- if id <= 0
+ # NOTE: id or relid here? id doesn't seem to be set above
+ if relid <= 0
# We're creating the node
new_relation.create_with_history(user)
elsif visible
# 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, "Sorry, someone else has changed this relation since you started editing. Please click the 'Edit' tab to reload the area."]
rescue OSM::APIAlreadyDeletedError => ex
- return [-1, "The object has already been deleted"]
+ return [-1, "The relation 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 a way to the database, including all nodes. Any nodes in the previous
# 4. way version,
# 5. hash of node versions (node=>version)
- def putway(renumberednodes, usertoken, changeset, wayversion, originalway, pointlist, attributes, nodes) #:doc:
+ def putway(renumberednodes, usertoken, changeset_id, wayversion, originalway, pointlist, attributes, nodes) #:doc:
# -- Initialise
if renumberednodes[id] then id = renumberednodes[id] end
node = Node.new
- node.changeset_id = changeset
+ node.changeset_id = changeset_id
node.lat = lat
node.lon = lon
node.tags = a[4]
new_way = Way.new
new_way.tags = attributes
new_way.nds = pointlist
- new_way.changeset_id = changeset
+ new_way.changeset_id = changeset_id
new_way.version = wayversion
if originalway <= 0
new_way.create_with_history(user)
uniques=uniques-pointlist
uniques.each do |n|
node = Node.find(n)
- deleteitemrelations(user, changeset, id, 'node', node.version)
+ deleteitemrelations(user, changeset_id, id, 'node', node.version)
new_node = Node.new
- new_node.changeset_id = changeset
+ new_node.changeset_id = changeset_id
new_node.version = node.version
node.delete_with_history!(new_node, user)
end
# 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"]
+ return [-3, "Sorry, someone else has changed this way since you started editing. Please click the 'Edit' tab to reload the area."]
rescue OSM::APITooManyWayNodesError => ex
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 point has already been deleted."]
rescue OSM::APIError => ex
# Some error that we don't specifically catch
return [-2, "Something really bad happened :-(."]
# 2. new node id,
# 3. version.
- def putpoi(usertoken, changeset, version, id, lon, lat, tags, visible) #:doc:
+ def putpoi(usertoken, changeset_id, version, id, lon, lat, tags, visible) #:doc:
user = getuser(usertoken)
if !user then return -1,"You are not logged in, so the point could not be saved." end
# We always need a new node, based on the data that has been sent to us
new_node = Node.new
- new_node.changeset_id = changeset
+ new_node.changeset_id = changeset_id
new_node.version = version
new_node.lat = lat
new_node.lon = lon
# 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, "Sorry, someone else has changed this point since you started editing. Please click the 'Edit' tab to reload the area."]
rescue OSM::APIAlreadyDeletedError => ex
- return [-1, "The object has already been deleted"]
+ return [-1, "The point has already been deleted"]
rescue OSM::APIError => ex
# Some error that we don't specifically catch
return [-2, "Something really bad happened :-()"]
node = Node.find(node_id)
delete_node = Node.new
delete_node.changeset_id = changeset_id
- delete_node.version = node_id_version[node_id.to_s]
+ if node_id_version[node_id.to_s]
+ delete_node.version = node_id_version[node_id.to_s]
+ else
+ # in case the node wasn't passed (i.e. if it was previously removed
+ # from the way in Potlatch)
+ deleteitemrelations(user, changeset_id, node_id, 'node', node.version)
+ delete_node.version = node.version
+ end
node.delete_with_history!(delete_node, user)
end
end # transaction
# 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, "Sorry, someone else has changed this way since you started editing. Please click the 'Edit' tab to reload the area."]
rescue OSM::APIAlreadyDeletedError => ex
- return [-1, "The object has already been deleted"]
+ return [-1, "The way 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
# Support functions
# Remove a node or way from all relations
- # This is only used by putway when deleting nodes removed from a way (because
- # Potlatch itself doesn't keep track of these - possible FIXME).
+ # This is only used by putway and deleteway when deleting nodes removed
+ # from a way (because Potlatch itself doesn't keep track of these -
+ # possible FIXME).
- def deleteitemrelations(user, changeset, objid, type, version) #:doc:
+ def deleteitemrelations(user, changeset_id, objid, type, version) #:doc:
relations = RelationMember.find(:all,
:conditions => ['member_type = ? and member_id = ?', type, objid],
:include => :relation).collect { |rm| rm.relation }.uniq
new_rel.visible = rel.visible
new_rel.version = rel.version
new_rel.members = rel.members
- new_rel.changeset_id = changeset
+ new_rel.changeset_id = changeset_id
rel.update_from(new_rel, user)
end
end