adding the controller code to be able to get a specific version of a node, way or relation. Add some node checks on update. Some code indentation cleanup.

This commit is contained in:
Shaun McDonald 2008-10-08 18:03:41 +00:00
parent e1b205913c
commit 2b7a40069f
7 changed files with 59 additions and 9 deletions

View file

@ -22,4 +22,19 @@ class OldNodeController < ApplicationController
render :nothing => true, :status => :internal_server_error
end
end
def version
begin
old_node = OldNode.find(:first, :conditions => {:id => params[:id], :version => params[:version]} )
doc = OSM::API.new.get_xml_doc
doc.root << old_node.to_xml_node
render :text => doc.to_s, :content_type => "text/xml"
rescue ActiveRecord::RecordNotFound
render :nothing => true, :status => :not_found
rescue
render :nothing => true, :status => :internal_server_error
end
end
end

View file

@ -2,6 +2,7 @@ class OldRelationController < ApplicationController
require 'xml/libxml'
session :off
before_filter :check_read_availability
after_filter :compress_output
def history
@ -20,4 +21,19 @@ class OldRelationController < ApplicationController
render :nothing => true, :status => :internal_server_error
end
end
def version
begin
old_relation = OldRelation.find(:first, :conditions => {:id => params[:id], :version => params[:version]} )
doc = OSM::API.new.get_xml_doc
doc.root << old_relation.to_xml_node
render :text => doc.to_s, :content_type => "text/xml"
rescue ActiveRecord::RecordNotFound
render :nothing => true, :status => :not_found
rescue
render :nothing => true, :status => :internetal_service_error
end
end
end

View file

@ -22,4 +22,19 @@ class OldWayController < ApplicationController
render :nothing => true, :status => :internal_server_error
end
end
def version
begin
old_way = OldWay.find(:first, :conditions => {:id => params[:id], :version => params[:version]} )
doc = OSM::API.new.get_xml_doc
doc.root << old_way.to_xml_node
render :text => doc.to_s, :content_type => "text/xml"
rescue ActiveRecord::RecordNotFound
render :nothing => true, :status => :not_found
rescue
render :nothing => true, :status => :internal_server_error
end
end
end

View file

@ -46,6 +46,7 @@ class RelationController < ApplicationController
end
def update
logger.debug request.raw_post
begin
relation = Relation.find(params[:id])
new_relation = Relation.from_xml(request.raw_post)

View file

@ -134,13 +134,13 @@ class Node < ActiveRecord::Base
def delete_with_history(user)
if self.visible
if WayNode.find(:first, :joins => "INNER JOIN current_ways ON current_ways.id = current_way_nodes.id", :conditions => [ "current_ways.visible = 1 AND current_way_nodes.node_id = ?", self.id ])
raise OSM::APIPreconditionFailedError.new
raise OSM::APIPreconditionFailedError.new
elsif RelationMember.find(:first, :joins => "INNER JOIN current_relations ON current_relations.id=current_relation_members.id", :conditions => [ "visible = 1 AND member_type='node' and member_id=?", self.id])
raise OSM::APIPreconditionFailedError.new
raise OSM::APIPreconditionFailedError.new
else
self.user_id = user.id
self.visible = 0
save_with_history!
self.user_id = user.id
self.visible = 0
save_with_history!
end
else
raise OSM::APIAlreadyDeletedError.new
@ -150,10 +150,14 @@ class Node < ActiveRecord::Base
def update_from(new_node, user)
if new_node.version != version
raise OSM::APIVersionMismatchError.new(new_node.version, version)
elsif new_node.changeset.user_id != user.id
raise OSM::APIUserChangesetMismatchError.new
elsif not new_node.changeset.open?
raise OSM::APIChangesetAlreadyClosedError.new
end
# FIXME logic need looked at
self.changeset_id = user.id
self.changeset_id = new_node.changeset_id
self.latitude = new_node.latitude
self.longitude = new_node.longitude
self.tags = new_node.tags
@ -196,7 +200,6 @@ class Node < ActiveRecord::Base
el1['visible'] = self.visible.to_s
el1['timestamp'] = self.timestamp.xmlschema
el1['version'] = self.version.to_s
return el1
end

View file

@ -246,7 +246,7 @@ class Relation < ActiveRecord::Base
else
# FIXME need to deal with changeset etc
#self.user_id = user.id
self.changeset = new_relation.changeset
self.changeset_id = new_relation.changeset_id
self.tags = new_relation.tags
self.members = new_relation.members
self.visible = true

View file

@ -57,7 +57,7 @@ module OSM
def render_opts
{ :text => "Version mismatch: Provided " + provided.to_s +
", server had: " + latest.to_s, :status => :bad_request }
", server had: " + latest.to_s, :status => :conflict }
end
end