Tidy up control flow in trace creation

This commit is contained in:
Tom Hughes 2018-08-29 08:34:38 +01:00
parent 942e62117f
commit 80a6e8da05

View file

@ -110,26 +110,27 @@ class TracesController < ApplicationController
end end
def create def create
@title = t ".upload_trace"
logger.info(params[:trace][:gpx_file].class.name) logger.info(params[:trace][:gpx_file].class.name)
if params[:trace][:gpx_file].respond_to?(:read) if params[:trace][:gpx_file].respond_to?(:read)
begin begin
do_create(params[:trace][:gpx_file], params[:trace][:tagstring], @trace = do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
params[:trace][:description], params[:trace][:visibility]) params[:trace][:description], params[:trace][:visibility])
rescue StandardError => ex rescue StandardError => ex
if @trace.valid?
flash[:error] = t("traces.create.upload_failed")
logger.debug ex logger.debug ex
end end
render :action => "new"
return
end
if @trace.id if @trace.id
flash[:notice] = t ".trace_uploaded" flash[:notice] = t ".trace_uploaded"
flash[:warning] = t ".traces_waiting", :count => current_user.traces.where(:inserted => false).count if current_user.traces.where(:inserted => false).count > 4 flash[:warning] = t ".traces_waiting", :count => current_user.traces.where(:inserted => false).count if current_user.traces.where(:inserted => false).count > 4
redirect_to :action => :list, :display_name => current_user.display_name redirect_to :action => :list, :display_name => current_user.display_name
else
flash[:error] = t("traces.create.upload_failed") if @trace.valid?
render :action => "new"
end end
else else
@trace = Trace.new(:name => "Dummy", @trace = Trace.new(:name => "Dummy",
@ -140,7 +141,7 @@ class TracesController < ApplicationController
:timestamp => Time.now.getutc) :timestamp => Time.now.getutc)
@trace.valid? @trace.valid?
@trace.errors.add(:gpx_file, "can't be blank") @trace.errors.add(:gpx_file, "can't be blank")
@title = t ".upload_trace"
render :action => "new" render :action => "new"
end end
end end
@ -314,11 +315,11 @@ class TracesController < ApplicationController
end end
if params[:file].respond_to?(:read) if params[:file].respond_to?(:read)
do_create(params[:file], tags, description, visibility) trace = do_create(params[:file], tags, description, visibility)
if @trace.id if trace.id
render :plain => @trace.id.to_s render :plain => trace.id.to_s
elsif @trace.valid? elsif trace.valid?
head :internal_server_error head :internal_server_error
else else
head :bad_request head :bad_request
@ -342,7 +343,7 @@ class TracesController < ApplicationController
# Create the trace object, falsely marked as already # Create the trace object, falsely marked as already
# inserted to stop the import daemon trying to load it # inserted to stop the import daemon trying to load it
@trace = Trace.new( trace = Trace.new(
:name => name, :name => name,
:tagstring => tags, :tagstring => tags,
:description => description, :description => description,
@ -352,13 +353,14 @@ class TracesController < ApplicationController
:timestamp => Time.now.getutc :timestamp => Time.now.getutc
) )
if trace.valid?
Trace.transaction do Trace.transaction do
begin begin
# Save the trace object # Save the trace object
@trace.save! trace.save!
# Rename the temporary file to the final name # Rename the temporary file to the final name
FileUtils.mv(filename, @trace.trace_name) FileUtils.mv(filename, trace.trace_name)
rescue StandardError rescue StandardError
# Remove the file as we have failed to update the database # Remove the file as we have failed to update the database
FileUtils.rm_f(filename) FileUtils.rm_f(filename)
@ -369,16 +371,17 @@ class TracesController < ApplicationController
begin begin
# Clear the inserted flag to make the import daemon load the trace # Clear the inserted flag to make the import daemon load the trace
@trace.inserted = false trace.inserted = false
@trace.save! trace.save!
rescue StandardError rescue StandardError
# Remove the file as we have failed to update the database # Remove the file as we have failed to update the database
FileUtils.rm_f(@trace.trace_name) FileUtils.rm_f(trace.trace_name)
# Pass the exception on # Pass the exception on
raise raise
end end
end end
end
# Finally save the user's preferred privacy level # Finally save the user's preferred privacy level
if pref = current_user.preferences.where(:k => "gps.trace.visibility").first if pref = current_user.preferences.where(:k => "gps.trace.visibility").first
@ -387,6 +390,8 @@ class TracesController < ApplicationController
else else
current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility) current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
end end
trace
end end
def offline_warning def offline_warning