From 7e964afcc67c65d12b81912270f2323873c5617b Mon Sep 17 00:00:00 2001 From: ioBridge Date: Sun, 27 Mar 2011 19:27:48 -0400 Subject: [PATCH] added support for gelocation in feeds --- app/controllers/channels_controller.rb | 40 +++++++++++++++++++--- app/controllers/feed_controller.rb | 12 ++++++- db/schema.rb | 46 ++++++++++++++++---------- 3 files changed, 75 insertions(+), 23 deletions(-) diff --git a/app/controllers/channels_controller.rb b/app/controllers/channels_controller.rb index 2cbc725..a1b2fac 100644 --- a/app/controllers/channels_controller.rb +++ b/app/controllers/channels_controller.rb @@ -9,6 +9,7 @@ class ChannelsController < ApplicationController def show @channel = Channel.find(params[:id]) if params[:id] + @domain = domain # if owner of channel get_channel_data if current_user and @channel.user_id == current_user.id @@ -28,6 +29,10 @@ class ChannelsController < ApplicationController @channel.update_attributes(params[:channel]) @channel.name = "#{t(:channel_default_name)} #{@channel.id}" if params[:channel][:name].empty? @channel.save + + # save tags + @channel.save_tags(params[:tags][:name]) + redirect_to channel_path(@channel.id) and return end @@ -59,6 +64,20 @@ class ChannelsController < ApplicationController redirect_to edit_channel_path(@channel.id) end + # clear all data from a channel + def clear + channel = Channel.find(params[:id]) + # make sure channel belongs to current user + check_permissions(channel) + + # do the delete + channel.feeds.each do |f| + f.delete + end + + redirect_to channels_path + end + def destroy @channel = Channel.find(params[:id]) # make sure channel belongs to current user @@ -73,13 +92,16 @@ class ChannelsController < ApplicationController def post_data status = '0' feed = Feed.new - + api_key = ApiKey.find_by_api_key(get_userkey) # if write persmission, allow post if (api_key && api_key.write_flag) channel = Channel.find(api_key.channel_id) + # rate limit posts + render :text => '0' and return if (Time.now < channel.updated_at + 14.seconds) + # update entry_id for channel and feed entry_id = channel.last_entry_id.nil? ? 1 : channel.last_entry_id + 1 channel.last_entry_id = entry_id @@ -88,15 +110,18 @@ class ChannelsController < ApplicationController # try to get created_at datetime if appropriate if params[:created_at] begin - @feed.created_at = DateTime.parse(params[:created_at]) + feed.created_at = DateTime.parse(params[:created_at]) # if invalid datetime, don't do anything--rails will set created_at rescue end end - # strip line feeds from end of parameters + # modify parameters params.each do |key, value| - params[key] = value.sub(/\\n$/, '').sub(/\\r$/, '') + # strip line feeds from end of parameters + params[key] = value.sub(/\\n$/, '').sub(/\\r$/, '') if value + # use ip address if found + params[key] = request.remote_addr if value.upcase == 'IP_ADDRESS' end # set feed details @@ -111,6 +136,11 @@ class ChannelsController < ApplicationController feed.field7 = params[:field7] if params[:field7] feed.field8 = params[:field8] if params[:field8] feed.status = params[:status] if params[:status] + feed.latitude = params[:lat] if params[:lat] + feed.latitude = params[:latitude] if params[:latitude] + feed.longitude = params[:long] if params[:long] + feed.longitude = params[:longitude] if params[:longitude] + feed.elevation = params[:elevation] if params[:elevation] if channel.save && feed.save status = entry_id @@ -122,4 +152,4 @@ class ChannelsController < ApplicationController render :text => status end -end +end \ No newline at end of file diff --git a/app/controllers/feed_controller.rb b/app/controllers/feed_controller.rb index 129de78..22e8206 100644 --- a/app/controllers/feed_controller.rb +++ b/app/controllers/feed_controller.rb @@ -1,5 +1,6 @@ class FeedController < ApplicationController require 'csv' + layout 'application', :except => :index def index channel = Channel.find(params[:channel_id]) @@ -8,6 +9,7 @@ class FeedController < ApplicationController # check for access if @success + # create options hash channel_options = { :only => channel_select_data(channel) } select_options = feed_select_data(channel) @@ -17,7 +19,7 @@ class FeedController < ApplicationController :all, :conditions => { :channel_id => channel.id, :created_at => get_date_range(params) }, :select => select_options, - :order => 'created_at' + :order => 'created_at desc' ) # if a feed has data @@ -159,6 +161,13 @@ class FeedController < ApplicationController only += [:field8] unless channel.field8.blank? or (params[:field_id] and params[:field_id] != '8') only += [:status] if params[:status] and params[:status].upcase == 'TRUE' + # add geolocation data if necessary + if params[:location] and params[:location].upcase == 'TRUE' + only += [:latitude] + only += [:longitude] + only += [:elevation] + end + return only end @@ -171,6 +180,7 @@ class FeedController < ApplicationController return false end end + # slice feed into timescales def feeds_into_timescales(feeds) # convert timescale (minutes) into seconds diff --git a/db/schema.rb b/db/schema.rb index 9aa5a8f..3368596 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -31,14 +31,14 @@ ActiveRecord::Schema.define(:version => 20101210151518) do t.string "description" t.decimal "latitude", :precision => 15, :scale => 10 t.decimal "longitude", :precision => 15, :scale => 10 - t.text "field1" - t.text "field2" - t.text "field3" - t.text "field4" - t.text "field5" - t.text "field6" - t.text "field7" - t.text "field8" + t.string "field1" + t.string "field2" + t.string "field3" + t.string "field4" + t.string "field5" + t.string "field6" + t.string "field7" + t.string "field8" t.integer "scale1" t.integer "scale2" t.integer "scale3" @@ -52,26 +52,38 @@ ActiveRecord::Schema.define(:version => 20101210151518) do t.string "elevation" t.integer "last_entry_id" t.boolean "public_flag", :default => false + t.string "options1" + t.string "options2" + t.string "options3" + t.string "options4" + t.string "options5" + t.string "options6" + t.string "options7" + t.string "options8" end + create_table "feeds", :force => true do |t| t.integer "channel_id" t.text "raw_data" - t.text "field1" - t.text "field2" - t.text "field3" - t.text "field4" - t.text "field5" - t.text "field6" - t.text "field7" - t.text "field8" + t.string "field1" + t.string "field2" + t.string "field3" + t.string "field4" + t.string "field5" + t.string "field6" + t.string "field7" + t.string "field8" t.datetime "created_at" t.datetime "updated_at" t.integer "entry_id" t.string "status" + t.decimal "latitude", :precision => 15, :scale => 10 + t.decimal "longitude", :precision => 15, :scale => 10 + t.string "elevation" end - add_index "feeds", ["channel_id"], :name => "index_feeds_on_channel_id" + add_index "feeds", ["channel_id", "created_at"], :name => "index_feeds_on_channel_id_and_created_at" create_table "users", :force => true do |t| t.string "login", :null => false