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 :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]
+
# 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
def list(target_user = nil, action = "list")
# four main cases:
# 1 - all traces, logged in = all public traces + all user's (i.e + all mine)
# 2 - all traces, not logged in = all public traces
- # 3 - user's traces, logged in as same user = all user's traces
+ # 3 - user's traces, logged in as same user = all user's traces
# 4 - user's traces, not logged in as that user = all user's public traces
if target_user.nil? # all traces
if @user
conditions = ["gpx_files.visibility in ('public', 'identifiable') AND gpx_files.user_id = ?", target_user.id] #4
end
end
-
+
if params[:tag]
@tag = params[:tag]
conditions[0] += " AND 0 = 1"
end
end
-
+
conditions[0] += " AND gpx_files.visible = ?"
conditions << true
end
end
end
-
+
# final helper vars for view
@action = action
@display_name = target_user.display_name if target_user
@trace.visibility = visibility.v
elsif @user.preferences.find(:first, :conditions => {:k => "gps.trace.public", :v => "default"}).nil?
@trace.visibility = "private"
- else
+ else
@trace.visibility = "public"
end
list(@user, "mine")
(@trace.public? or @trace.user == @user)
@title = t 'trace.view.title', :name => @trace.name
else
- flash[:notice] = t 'trace.view.trace_not_found'
+ flash[:error] = t 'trace.view.trace_not_found'
redirect_to :controller => 'trace', :action => 'list'
end
rescue ActiveRecord::RecordNotFound
- flash[:notice] = t 'trace.view.trace_not_found'
+ flash[:error] = t 'trace.view.trace_not_found'
redirect_to :controller => 'trace', :action => 'list'
end
if params[:trace]
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][:visibility])
+ begin
+ do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
+ params[:trace][:description], params[:trace][:visibility])
+ rescue => ex
+ logger.debug ex
+ end
if @trace.id
logger.info("id is #{@trace.id}")
@trace.visibility = params[:trace][:visibility]
if @trace.save
redirect_to :action => 'view'
- end
+ end
end
else
render :nothing => true, :status => :forbidden
conditions << params[:tag]
end
- traces = Trace.find(:all, :include => :user, :conditions => conditions,
+ traces = Trace.find(:all, :include => :user, :conditions => conditions,
:order => "timestamp DESC", :limit => 20)
rss = OSM::GeoRSS.new
if request.post?
tags = params[:tags] || ""
description = params[:description] || ""
- visibility = params[:visibility] || false
+ visibility = params[:visibility]
- if params[:public] && !visibility
- visibility = "public"
+ if visibility.nil?
+ if params[:public] && params[:public].to_i.nonzero?
+ visibility = "public"
+ else
+ visibility = "private"
+ end
end
-
+
if params[:file].respond_to?(:read)
do_create(params[:file], tags, description, visibility)
:timestamp => Time.now.getutc
})
- # Save the trace object
- if @trace.save
- # Rename the temporary file to the final name
- FileUtils.mv(filename, @trace.trace_name)
+ Trace.transaction do
+ begin
+ # Save the trace object
+ @trace.save!
- # Clear the inserted flag to make the import daemon load the trace
- @trace.inserted = false
- @trace.save!
- else
- # Remove the file as we have failed to update the database
- FileUtils.rm_f(filename)
+ # Rename the temporary file to the final name
+ FileUtils.mv(filename, @trace.trace_name)
+ rescue Exception => ex
+ # Remove the file as we have failed to update the database
+ FileUtils.rm_f(filename)
+
+ # Pass the exception on
+ raise
+ end
+
+ begin
+ # Clear the inserted flag to make the import daemon load the trace
+ @trace.inserted = false
+ @trace.save!
+ rescue Exception => ex
+ # Remove the file as we have failed to update the database
+ FileUtils.rm_f(@trace.trace_name)
+
+ # Pass the exception on
+ raise
+ end
end
-
- # Finally save the user's preferred previacy level
+
+ # Finally save the user's preferred privacy level
if pref = @user.preferences.find(:first, :conditions => {:k => "gps.trace.visibility"})
pref.v = visibility
pref.save
else
@user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
end
-
+
+ end
+
+ def offline_warning
+ flash.now[:warning] = t 'trace.offline_warning.message' if OSM_STATUS == :gpx_offline
+ end
+
+ def offline_redirect
+ redirect_to :action => :offline if OSM_STATUS == :gpx_offline
end
end