gpx rss and gpx cleanups
[rails.git] / app / controllers / trace_controller.rb
1 class TraceController < ApplicationController
2   before_filter :authorize_web  
3   layout 'site'
4
5   def list
6     @page = params[:page].to_i
7     if @page > 0
8       @traces = Trace.find(:all , :conditions => ['public = true'], :order => 'timestamp DESC', :offset => 20*@page, :limit => 20)
9     else
10       @traces = Trace.find(:all , :conditions => ['public = true'], :order => 'timestamp DESC', :limit => 20)
11     end
12   end
13
14   def view
15     @trace = Trace.find(params[:id])
16     unless @trace.public
17       if @user
18         render :nothing, :status => 401 if @trace.user.id != @user.id
19       end
20     end
21   end
22
23   def create
24     filename = "/tmp/#{rand}"
25
26     File.open(filename, "w") { |f| f.write(@params['trace']['gpx_file'].read) }
27     @params['trace']['name'] = @params['trace']['gpx_file'].original_filename.gsub(/[^a-zA-Z0-9.]/, '_') # This makes sure filenames are sane
28     @params['trace'].delete('gpx_file') # let's remove the field from the hash, because there's no such field in the DB anyway.
29     @trace = Trace.new(@params['trace'])
30     @trace.inserted = false
31     @trace.user_id = @user.id
32     @trace.timestamp = Time.now
33     if @trace.save
34       logger.info("id is #{@trace.id}")
35       `mv #{filename} /tmp/#{@trace.id}.gpx`
36       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."
37     end
38
39     redirect_to :action => 'mine'
40   end
41
42   def georss
43     traces = Trace.find(:all, :conditions => ['public = true'], :order => 'timestamp DESC', :limit => 20)
44
45     rss = OSM::GeoRSS.new
46
47     #def add(latitude=0, longitude=0, title_text='dummy title', url='http://www.example.com/', description_text='dummy description', timestamp=Time.now)
48     traces.each do |trace|
49       rss.add(trace.latitude, trace.longitude, trace.name, url_for({:controller => 'trace', :action => 'view', :id => trace.id, :display_name => trace.user.display_name}), "<img src='#{url_for({:controller => 'trace', :action => 'icon', :id => trace.id, :user_login => trace.user.display_name})}'> GPX file with #{trace.size} points from #{trace.user.display_name}", trace.timestamp)
50     end
51
52     response.headers["Content-Type"] = 'application/xml+rss'
53
54     render :text => rss.to_s
55   end
56
57   def picture
58     trace = Trace.find(params[:id])
59     send_data(trace.large_picture, :filename => "#{trace.id}.gif", :type => 'image/png', :disposition => 'inline') if trace.public
60   end
61
62   def icon
63     trace = Trace.find(params[:id])
64     send_data(trace.icon_picture, :filename => "#{trace.id}.gif", :type => 'image/gif', :disposition => 'inline') if trace.public
65   end
66 end