def _submit_all_comparisons_for_assignment(self, assignment, user_id): submit_count = 0 for comparison_example in assignment.comparison_examples: comparisons = Comparison.create_new_comparison_set(assignment.id, user_id, False) self.assertEqual(comparisons[0].answer1_id, comparison_example.answer1_id) self.assertEqual(comparisons[0].answer2_id, comparison_example.answer2_id) for comparison in comparisons: comparison.completed = True comparison.winner_id = min([comparisons[0].answer1_id, comparisons[0].answer2_id]) db.session.add(comparison) submit_count += 1 db.session.commit() for i in range(assignment.number_of_comparisons): comparisons = Comparison.create_new_comparison_set(assignment.id, user_id, False) for comparison in comparisons: comparison.completed = True comparison.winner_id = min([comparisons[0].answer1_id, comparisons[0].answer2_id]) db.session.add(comparison) submit_count += 1 db.session.commit() Comparison.calculate_scores(assignment.id) return submit_count
def _submit_all_possible_comparisons_for_user(self, user_id): example_winner_ids = [] example_loser_ids = [] for comparison_example in self.data.comparisons_examples: if comparison_example.assignment_id == self.assignment.id: comparisons = Comparison.create_new_comparison_set(self.assignment.id, user_id, False) self.assertEqual(comparisons[0].answer1_id, comparison_example.answer1_id) self.assertEqual(comparisons[0].answer2_id, comparison_example.answer2_id) min_id = min([comparisons[0].answer1_id, comparisons[0].answer2_id]) max_id = max([comparisons[0].answer1_id, comparisons[0].answer2_id]) example_winner_ids.append(min_id) example_loser_ids.append(max_id) for comparison in comparisons: comparison.completed = True comparison.winner_id = min_id db.session.add(comparison) db.session.commit() # self.login(username) # calculate number of comparisons to do before user has compared all the pairs it can num_eligible_answers = 0 # need to minus one to exclude the logged in user's own answer for answer in self.data.get_student_answers(): if answer.assignment_id == self.assignment.id and answer.user_id != user_id: num_eligible_answers += 1 # n - 1 possible pairs before all answers have been compared num_possible_comparisons = num_eligible_answers - 1 winner_ids = [] loser_ids = [] for i in range(num_possible_comparisons): comparisons = Comparison.create_new_comparison_set(self.assignment.id, user_id, False) answer1_id = comparisons[0].answer1_id answer2_id = comparisons[0].answer2_id min_id = min([answer1_id, answer2_id]) max_id = max([answer1_id, answer2_id]) winner_ids.append(min_id) loser_ids.append(max_id) for comparison in comparisons: comparison.completed = True comparison.winner_id = min_id db.session.add(comparison) db.session.commit() Comparison.calculate_scores(self.assignment.id) return { 'comparisons': { 'winners': winner_ids, 'losers': loser_ids }, 'comparison_examples': { 'winners': example_winner_ids, 'losers': example_loser_ids } }
def recalculate(assignment_id): if not assignment_id: raise RuntimeError("Assignment with ID {} is not found.".format(assignment_id)) assignment = Assignment.query.filter_by(id=assignment_id).first() if not assignment: raise RuntimeError("Assignment with ID {} is not found.".format(assignment_id)) if prompt_bool("""All current answer scores and answer criterion scores will be overwritten. Final scores may differ slightly due to floating point rounding (especially if recalculating on different systems). Are you sure?"""): print ('Recalculating scores...') Comparison.calculate_scores(assignment.id) print ('Recalculate scores successful.')
def _submit_all_possible_comparisons_for_user(self, user_id): example_winner_ids = [] example_loser_ids = [] for comparison_example in self.data.comparisons_examples: if comparison_example.assignment_id == self.assignment.id: comparison = Comparison.create_new_comparison( self.assignment.id, user_id, False) self.assertEqual(comparison.answer1_id, comparison_example.answer1_id) self.assertEqual(comparison.answer2_id, comparison_example.answer2_id) min_id = min([comparison.answer1_id, comparison.answer2_id]) max_id = max([comparison.answer1_id, comparison.answer2_id]) example_winner_ids.append(min_id) example_loser_ids.append(max_id) comparison.completed = True comparison.winner = WinningAnswer.answer1 if comparison.answer1_id < comparison.answer2_id else WinningAnswer.answer2 for comparison_criterion in comparison.comparison_criteria: comparison_criterion.winner = comparison.winner db.session.add(comparison) db.session.commit() # self.login(username) # calculate number of comparisons to do before user has compared all the pairs it can num_eligible_answers = 0 # need to minus one to exclude the logged in user's own answer for answer in self.data.get_student_answers(): if answer.assignment_id == self.assignment.id and answer.user_id != user_id: num_eligible_answers += 1 # n(n-1)/2 possible pairs before all answers have been compared num_possible_comparisons = int(num_eligible_answers * (num_eligible_answers - 1) / 2) winner_ids = [] loser_ids = [] for i in range(num_possible_comparisons): comparison = Comparison.create_new_comparison( self.assignment.id, user_id, False) min_id = min([comparison.answer1_id, comparison.answer2_id]) max_id = max([comparison.answer1_id, comparison.answer2_id]) winner_ids.append(min_id) loser_ids.append(max_id) comparison.completed = True comparison.winner = WinningAnswer.answer1 if comparison.answer1_id < comparison.answer2_id else WinningAnswer.answer2 for comparison_criterion in comparison.comparison_criteria: comparison_criterion.winner = comparison.winner db.session.add(comparison) db.session.commit() Comparison.calculate_scores(self.assignment.id) return { 'comparisons': { 'winners': winner_ids, 'losers': loser_ids }, 'comparison_examples': { 'winners': example_winner_ids, 'losers': example_loser_ids } }