require 'fastercsv' class QuestionsController < InheritedResources::Base before_filter :authenticate respond_to :xml, :json respond_to :csv, :only => :export #leave the option for xml export here belongs_to :site, :optional => true def recent_votes_by_question_id creator_id = params[:creator_id] date = params[:date] if creator_id questions = Question.find(:all, :select => :id, :conditions => { :local_identifier => creator_id}) questions_list = questions.map {|record | record.quoted_id} question_votes_hash = Vote.with_question(questions_list).recent.count(:group => :question_id) elsif date #only for admins question_votes_hash = Vote.recent(date).count(:group => :question_id) else question_votes_hash = Vote.recent.count(:group => :question_id) end respond_to do |format| format.xml{ render :xml => question_votes_hash.to_xml and return} end end def show @question = Question.find(params[:id]) unless params[:barebones] @p = @question.picked_prompt left_choice_text = Proc.new { |options| options[:builder].tag!('left_choice_text', @p.left_choice.item.data) } right_choice_text = Proc.new { |options| options[:builder].tag!('right_choice_text', @p.right_choice.item.data) } picked_prompt_id = Proc.new { |options| options[:builder].tag!('picked_prompt_id', @p.id) } show! do |format| session['prompts_ids'] ||= [] format.xml { render :xml => @question.to_xml(:methods => [:item_count], :procs => [left_choice_text, right_choice_text, picked_prompt_id]) } end else show! do |format| session['prompts_ids'] ||= [] format.xml { render :xml => @question.to_xml(:methods => [:item_count, :votes_count]) } end end end def create logger.info "all params are #{params.inspect}" logger.info "vi is #{params['question']['visitor_identifier']} and local are #{params['question']['local_identifier']}." if @question = current_user.create_question(params['question']['visitor_identifier'], :name => params['question']['name'], :local_identifier => params['question']['local_identifier'], :ideas => (params['question']['ideas'].lines.to_a.delete_if {|i| i.blank?})) respond_to do |format| format.xml { render :xml => @question.to_xml} end else respond_to do |format| format.xml { render :xml => @question.errors.to_xml} end end end def set_autoactivate_ideas_from_abroad expire_page :action => :index logger.info("INSIDE autoactivate ideas") @question = current_user.questions.find(params[:id]) @question.it_should_autoactivate_ideas = params[:question][:it_should_autoactivate_ideas] respond_to do |format| if @question.save logger.info "successfully set this question to autoactive ideas #{@question.inspect}" format.xml { render :xml => true } format.json { render :json => true} else logger.info "Some error in saving question, #{@question.inspect}" format.xml { render(:xml => false) and return} format.json { render :json => false } end end end def export type = params[:type] if type == 'votes' export_votes elsif type == 'items' export_items else render :text => "Error! Specify a type of export" end # export_type = params[:export_type] # export_format = params[:export_format] #CSV always now, could expand to xml later end def num_votes_by_visitor_id @question = current_user.questions.find(params[:id]) hash = Vote.count(:conditions => "question_id = #{@question.id}", :group => "voter_id") visitor_id_hash = {} hash.each do |visitor_id, num_votes| visitor = Visitor.find(visitor_id) visitor_id_hash[visitor.identifier] = num_votes end respond_to do |format| format.xml{ render :xml => visitor_id_hash.to_xml and return} end end def object_info_totals_by_date authenticate object_type = params[:object_type] @question = current_user.questions.find(params[:id]) if object_type == 'votes' # eventually allow for users to specify type of export through params[:type] hash = Vote.count(:conditions => "question_id = #{@question.id}", :group => "date(created_at)") elsif object_type == 'user_submitted_ideas' hash = Choice.count(:include => 'item', :conditions => "choices.question_id = #{@question.id} AND items.creator_id <> #{@question.creator_id}", :group => "date(choices.created_at)") elsif object_type == 'user_sessions' # little more work to do here: result = Vote.find(:all, :select => 'date(created_at) as date, voter_id, count(*) as vote_count', :conditions => "question_id = #{@question.id}", :group => 'date(created_at), voter_id') hash = Hash.new(0) result.each do |r| hash[r.date]+=1 end end respond_to do |format| format.xml { render :xml => hash.to_xml and return} end end protected def export_votes @question = Question.find(params[:id]) outfile = "ideamarketplace_#{@question.id}_votes" + Time.now.strftime("%m-%d-%Y") + ".csv" headers = ['Vote ID', 'Session ID', 'Question ID','Winner ID', 'Winner Text', 'Loser ID', 'Loser Text', 'Prompt ID', 'Left Choice ID', 'Right Choice ID', 'Created at', 'Updated at'] @votes = @question.votes csv_data = FasterCSV.generate do |csv| csv << headers @votes.each do |v| prompt = v.prompt # these may not exist loser_data = v.loser_choice.nil? ? "" : "'#{v.loser_choice.data.strip}'" left_id = v.prompt.nil? ? "" : v.prompt.left_choice_id right_id = v.prompt.nil? ? "" : v.prompt.right_choice_id csv << [ v.id, v.voter_id, v.question_id, v.choice_id, "\'#{v.choice.data.strip}'", v.loser_choice_id, loser_data, v.prompt_id, left_id, right_id, v.created_at, v.updated_at] end end send_data(csv_data, :type => 'text/csv; charset=iso-8859-1; header=present', :disposition => "attachment; filename=#{outfile}") end def export_items @question = Question.find(params[:id], :include => [:choices, :prompts]) outfile = "ideamarketplace_#{@question.id}_ideas_" + Time.now.strftime("%m-%d-%Y") + ".csv" headers = ['Ideamarketplace ID','Idea ID', 'Idea', 'Wins', 'Losses', 'Score','User Submitted', 'Idea Creator ID', 'Created at', 'Last Activity', 'Active', 'Local Identifier', 'Prompts on Left', 'Prompts on Right', 'Prompts Count'] csv_data = FasterCSV.generate do |csv| csv << headers #ensure capital format for true and false @question.choices.each do |c| user_submitted = (c.item.creator != @question.creator) ? "TRUE" : "FALSE" csv << [c.question_id, c.id, "'#{c.data.strip}'", c.wins, c.losses, c.score, user_submitted , c.item.creator_id, c.created_at, c.updated_at, c.active, c.local_identifier, c.prompts_on_the_left(true).size, c.prompts_on_the_right(true).size, c.prompts_count] end end send_data(csv_data, :type => 'text/csv; charset=iso-8859-1; header=present', :disposition => "attachment; filename=#{outfile}") end end class String unless defined? "".lines alias lines to_a #Ruby version compatibility end end