forked from expertiza/expertiza
-
Notifications
You must be signed in to change notification settings - Fork 0
/
questionnaire.rb
115 lines (102 loc) · 5.11 KB
/
questionnaire.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
class Questionnaire < ActiveRecord::Base
# for doc on why we do it this way,
# see http://blog.hasmanythrough.com/2007/1/15/basic-rails-association-cardinality
has_many :questions, dependent: :destroy # the collection of questions associated with this Questionnaire
belongs_to :instructor # the creator of this questionnaire
has_many :assignment_questionnaires, dependent: :destroy
has_many :assignments, through: :assignment_questionnaires
has_one :questionnaire_node, foreign_key: 'node_object_id', dependent: :destroy, inverse_of: :questionnaire
validate :validate_questionnaire
validates :name, presence: true
validates :max_question_score, :min_question_score, numericality: true
DEFAULT_MIN_QUESTION_SCORE = 0 # The lowest score that a reviewer can assign to any questionnaire question
DEFAULT_MAX_QUESTION_SCORE = 5 # The highest score that a reviewer can assign to any questionnaire question
DEFAULT_QUESTIONNAIRE_URL = "http://www.courses.ncsu.edu/csc517".freeze
QUESTIONNAIRE_TYPES = ['ReviewQuestionnaire',
'MetareviewQuestionnaire',
'Author FeedbackQuestionnaire',
'AuthorFeedbackQuestionnaire',
'Teammate ReviewQuestionnaire',
'TeammateReviewQuestionnaire',
'SurveyQuestionnaire',
'AssignmentSurveyQuestionnaire',
'Assignment SurveyQuestionnaire',
'Global SurveyQuestionnaire',
'GlobalSurveyQuestionnaire',
'Course SurveyQuestionnaire',
'CourseSurveyQuestionnaire',
'BookmarkRatingQuestionnaire',
'QuizQuestionnaire'].freeze
has_paper_trail
def get_weighted_score(assignment, scores)
# create symbol for "varying rubrics" feature -Yang
round = AssignmentQuestionnaire.find_by(assignment_id: assignment.id, questionnaire_id: self.id).used_in_round
questionnaire_symbol = if !round.nil?
(self.symbol.to_s + round.to_s).to_sym
else
self.symbol
end
compute_weighted_score(questionnaire_symbol, assignment, scores)
end
def compute_weighted_score(symbol, assignment, scores)
aq = self.assignment_questionnaires.find_by(assignment_id: assignment.id)
if !scores[symbol][:scores][:avg].nil?
scores[symbol][:scores][:avg] * aq.questionnaire_weight / 100.0
else
0
end
end
# Does this questionnaire contain true/false questions?
def true_false_questions?
questions.each {|question| return true if question.type == "Checkbox" }
false
end
def delete
self.assignments.each do |assignment|
raise "The assignment #{assignment.name} uses this questionnaire.
Do you want to <A href='../assignment/delete/#{assignment.id}'>delete</A> the assignment?"
end
self.questions.each(&:delete)
node = QuestionnaireNode.find_by(node_object_id: self.id)
node.destroy if node
self.destroy
end
def max_possible_score
results = Questionnaire.joins('INNER JOIN questions ON questions.questionnaire_id = questionnaires.id')
.select('SUM(questions.weight) * questionnaires.max_question_score as max_score')
.where('questionnaires.id = ?', self.id)
results[0].max_score
end
# clones the contents of a questionnaire, including the questions and associated advice
def self.copy_questionnaire_details(params, instructor_id)
orig_questionnaire = Questionnaire.find(params[:id])
questions = Question.where(questionnaire_id: params[:id])
questionnaire = orig_questionnaire.dup
questionnaire.instructor_id = instructor_id
questionnaire.name = 'Copy of ' + orig_questionnaire.name
questionnaire.created_at = Time.zone.now
questionnaire.save!
questions.each do |question|
new_question = question.dup
new_question.questionnaire_id = questionnaire.id
new_question.size = '50,3' if (new_question.is_a? Criterion or new_question.is_a? TextResponse) and new_question.size.nil?
new_question.save!
advices = QuestionAdvice.where(question_id: question.id)
next if advices.empty?
advices.each do |advice|
new_advice = advice.dup
new_advice.question_id = new_question.id
new_advice.save!
end
end
questionnaire
end
# validate the entries for this questionnaire
def validate_questionnaire
errors.add(:max_question_score, "The maximum question score must be a positive integer.") if max_question_score < 1
errors.add(:min_question_score, "The minimum question score must be a positive integer.") if min_question_score < 0
errors.add(:min_question_score, "The minimum question score must be less than the maximum.") if min_question_score >= max_question_score
results = Questionnaire.where("id <> ? and name = ? and instructor_id = ?", id, name, instructor_id)
errors.add(:name, "Questionnaire names must be unique.") if results.present?
end
end