def grade_flow_session(fctx, flow_session, current_access_rule, answer_visits=None): """Updates the grade on an existing flow session and logs a grade change with the grade records subsystem. """ if answer_visits is None: answer_visits = assemble_answer_visits(flow_session) (answered_count, unanswered_count) = count_answered( fctx, flow_session, answer_visits) is_graded_flow = bool(answered_count + unanswered_count) is_graded_flow = bool(answered_count + unanswered_count) grade_info = gather_grade_info(flow_session, answer_visits) assert grade_info is not None comment = None points = grade_info.points if points is not None and current_access_rule.credit_percent is not None: comment = "Counted at %.1f%% of %.1f points" % ( current_access_rule.credit_percent, points) points = points * current_access_rule.credit_percent / 100 flow_session.points = points flow_session.max_points = grade_info.max_points flow_session.result_comment = comment flow_session.save() # Need to save grade record even if no grade is available yet, because # a grade record may *already* be saved, and that one might be mistaken # for the current one. if (is_graded_flow and flow_session.participation is not None and flow_session.for_credit): from course.models import get_flow_grading_opportunity gopp = get_flow_grading_opportunity( flow_session.course, flow_session.flow_id, fctx.flow_desc) from course.models import grade_state_change_types gchange = GradeChange() gchange.opportunity = gopp gchange.participation = flow_session.participation gchange.state = grade_state_change_types.graded gchange.attempt_id = "flow-session-%d" % flow_session.id gchange.points = points gchange.max_points = grade_info.max_points # creator left as NULL gchange.flow_session = flow_session gchange.comment = comment gchange.save() return grade_info
def grade_flow_session(fctx, flow_session, grading_rule, answer_visits=None): """Updates the grade on an existing flow session and logs a grade change with the grade records subsystem. """ if answer_visits is None: answer_visits = assemble_answer_visits(flow_session) (answered_count, unanswered_count) = count_answered_gradable(fctx, flow_session, answer_visits) is_graded_flow = bool(answered_count + unanswered_count) grade_info = gather_grade_info(fctx, flow_session, answer_visits) assert grade_info is not None comment = None points = grade_info.points if points is not None and grading_rule.credit_percent is not None and grading_rule.credit_percent != 100: comment = ( # Translators: grade flow: calculating grade. _("Counted at %(percent).1f%% of %(point).1f points") % {"percent": grading_rule.credit_percent, "point": points} ) points = points * grading_rule.credit_percent / 100 flow_session.points = points flow_session.max_points = grade_info.max_points flow_session.append_comment(comment) flow_session.save() # Need to save grade record even if no grade is available yet, because # a grade record may *already* be saved, and that one might be mistaken # for the current one. if grading_rule.grade_identifier and is_graded_flow and flow_session.participation is not None: from course.models import get_flow_grading_opportunity gopp = get_flow_grading_opportunity(flow_session.course, flow_session.flow_id, fctx.flow_desc, grading_rule) from course.models import grade_state_change_types gchange = GradeChange() gchange.opportunity = gopp gchange.participation = flow_session.participation gchange.state = grade_state_change_types.graded gchange.attempt_id = "flow-session-%d" % flow_session.id gchange.points = points gchange.max_points = grade_info.max_points # creator left as NULL gchange.flow_session = flow_session gchange.comment = comment previous_grade_changes = list( GradeChange.objects.filter( opportunity=gchange.opportunity, participation=gchange.participation, state=gchange.state, attempt_id=gchange.attempt_id, flow_session=gchange.flow_session, ).order_by("-grade_time")[:1] ) # only save if modified or no previous grades do_save = True if previous_grade_changes: previous_grade_change, = previous_grade_changes if ( previous_grade_change.points == gchange.points and previous_grade_change.max_points == gchange.max_points and previous_grade_change.comment == gchange.comment ): do_save = False else: # no previous grade changes if points is None: do_save = False if do_save: gchange.save() return grade_info
def finish_flow_session(fctx, flow_session, current_access_rule, force_regrade=False): if not flow_session.in_progress: raise RuntimeError("Can't end a session that's already ended") answer_visits = assemble_answer_visits(flow_session) (answered_count, unanswered_count) = count_answered( fctx, flow_session, answer_visits) is_graded_flow = bool(answered_count + unanswered_count) if is_graded_flow: grade_page_visits(fctx, flow_session, answer_visits, force_regrade=force_regrade) # ORDERING RESTRICTION: Must grade pages before gathering grade info grade_info = gather_grade_info(flow_session, answer_visits) comment = None if grade_info is not None: points = grade_info.points if current_access_rule.credit_percent is not None: comment = "Counted at %.1f%% of %.1f points" % ( current_access_rule.credit_percent, points) points = points * current_access_rule.credit_percent / 100 else: points = None from django.utils.timezone import now flow_session.completion_time = now() flow_session.in_progress = False if grade_info is not None: flow_session.points = points flow_session.max_points = grade_info.max_points else: flow_session.points = None flow_session.max_points = None flow_session.result_comment = comment flow_session.save() if (is_graded_flow and flow_session.participation is not None and grade_info is not None and flow_session.for_credit): from course.models import get_flow_grading_opportunity gopp = get_flow_grading_opportunity( flow_session.course, flow_session.flow_id, fctx.flow_desc) from course.models import grade_state_change_types gchange = GradeChange() gchange.opportunity = gopp gchange.participation = flow_session.participation gchange.state = grade_state_change_types.graded gchange.attempt_id = "flow-session-%d" % flow_session.id gchange.points = points gchange.max_points = grade_info.max_points # creator left as NULL gchange.flow_session = flow_session gchange.comment = comment gchange.save() return grade_info