summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLuke Shumaker <shumakl@purdue.edu>2014-04-27 21:28:10 -0400
committerLuke Shumaker <shumakl@purdue.edu>2014-04-27 21:28:10 -0400
commit83aa6970f730005d8322402ee316e2731fd42506 (patch)
tree0f5a0b42a0bf79794b923dfefa66d1c9608ac18d /lib
parent69aef895674c8de650501a9effb0046ba41f9529 (diff)
add lib/sampling/peer_review.*
Diffstat (limited to 'lib')
-rw-r--r--lib/sampling/peer_review.html.erb28
-rw-r--r--lib/sampling/peer_review.rb85
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