diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sampling/peer_review.html.erb | 28 | ||||
-rw-r--r-- | lib/sampling/peer_review.rb | 85 |
2 files changed, 113 insertions, 0 deletions
diff --git a/lib/sampling/peer_review.html.erb b/lib/sampling/peer_review.html.erb new file mode 100644 index 0000000..8ff350e --- /dev/null +++ b/lib/sampling/peer_review.html.erb @@ -0,0 +1,28 @@ +<% if @feedbacks_missing.include? @user %> + <script type="text/javascript"> + function score_peers() { + var list = $('ol#boxes'); + for(var i=0, var len=list.length; i < len; i++) { + if ( i == len-1) { + comma = ""; + } + $('peer_review').value += $('ol#boxes:eq(' + i + ')').text() + comma; + } + } + </script> + <input type="hidden" id="peer_review" name="peer_review" value="" /> + <ol id="peer_review_boxes" class="sortable"> + <% @team.users.reject{|u|u==@user}.each do |user| %><li> + <%= user.user_name %> + <br> + <%# TODO: display more statistics %> + </li><% end %> + </ol> + <%= submit_tag("Submit peer evaluation", :onsubmit => "score_peers()") %> +<% else %> + <p>Still waiting for peer feedback from the following users: + <ul><% @feedbacks_missing.each do |user| %> + <li><%= link_to user %></li> + <% end %></ul> + </p> +<% end %> diff --git a/lib/sampling/peer_review.rb b/lib/sampling/peer_review.rb new file mode 100644 index 0000000..9f1833d --- /dev/null +++ b/lib/sampling/peer_review.rb @@ -0,0 +1,85 @@ +module Sampling + module PeerReview + def self.works_with?(game) + return true + end + + def self.uses_remote? + return false + end + + def self.set_remote_name(user, game, value) + raise "This sampling method doesn't use remote usernames." + end + + def self.get_remote_name(value) + raise "This sampling method doesn't use remote usernames." + end + + def self.sampling_start(match) + # do nothing + end + + def self.sampling_done?(match) + return get_feedbacks_missing(match).empty? + end + + def self.render_user_interaction(match, user) + @user = user + @team = get_team(match) + @feedbacks_missing = get_feedbacks_missing(match) + + require 'erb' + erb_filename = File.join(__FILE__.sub(/\.rb$/, '.svg.erb')) + erb = ERB.new(File.read(erb_filename)) + erb.filename = erb_filename + return erb.result.html_safe + end + + def self.handle_user_interaction(match, reviewing_user, params) + i = 0 + params[:peer_review].to_s.split(',').each do |user_name| + reviewed_user = User.find_by_user_name(user_name) + user.statistics.create(match: match, value: i) + i += 1 + end + end + + private + + def self.get_users(match) + users = [] + match.teams.each{|t| users.concat(t.users)} + return users + end + + def self.get_team(match) + match.teams.find{|t|t.users.include?(@user)} + end + + def self.get_feedbacks(match) + ret = {} + match.statistiscs.where("'name' LIKE 'feedback_from_%'").each do |statistic| + ret[statistic.user] ||= {} + ret[statistic.user][User.find_by_user_name(statistic.name.sub(/^feedback_from_/,''))] = statistic.value + end + return ret + end + + def self.get_feedbacks_missing(match) + require 'set' + ret = Set.new() + + feedback = get_feedbacks(match) + users = get_users(match) + + feedback.each do |feedback| + (users - feedback.keys).each do |user| + ret.push(user) + end + end + + return ret + endx + end +end |