]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/trace_controller.rb
destroy the feature when we leave
[rails.git] / app / controllers / trace_controller.rb
index 3eb7f5c7ece1eb0a247e2748c07117f06d79e409..4db6e8e15f4b80e4fafa6a33092d0cac60537a0d 100644 (file)
@@ -94,17 +94,26 @@ class TraceController < ApplicationController
   end
 
   def create
-    name = params[:trace][:gpx_file].original_filename.gsub(/[^a-zA-Z0-9.]/, '_') # This makes sure filenames are sane
+    logger.info(params[:trace][:gpx_file].class.name)
+    if params[:trace][:gpx_file].respond_to?(:read)
+      do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
+                params[:trace][:description], params[:trace][:public])
 
-    do_create(name, params[:trace][:tagstring], params[:trace][:description], params[:trace][:public]) do |f|
-      f.write(params[:trace][:gpx_file].read)
-    end
-
-    if @trace.id
-      logger.info("id is #{@trace.id}")
-      flash[:notice] = "Your GPX file has been uploaded and is awaiting insertion in to the database. This will usually happen within half an hour, and an email will be sent to you on completion."
+      if @trace.id
+        logger.info("id is #{@trace.id}")
+        flash[:notice] = "Your GPX file has been uploaded and is awaiting insertion in to the database. This will usually happen within half an hour, and an email will be sent to you on completion."
 
-      redirect_to :action => 'mine'
+        redirect_to :action => 'mine'
+      end
+    else
+      @trace = Trace.new({:name => "Dummy",
+                          :tagstring => params[:trace][:tagstring],
+                          :description => params[:trace][:description],
+                          :public => params[:trace][:public],
+                          :inserted => false, :user => @user,
+                          :timestamp => Time.now})
+      @trace.valid?
+      @trace.errors.add(:gpx_file, "can't be blank")
     end
   end
 
@@ -112,7 +121,11 @@ class TraceController < ApplicationController
     trace = Trace.find(params[:id])
 
     if trace.visible? and (trace.public? or (@user and @user == trace.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, :status => :not_found
     end
@@ -259,11 +272,7 @@ class TraceController < ApplicationController
 
   def api_create
     if request.post?
-      name = params[:file].original_filename.gsub(/[^a-zA-Z0-9.]/, '_') # This makes sure filenames are sane
-
-      do_create(name, params[:tags], params[:description], params[:public]) do |f|
-        f.write(params[:file].read)
-      end
+      do_create(params[:file], params[:tags], params[:description], params[:public])
 
       if @trace.id
         render :text => @trace.id.to_s, :content_type => "text/plain"
@@ -279,10 +288,11 @@ class TraceController < ApplicationController
 
 private
 
-  def do_create(name, tags, description, public)
+  def do_create(file, tags, description, public)
+    name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, '_')
     filename = "/tmp/#{rand}"
 
-    File.open(filename, "w") { |f| yield f }
+    File.open(filename, "w") { |f| f.write(file.read) }
 
     @trace = Trace.new({:name => name, :tagstring => tags,
                         :description => description, :public => public})
@@ -291,7 +301,7 @@ private
     @trace.timestamp = Time.now
 
     if @trace.save
-      File.rename(filename, @trace.trace_name)
+      FileUtils.mv(filename, @trace.trace_name)
     else
       FileUtils.rm_f(filename)
     end