]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/trace_controller.rb
Treat an explicit public=0 argument as meaning private.
[rails.git] / app / controllers / trace_controller.rb
index dc7456c45099ec923731ccd43944be57001bd459..b29b6dde1b0e06fd8fbeca14b2483d167715da03 100644 (file)
@@ -2,12 +2,15 @@ class TraceController < ApplicationController
   layout 'site'
 
   before_filter :authorize_web
-  before_filter :require_user, :only => [:mine, :create, :edit, :delete, :make_public]
+  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, :make_public]
+  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]
  
   # 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
@@ -17,6 +20,7 @@ class TraceController < ApplicationController
     if target_user.nil? and !display_name.blank?
       target_user = User.find(:first, :conditions => [ "visible = ? and display_name = ?", true, display_name])
       if target_user.nil?
+        @title = t'trace.no_such_user.title'
         @not_found_user = display_name
         render :action => 'no_such_user', :status => :not_found
         return
@@ -25,14 +29,14 @@ class TraceController < ApplicationController
 
     # set title
     if target_user.nil?
-      @title = "Public GPS traces"
+      @title = t 'trace.list.public_traces'
     elsif @user and @user == target_user
-      @title = "Your GPS traces"
+      @title = t 'trace.list.your_traces'
     else
-      @title = "Public GPS traces from #{target_user.display_name}"
+      @title = t 'trace.list.public_traces_from', :user => target_user.display_name
     end
 
-    @title += " tagged with #{params[:tag]}" if params[:tag]
+    @title += t 'trace.list.tagged_with', :tags => params[:tag] if params[:tag]
 
     # four main cases:
     # 1 - all traces, logged in = all public traces + all user's (i.e + all mine)
@@ -41,15 +45,15 @@ class TraceController < ApplicationController
     # 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.public = ? OR gpx_files.user_id = ?)", true, @user.id] #1
+        conditions = ["(gpx_files.visibility in ('public', 'identifiable') OR gpx_files.user_id = ?)", @user.id] #1
       else
-        conditions  = ["gpx_files.public = ?", true] #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 = ? AND gpx_files.user_id = ?", true, target_user.id] #4
+        conditions = ["gpx_files.visibility in ('public', 'identifiable') AND gpx_files.user_id = ?", target_user.id] #4
       end
     end
     
@@ -57,7 +61,12 @@ class TraceController < ApplicationController
       @tag = params[:tag]
 
       files = Tracetag.find_all_by_tag(params[:tag]).collect { |tt| tt.gpx_id }
-      conditions[0] += " AND gpx_files.id IN (#{files.join(',')})"
+
+      if files.length > 0
+        conditions[0] += " AND gpx_files.id IN (#{files.join(',')})"
+      else
+        conditions[0] += " AND 0 = 1"
+      end
     end
     
     conditions[0] += " AND gpx_files.visible = ?"
@@ -87,6 +96,16 @@ class TraceController < ApplicationController
   end
 
   def mine
+    # Load the preference of whether the user set the trace public the last time
+    @trace = Trace.new
+    visibility = @user.preferences.find(:first, :conditions => {:k => "gps.trace.visibility"})
+    if visibility
+      @trace.visibility = visibility.v
+    elsif @user.preferences.find(:first, :conditions => {:k => "gps.trace.public", :v => "default"}).nil?
+      @trace.visibility = "private"
+    else 
+      @trace.visibility = "public"
+    end
     list(@user, "mine")
   end
 
@@ -95,13 +114,13 @@ class TraceController < ApplicationController
 
     if @trace and @trace.visible? and
        (@trace.public? or @trace.user == @user)
-      @title = "Viewing trace #{@trace.name}"
+      @title = t 'trace.view.title', :name => @trace.name
     else
-      flash[:notice] = "Trace not found!"
+      flash[:notice] = t 'trace.view.trace_not_found'
       redirect_to :controller => 'trace', :action => 'list'
     end
   rescue ActiveRecord::RecordNotFound
-    flash[:notice] = "Trace not found!"
+    flash[:notice] = t 'trace.view.trace_not_found'
     redirect_to :controller => 'trace', :action => 'list'
   end
 
@@ -110,11 +129,11 @@ class TraceController < ApplicationController
       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])
+                  params[:trace][:description], params[:trace][:visibility])
 
         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."
+          flash[:notice] = t 'trace.create.trace_uploaded'
 
           redirect_to :action => 'mine'
         end
@@ -122,13 +141,14 @@ class TraceController < ApplicationController
         @trace = Trace.new({:name => "Dummy",
                             :tagstring => params[:trace][:tagstring],
                             :description => params[:trace][:description],
-                            :public => params[:trace][:public],
+                            :visibility => params[:trace][:visibility],
                             :inserted => false, :user => @user,
                             :timestamp => Time.now.getutc})
         @trace.valid?
         @trace.errors.add(:gpx_file, "can't be blank")
       end
     end
+    @title = t 'trace.create.upload_trace'
   end
 
   def data
@@ -151,9 +171,11 @@ class TraceController < ApplicationController
     @trace = Trace.find(params[:id])
 
     if @user and @trace.user == @user
+      @title = t 'trace.edit.title', :name => @trace.name
       if params[:trace]
         @trace.description = params[:trace][:description]
         @trace.tagstring = params[:trace][:tagstring]
+        @trace.visibility = params[:trace][:visibility]
         if @trace.save
           redirect_to :action => 'view'
         end        
@@ -172,7 +194,7 @@ class TraceController < ApplicationController
       if request.post? and trace.visible?
         trace.visible = false
         trace.save
-        flash[:notice] = 'Track scheduled for deletion'
+        flash[:notice] = t 'trace.delete.scheduled_for_deletion'
         redirect_to :controller => 'traces', :action => 'mine'
       else
         render :nothing => true, :status => :bad_request
@@ -184,27 +206,8 @@ class TraceController < ApplicationController
     render :nothing => true, :status => :not_found
   end
 
-  def make_public
-    trace = Trace.find(params[:id])
-
-    if @user and trace.user == @user
-      if request.post? and !trace.public?
-        trace.public = true
-        trace.save
-        flash[:notice] = 'Track made public'
-        redirect_to :controller => 'trace', :action => 'view', :id => params[:id]
-      else
-        render :nothing => true, :status => :bad_request
-      end
-    else
-      render :nothing => true, :status => :forbidden
-    end
-  rescue ActiveRecord::RecordNotFound
-    render :nothing => true, :status => :not_found
-  end
-
   def georss
-    conditions = ["gpx_files.public = ?", true]
+    conditions = ["gpx_files.visibility in ('public', 'identifiable')"]
 
     if params[:display_name]
       conditions[0] += " AND users.display_name = ?"
@@ -233,6 +236,7 @@ class TraceController < ApplicationController
 
     if trace.inserted?
       if trace.public? or (@user and @user == trace.user)
+        expires_in 7.days, :private => !trace.public?, :public => trace.public?
         send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => 'image/gif', :disposition => 'inline')
       else
         render :nothing => true, :status => :forbidden
@@ -249,6 +253,7 @@ class TraceController < ApplicationController
 
     if trace.inserted?
       if trace.public? or (@user and @user == trace.user)
+        expires_in 7.days, :private => !trace.public?, :public => trace.public?
         send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => 'image/gif', :disposition => 'inline')
       else
         render :nothing => true, :status => :forbidden
@@ -288,10 +293,18 @@ class TraceController < ApplicationController
     if request.post?
       tags = params[:tags] || ""
       description = params[:description] || ""
-      pub = params[:public] || false
-      
+      visibility = params[:visibility]
+
+      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, pub)
+        do_create(params[:file], tags, description, visibility)
 
         if @trace.id
           render :text => @trace.id.to_s, :content_type => "text/plain"
@@ -310,7 +323,7 @@ class TraceController < ApplicationController
 
 private
 
-  def do_create(file, tags, description, public)
+  def do_create(file, tags, description, visibility)
     # Sanitise the user's filename
     name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, '_')
 
@@ -326,7 +339,7 @@ private
       :name => name,
       :tagstring => tags,
       :description => description,
-      :public => public,
+      :visibility => visibility,
       :inserted => true,
       :user => @user,
       :timestamp => Time.now.getutc
@@ -345,14 +358,12 @@ private
       FileUtils.rm_f(filename)
     end
     
-    # Finally save whether the user marked the trace as being public
-    if @trace.public?
-      if @user.trace_public_default.nil?
-        @user.preferences.create(:k => "gps.trace.public", :v => "default")
-      end
+    # Finally save the user's preferred previacy level
+    if pref = @user.preferences.find(:first, :conditions => {:k => "gps.trace.visibility"})
+      pref.v = visibility
+      pref.save
     else
-      pref = @user.trace_public_default
-      pref.destroy unless pref.nil?
+      @user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
     end
     
   end