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 add_comparisons(self): for assignment in self.assignments: for student in self.students: for i in range(assignment.total_comparisons_required): comparisons = Comparison.create_new_comparison_set(assignment.id, student.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) db.session.commit() return self
def get(self, course_uuid, assignment_uuid): """ Get (or create if needed) a comparison set for assignment. """ course = Course.get_active_by_uuid_or_404(course_uuid) assignment = Assignment.get_active_by_uuid_or_404(assignment_uuid) require(READ, assignment) require(CREATE, Comparison) restrict_user = not allow(MANAGE, assignment) if not assignment.compare_grace: return {'error': comparison_deadline_message}, 403 elif not restrict_user and not assignment.educators_can_compare: return {'error': educators_can_not_compare_message}, 403 # check if user has comparisons they have not completed yet comparisons = Comparison.query \ .filter_by( assignment_id=assignment.id, user_id=current_user.id, completed=False ) \ .all() new_pair = False if len(comparisons) > 0: on_comparison_get.send( self, event_name=on_comparison_get.name, user=current_user, course_id=course.id, data=marshal(comparisons, dataformat.get_comparison(restrict_user))) else: # if there aren't incomplete comparisons, assign a new one try: comparisons = Comparison.create_new_comparison_set(assignment.id, current_user.id, skip_comparison_examples=allow(MANAGE, assignment)) new_pair = True on_comparison_create.send( self, event_name=on_comparison_create.name, user=current_user, course_id=course.id, data=marshal(comparisons, dataformat.get_comparison(restrict_user))) except InsufficientObjectsForPairException: return {"error": "Not enough answers are available for a comparison."}, 400 except UserComparedAllObjectsException: return {"error": "You have compared all the currently available answers."}, 400 except UnknownPairGeneratorException: return {"error": "Generating scored pairs failed, this really shouldn't happen."}, 500 comparison_count = assignment.completed_comparison_count_for_user(current_user.id) return { 'objects': marshal(comparisons, dataformat.get_comparison(restrict_user)), 'new_pair': new_pair, 'current': comparison_count+1 }