################################ # Author: Benjamin Kellermann # # License: CC-by-sa 3.0 # # see License # ################################ require "hash" require "yaml" require "time" class Poll attr_reader :head, :name YESVAL = "ayes" MAYBEVAL = "bmaybe" NOVAL = "cno" def initialize name @name = name @head = {} @data = {} @comment = [] store "Poll #{name} created" end def init end def sort_data fields if fields.include?("name") until fields.pop == "name" end @data.sort{|x,y| cmp = x[1].compare_by_values(y[1],fields) cmp == 0 ? x[0] <=> y[0] : cmp } else @data.sort{|x,y| x[1].compare_by_values(y[1],fields) } end end def head_to_html(config = false,activecolumn = nil) ret = "Name\n" @head.sort.each{|columntitle,columndescription| ret += "#{CGI.escapeHTML(columntitle)}" if config ret += <
#{EDIT} #{CGI.escapeHTML("|")}
EDITDELETE end ret += "" } ret += "Last Edit\n" ret += "\n" ret end def to_html(edituser = "", config = false,activecolumn = nil) ret = "\n" ret += head_to_html(config, activecolumn) sort_data($cgi.include?("sort") ? $cgi.params["sort"] : ["timestamp"]).each{|participant,poll| ret += "\n" ret += "\n" @head.sort.each{|columntitle,columndescription| klasse = poll[columntitle] case klasse when nil value = UNKNOWN klasse = "undecided" when YESVAL value = YES when NOVAL value = NO when MAYBEVAL value = MAYBE end ret += "\n" } ret += "" ret += "\n" } # PARTICIPATE ret += participate_to_html(edituser) unless config # SUMMARY ret += "\n" @head.sort.each{|columntitle,columndescription| yes = 0 undecided = 0 @data.each_value{|participant| if participant[columntitle] == YESVAL yes += 1 elsif !participant.has_key?(columntitle) or participant[columntitle] == MAYBEVAL undecided += 1 end } if @data.empty? percent_f = 0 else percent_f = 100*yes/@data.size end percent = "#{percent_f}#{CGI.escapeHTML("%")}" unless @data.empty? if undecided > 0 percent += "-#{(100.0*(undecided+yes)/@data.size).round}#{CGI.escapeHTML("%")}" end ret += "\n" } ret += "" ret += "
" ret += participant ret += " #{EDIT}" unless config ret += "#{value}#{poll['timestamp'].strftime('%d.%m, %H:%M')}
total#{yes}
\n" ret end def participate_to_html(edituser) checked = {} if @data.include?(edituser) @head.each_key{|k| checked[k] = @data[edituser][k]} else @head.each_key{|k| checked[k] = NOVAL} end ret = "\n" ret += " " ret += "\n" @head.sort.each{|columntitle,columndescription| ret += "" [[YES, YESVAL],[NO, NOVAL],[MAYBE, MAYBEVAL]].each{|valhuman, valbinary| ret += "" } ret += "
" } ret += "" ret += "
" if @data.include?(edituser) ret += "\n" ret += "\n" ret end def comment_to_html ret = "
" ret += "

Comments

" unless @comment.empty? @comment.each_with_index{|c,i| time,name,comment = c ret += <
#{name} said on #{time.strftime("%d.%m, %H:%M")}   #{comment}
COMMENT } end # ADD COMMENT ret += <
says 
ADDCOMMENT ret += "
\n" ret end def history_to_html ret = "" maxrev=VCS.revno revision= defined?(REVISION) ? REVISION : maxrev log = VCS.history log.shift log.collect!{|s| s.scan(/\nrevno:.*\ncommitter.*\n.*\ntimestamp: (.*)\nmessage:\n (.*)/).flatten} log.collect!{|t,c| [Time.parse(t),c]} ((revision-2)..(revision+2)).each do |i| if i >0 && i<=maxrev ret += " " ret += "" if revision != i ret += "#{i}" ret += "" if revision != i end end ret += " last" if defined?(REVISION) ret end def add_participant(olduser, name, agreed) name.strip! if name == "" maximum = @data.keys.collect{|e| e.scan(/^Anonymous #(\d*)/).flatten[0]}.compact.collect{|i| i.to_i}.max maximum ||= 0 name = "Anonymous ##{maximum + 1}" end htmlname = CGI.escapeHTML(name) @data.delete(CGI.escapeHTML(olduser)) @data[htmlname] = {"timestamp" => Time.now } @head.each_key{|columntitle| @data[htmlname][columntitle] = agreed[columntitle.to_s] } store "Participant #{name.strip} edited" end def invite_delete(name) htmlname = CGI.escapeHTML(name.strip) if @data.has_key?(htmlname) @data.delete(htmlname) store "Participant #{name.strip} deleted" else add_participant("",name,{}) end end def store comment File.open("data.yaml", 'w') do |out| out << "# This is a dudle poll file\n" out << self.to_yaml out.chmod(0660) end VCS.commit(CGI.escapeHTML(comment)) end ############################### # comment related functions ############################### def add_comment name, comment @comment << [Time.now, CGI.escapeHTML(name.strip), CGI.escapeHTML(comment.strip).gsub("\r\n","
")] store "Comment added by #{name}" end def delete_comment index store "Comment from #{@comment.delete_at(index)[1]} deleted" end ############################### # column related functions ############################### def parsecolumntitle title title.strip end def delete_column title parsedtitle = parsecolumntitle(title) if @head.include?(parsedtitle) @head.delete(parsedtitle) store "Column #{parsedtitle} deleted" return true else return false end end def edit_column(newtitle, description, oldtitle = nil) @head.delete(oldtitle) if oldtitle parsedtitle = parsecolumntitle(newtitle) @head[parsedtitle] = CGI.escapeHTML(description.strip) store "Column #{parsedtitle} edited" true end def edit_column_htmlform(activecolumn) if activecolumn title = activecolumn description = @head[title] title = CGI.escapeHTML(title) end return <Add/Edit Column
END end end