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