def student_exam_duration(student, exam_id): """ How long did the assessment take. returns starttime, endtime either could be None if it hasn't been started/finished """ firstview = None examsubmit = Exams.get_submit_time(exam_id, student) questions = General.get_exam_qs(student, exam_id) # we're working out the first time the assessment was viewed is the # earliest time a question in it was viewed # It's possible (although unlikely) that they viewed a question # other than the first page, first. for question in questions: questionview = DB.get_q_viewtime(question) if firstview: if questionview < firstview: firstview = questionview else: firstview = questionview return firstview, examsubmit
def render_own_marked_exam(student, exam): """ Return a students instance of the exam, with HTML version of the question, their answers, and a marking summary. returns list of questions/marks [ {'pos': position, 'html': rendered (marked) question, 'marking': [ 'part': part number, 'guess': student guess, 'correct': correct answer, 'mark': (float) mark, 'tolerance': marking tolerance, 'comment': marking comment ] }, ... ] """ questions = General.get_exam_qs(student, exam) firstview, examsubmit = student_exam_duration(student, exam) results = [] if not examsubmit: return [{'pos': 1, 'html': "In Progress", 'marking': {} }, ], False examtotal = 0.0 for question in questions: qtemplate = DB.get_q_parent(question) answers = DB.get_q_guesses_before_time(question, examsubmit) pos = DB.get_qt_exam_pos(exam, qtemplate) marks = General.mark_q(question, answers) parts = [int(var[1:]) for var in marks.keys() if re.search("^A([0-9]+$)", var) > 0] parts.sort() marking = [] for part in parts: guess = marks['G%d' % (part,)] if guess == "None": guess = None answer = marks['A%d' % (part,)] score = marks['M%d' % (part,)] tolerance = marks['T%d' % (part,)] comment = marks['C%d' % (part,)] examtotal += score marking.append({ 'part': part, 'guess': guess, 'correct': answer, 'mark': score, 'tolerance': tolerance, 'comment': comment }) html = General.render_q_html(question) results.append({ 'pos': pos, 'html': html, 'marking': marking }) return results, examtotal
def render_own_marked_exam(student, exam): """ Return a students instance of the exam, with HTML version of the question, their answers, and a marking summary. returns list of questions/marks [ {'pos': position, 'html': rendered (marked) question, 'marking': [ 'part': part number, 'guess': student guess, 'correct': correct answer, 'mark': (float) mark, 'tolerance': marking tolerance, 'comment': marking comment ] }, ... ] """ questions = General.get_exam_qs(student, exam) firstview, examsubmit = student_exam_duration(student, exam) results = [] if not examsubmit: return [ { 'pos': 1, 'html': "In Progress", 'marking': {} }, ], False examtotal = 0.0 for question in questions: qtemplate = DB.get_q_parent(question) answers = DB.get_q_guesses_before_time(question, examsubmit) pos = DB.get_qt_exam_pos(exam, qtemplate) marks = General.mark_q(question, answers) parts = [ int(var[1:]) for var in marks.keys() if re.search("^A([0-9]+$)", var) > 0 ] parts.sort() marking = [] for part in parts: guess = marks['G%d' % (part, )] if guess == "None": guess = None answer = marks['A%d' % (part, )] score = marks['M%d' % (part, )] tolerance = marks['T%d' % (part, )] comment = marks['C%d' % (part, )] examtotal += score marking.append({ 'part': part, 'guess': guess, 'correct': answer, 'mark': score, 'tolerance': tolerance, 'comment': comment }) html = General.render_q_html(question) results.append({'pos': pos, 'html': html, 'marking': marking}) return results, examtotal