Merged 17047 from trunk.
authorTom Hughes <tom@compton.nu>
Tue, 13 Oct 2009 20:20:13 +0000 (20:20 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 13 Oct 2009 20:20:13 +0000 (20:20 +0000)
1  2 
app/controllers/trace_controller.rb

index c90558269a6b0b497c7a8a37275846924494753c,1dee0b9248ee539549e7e5ff898350db28c87b6a..84026e8cd4d420f6f437778df8924db6c6179777
@@@ -9,10 -9,7 +9,10 @@@ class TraceController < ApplicationCont
    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]
 +  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")
      # 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 <> 'private' OR gpx_files.user_id = ?)", @user.id] #1
+         conditions = ["(gpx_files.visibility in ('public', 'identifiable') OR gpx_files.user_id = ?)", @user.id] #1
        else
-         conditions  = ["gpx_files.visibility <> 'private'"] #2
+         conditions  = ["gpx_files.visibility in ('public', 'identifiable')"] #2
        end
      else
        if @user and @user == target_user
          conditions = ["gpx_files.user_id = ?", @user.id] #3 (check vs user id, so no join + can't pick up non-public traces by changing name)
        else
-         conditions = ["gpx_files.public <> 'private' AND gpx_files.user_id = ?", target_user.id] #4
+         conditions = ["gpx_files.visibility in ('public', 'identifiable') AND gpx_files.user_id = ?", target_user.id] #4
        end
      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
 +        end
  
          if @trace.id
            logger.info("id is #{@trace.id}")
    end
  
    def georss
-     conditions = ["gpx_files.visibility <> 'private'"]
+     conditions = ["gpx_files.visibility in ('public', 'identifiable')"]
  
      if params[:display_name]
        conditions[0] += " AND users.display_name = ?"
      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)
  
@@@ -349,35 -339,20 +349,35 @@@ privat
        :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