forked from expertiza/expertiza
-
Notifications
You must be signed in to change notification settings - Fork 0
/
review_bid.rb
65 lines (54 loc) · 2.81 KB
/
review_bid.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class ReviewBid < ActiveRecord::Base
belongs_to :topic, class_name: 'SignUpTopic'
belongs_to :participant, class_name: 'Participant'
belongs_to :assignment, class_name: 'Assignment'
# method to get bidding data
# returns the bidding data needed for the assigning algorithm
# student_ids, topic_ids, student_preferences, topic_preferences, max reviews allowed
public
def self.get_bidding_data(assignment_id,reviewer_ids)
# create basic hash and set basic hash data
bidding_data = {'tid'=> [], 'users' => Hash.new, 'max_accepted_proposals' => []}
bidding_data['tid'] = SignUpTopic.where(assignment_id: assignment_id).ids
bidding_data['max_accepted_proposals'] = Assignment.where(id:assignment_id).pluck(:num_reviews_allowed).first
# loop through reviewer_ids to get reviewer specific bidding data
for reviewer_id in reviewer_ids do
bidding_data['users'][reviewer_id] = self.reviewer_bidding_data(reviewer_id,assignment_id)
end
return bidding_data
end
# assigns topics to reviews as matched by the webservice algorithm
def self.assign_review_topics(assignment_id,reviewer_ids,matched_topics,min_num_reviews=2)
# if review response map already created, delete it
if ReviewResponseMap.where(:reviewed_object_id => assignment_id)
ReviewResponseMap.where(:reviewed_object_id => assignment_id).destroy_all
end
# loop through reviewer_ids to assign reviews to each reviewer
reviewer_ids.each do |reviewer_id|
topics_to_assign = matched_topics[reviewer_id.to_s]
topics_to_assign.each do |topic|
assign_topic_to_reviewer(assignment_id,reviewer_id,topic)
end
end
end
# method to assign a single topic to a reviewer
def self.assign_topic_to_reviewer(assignment_id,reviewer_id,topic)
team_to_review = SignedUpTeam.where(topic_id: topic).pluck(:team_id).first
team_to_review.nil? ? [] : ReviewResponseMap.create({:reviewed_object_id => assignment_id, :reviewer_id => reviewer_id, :reviewee_id => team_to_review, :type => "ReviewResponseMap"})
end
# method for getting individual reviewer_ids bidding data
# returns user's bidding data hash
def self.reviewer_bidding_data(reviewer_id,assignment_id)
reviewer_user_id = AssignmentParticipant.find(reviewer_id).user_id
self_topic = SignedUpTeam.topic_id(assignment_id, reviewer_user_id)
bidding_data = {'tid'=> [], 'otid' => self_topic, 'priority' => [], 'time'=>[]}
bids = ReviewBid.where(participant_id: reviewer_id)
# loop through each bid for a topic to get specific data
for bid in bids do
bidding_data['tid'] << bid.signuptopic_id
bidding_data['priority'] << bid.priority
bidding_data['time'] << bid.updated_at
end
return bidding_data
end
end