def get(self, course_uuid): course = Course.get_active_by_uuid_or_404(course_uuid) require(READ, course) assignments = course.assignments \ .filter_by(active=True) \ .all() assignment_ids = [assignment.id for assignment in assignments] answer_counts = Answer.query \ .with_entities( Answer.assignment_id, func.count(Answer.assignment_id).label('answer_count') ) \ .filter_by( user_id=current_user.id, active=True, practice=False, draft=False ) \ .filter(Answer.assignment_id.in_(assignment_ids)) \ .group_by(Answer.assignment_id) \ .all() # get self evaluation status for assignments with self evaluations enabled self_evaluations = AnswerComment.query \ .join("answer") \ .with_entities( Answer.assignment_id, func.count(Answer.assignment_id).label('self_evaluation_count') ) \ .filter(and_( AnswerComment.user_id == current_user.id, AnswerComment.active == True, AnswerComment.comment_type == AnswerCommentType.self_evaluation, AnswerComment.draft == False, Answer.active == True, Answer.practice == False, Answer.draft == False, Answer.assignment_id.in_(assignment_ids) )) \ .group_by(Answer.assignment_id) \ .all() drafts = Answer.query \ .options(load_only('id', 'assignment_id')) \ .filter_by( user_id=current_user.id, active=True, practice=False, draft=True, saved=True ) \ .all() statuses = {} for assignment in assignments: answer_count = next( (result.answer_count for result in answer_counts if result.assignment_id == assignment.id), 0 ) assignment_drafts = [draft for draft in drafts if draft.assignment_id == assignment.id] comparison_count = assignment.completed_comparison_count_for_user(current_user.id) comparison_availble = Comparison.comparison_avialble_for_user(course.id, assignment.id, current_user.id) statuses[assignment.uuid] = { 'answers': { 'answered': answer_count > 0, 'count': answer_count, 'has_draft': len(assignment_drafts) > 0, 'draft_ids': [draft.uuid for draft in assignment_drafts] }, 'comparisons': { 'available': comparison_availble, 'count': comparison_count, 'left': max(0, assignment.total_comparisons_required - comparison_count) } } if assignment.enable_self_evaluation: self_evaluation_count = next( (result.self_evaluation_count for result in self_evaluations if result.assignment_id == assignment.id), 0 ) statuses[assignment.uuid]['comparisons']['self_evaluation_completed'] = self_evaluation_count > 0 on_assignment_list_get_status.send( self, event_name=on_assignment_list_get_status.name, user=current_user, course_id=course.id, data=statuses) return {"statuses": statuses}
def get(self, course_uuid, assignment_uuid): course = Course.get_active_by_uuid_or_404(course_uuid) assignment = Assignment.get_active_by_uuid_or_404(assignment_uuid) require(READ, assignment) answer_count = Answer.query \ .filter_by( user_id=current_user.id, assignment_id=assignment.id, active=True, practice=False, draft=False ) \ .count() drafts = Answer.query \ .options(load_only('id')) \ .filter_by( user_id=current_user.id, assignment_id=assignment.id, active=True, practice=False, draft=True, saved=True ) \ .all() comparison_count = assignment.completed_comparison_count_for_user(current_user.id) comparison_availble = Comparison.comparison_avialble_for_user(course.id, assignment.id, current_user.id) status = { 'answers': { 'answered': answer_count > 0, 'count': answer_count, 'has_draft': len(drafts) > 0, 'draft_ids': [draft.uuid for draft in drafts] }, 'comparisons': { 'available': comparison_availble, 'count': comparison_count, 'left': max(0, assignment.total_comparisons_required - comparison_count) } } if assignment.enable_self_evaluation: self_evaluations = AnswerComment.query \ .join("answer") \ .filter(and_( AnswerComment.user_id == current_user.id, AnswerComment.active == True, AnswerComment.comment_type == AnswerCommentType.self_evaluation, AnswerComment.draft == False, Answer.assignment_id == assignment.id, Answer.active == True, Answer.practice == False, Answer.draft == False )) \ .count() status['comparisons']['self_evaluation_completed'] = self_evaluations > 0 on_assignment_get_status.send( self, event_name=on_assignment_get_status.name, user=current_user, course_id=course.id, data=status) return {"status": status}