]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/trace_controller.rb
Make sure the ruby quadtile code give the same result as the C version
[rails.git] / app / controllers / trace_controller.rb
index 6751cf31872ccfb66794fdb54acd3bc0988f71d6..2cd3117ddbbe0c9456d46e4d0359544a3d75caaf 100644 (file)
@@ -4,21 +4,22 @@ class TraceController < ApplicationController
   before_filter :authorize_web
   before_filter :set_locale
   before_filter :require_user, :only => [:mine, :create, :edit, :delete]
-  before_filter :authorize, :only => [:api_details, :api_data, :api_create]
-  before_filter :check_database_readable, :except => [:api_details, :api_data, :api_create]
-  before_filter :check_database_writable, :only => [:create, :edit, :delete]
-  before_filter :check_api_readable, :only => [:api_details, :api_data]
-  before_filter :check_api_writable, :only => [:api_create]
-  before_filter :require_allow_read_gpx, :only => [:api_details, :api_data]
-  before_filter :require_allow_write_gpx, :only => [:api_create]
+  before_filter :authorize, :only => [:api_create, :api_read, :api_update, :api_delete, :api_data]
+  before_filter :check_database_readable, :except => [:api_read, :api_data]
+  before_filter :check_database_writable, :only => [:create, :edit, :delete, :api_create, :api_update, :api_delete]
+  before_filter :check_api_readable, :only => [:api_read, :api_data]
+  before_filter :check_api_writable, :only => [:api_create, :api_update, :api_delete]
+  before_filter :require_allow_read_gpx, :only => [:api_read, :api_data]
+  before_filter :require_allow_write_gpx, :only => [:api_create, :api_update, :api_delete]
   before_filter :offline_warning, :only => [:mine, :view]
-  before_filter :offline_redirect, :only => [:create, :edit, :delete, :data, :api_data, :api_create]
-  around_filter :api_call_handle_error, :only => [:api_details, :api_data, :api_create]
+  before_filter :offline_redirect, :only => [:create, :edit, :delete, :data, :api_create, :api_delete, :api_data]
+  around_filter :api_call_handle_error, :only => [:api_create, :api_read, :api_update, :api_delete, :api_data]
 
-  caches_action :list, :view, :layout => false
+  caches_action :list, :unless => :logged_in?, :layout => false
+  caches_action :view, :layout => false
   caches_action :georss, :layout => true
-  cache_sweeper :trace_sweeper, :only => [:create, :edit, :delete, :api_create], :unless => STATUS == :database_offline
-  cache_sweeper :tracetag_sweeper, :only => [:create, :edit, :delete, :api_create], :unless => STATUS == :database_offline
+  cache_sweeper :trace_sweeper, :only => [:create, :edit, :delete, :api_create, :api_update, :api_delete], :unless => STATUS == :database_offline
+  cache_sweeper :tracetag_sweeper, :only => [:create, :edit, :delete, :api_create, :api_update, :api_delete], :unless => STATUS == :database_offline
 
   # Counts and selects pages of GPX traces for various criteria (by user, tags, public etc.).
   #  target_user - if set, specifies the user to fetch traces for.  if not set will fetch all traces
@@ -105,7 +106,6 @@ class TraceController < ApplicationController
     @target_user = target_user
     @display_name = target_user.display_name if target_user
     @all_tags = tagset.values
-    @trace = Trace.new(:visibility => default_visibility) if @user
   end
 
   def mine
@@ -130,6 +130,7 @@ class TraceController < ApplicationController
   def create
     if params[:trace]
       logger.info(params[:trace][:gpx_file].class.name)
+
       if params[:trace][:gpx_file].respond_to?(:read)
         begin
           do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
@@ -146,7 +147,7 @@ class TraceController < ApplicationController
             flash[:warning] = t 'trace.trace_header.traces_waiting', :count => @user.traces.count(:conditions => { :inserted => false })
           end
 
-          redirect_to :action => 'mine'
+          redirect_to :action => :list, :display_name => @user.display_name
         end
       else
         @trace = Trace.new({:name => "Dummy",
@@ -158,7 +159,10 @@ class TraceController < ApplicationController
         @trace.valid?
         @trace.errors.add(:gpx_file, "can't be blank")
       end
+    else
+      @trace = Trace.new(:visibility => default_visibility)
     end
+
     @title = t 'trace.create.upload_trace'
   end
 
@@ -206,7 +210,7 @@ class TraceController < ApplicationController
         trace.visible = false
         trace.save
         flash[:notice] = t 'trace.delete.scheduled_for_deletion'
-        redirect_to :controller => 'traces', :action => 'mine'
+        redirect_to :action => :list, :display_name => @user.display_name
       else
         render :nothing => true, :status => :bad_request
       end
@@ -276,28 +280,62 @@ class TraceController < ApplicationController
     render :nothing => true, :status => :not_found
   end
 
-  def api_details
-    trace = Trace.find(params[:id])
+  def api_read
+    trace = Trace.find(params[:id], :conditions => { :visible => true })
 
     if trace.public? or trace.user == @user
       render :text => trace.to_xml.to_s, :content_type => "text/xml"
     else
       render :nothing => true, :status => :forbidden
     end
-  rescue ActiveRecord::RecordNotFound
-    render :nothing => true, :status => :not_found
+  end
+
+  def api_update
+    trace = Trace.find(params[:id], :conditions => { :visible => true })
+
+    if trace.user == @user
+      new_trace = Trace.from_xml(request.raw_post)
+
+      unless new_trace and new_trace.id == trace.id
+        raise OSM::APIBadUserInput.new("The id in the url (#{trace.id}) is not the same as provided in the xml (#{new_trace.id})")
+      end
+
+      trace.description = new_trace.description
+      trace.tags = new_trace.tags
+      trace.visibility = new_trace.visibility
+      trace.save!
+
+      render :nothing => true, :status => :ok
+    else
+      render :nothing => true, :status => :forbidden
+    end
+  end
+
+  def api_delete
+    trace = Trace.find(params[:id], :conditions => { :visible => true })
+
+    if trace.user == @user
+      trace.visible = false
+      trace.save!
+
+      render :nothing => true, :status => :ok
+    else
+      render :nothing => true, :status => :forbidden
+    end
   end
 
   def api_data
     trace = Trace.find(params[:id])
 
     if trace.public? or trace.user == @user
-      send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => 'attachment')
+      if request.format == Mime::XML
+        send_file(trace.xml_file, :filename => "#{trace.id}.xml", :type => Mime::XML.to_s, :disposition => 'attachment')
+      else
+        send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => 'attachment')
+      end
     else
       render :nothing => true, :status => :forbidden
     end
-  rescue ActiveRecord::RecordNotFound
-    render :nothing => true, :status => :not_found
   end
 
   def api_create