def attempt_problem_pe(user_data, user_exercise, attempt_number, submit_time, time_taken, threshold, score, module, ip_address): """ Stores data related to a PE exercise attempt """ if user_exercise: # and user_exercise.belongs_to(user_data): dt_now = date_from_timestamp(submit_time) #datetime.datetime.now() exercise = user_exercise.exercise user_exercise.last_done = dt_now count_hints = 0 # Build up problem log problem_log = UserExerciseLog( user=user_data.user, exercise=user_exercise.exercise, time_taken=int(round(int(time_taken)/1000)), time_done=dt_now, count_hints=count_hints, hint_used=int(count_hints) > 0, correct=score>= threshold, count_attempts=attempt_number, ip_address=ip_address, ) #update list of started exercises if not user_data.has_started(exercise): user_data.started(exercise.id) #just_earned_proficiency = False user_exercise.total_done += 1 value = False proficient = user_data.is_proficient_at(user_exercise.exercise) if problem_log.correct: user_exercise.total_correct += 1 user_exercise.longest_streak = 0 value = True if not proficient: problem_log.earned_proficiency = \ user_exercise.update_proficiency_pe(\ correct = True, \ ubook = user_data.book) user_data.earned_proficiency(exercise.id) user_data.save() problem_log.save() user_exercise.save() if (proficient or problem_log.earned_proficiency): # and required: update_module_proficiency(user_data, module, \ user_exercise.exercise) return user_exercise, value
def attempt_problem_pe(user_data, user_exercise, attempt_number, submit_time, time_taken, threshold, score, module, ip_address): """ Stores data related to a PE exercise attempt """ if user_exercise: # and user_exercise.belongs_to(user_data): dt_now = date_from_timestamp(submit_time) #datetime.datetime.now() exercise = user_exercise.exercise user_exercise.last_done = dt_now count_hints = 0 # Build up problem log problem_log = UserExerciseLog( user=user_data.user, exercise=user_exercise.exercise, time_taken=int(round(int(time_taken) / 1000)), time_done=dt_now, count_hints=count_hints, hint_used=int(count_hints) > 0, correct=score >= threshold, count_attempts=attempt_number, ip_address=ip_address, ) #update list of started exercises if not user_data.has_started(exercise): user_data.started(exercise.id) #just_earned_proficiency = False user_exercise.total_done += 1 value = False proficient = user_data.is_proficient_at(user_exercise.exercise) if problem_log.correct: user_exercise.total_correct += 1 user_exercise.longest_streak = 0 value = True if not proficient: problem_log.earned_proficiency = \ user_exercise.update_proficiency_pe(\ correct = True, \ ubook = user_data.book) user_data.earned_proficiency(exercise.id) user_data.save() problem_log.save() user_exercise.save() if (proficient or problem_log.earned_proficiency): # and required: update_module_proficiency(user_data, module, \ user_exercise.exercise) return user_exercise, value
def attempt_problem(user_data, user_exercise, attempt_number, completed, count_hints, time_taken, attempt_content, module, ex_question, ip_address): """ Stores data related to a KA exercise attempt """ if user_exercise: # and user_exercise.belongs_to(user_data): dt_now = datetime.datetime.now() #exercise = user_exercise.exercise user_exercise.last_done = dt_now # Build up problem log for deferred put problem_log = UserExerciseLog( user=user_data.user, exercise=user_exercise.exercise, time_taken=time_taken, time_done=dt_now, count_hints=count_hints, hint_used=int(count_hints) > 0, correct=str2bool(completed) and (int(count_hints)==0) \ and (int(attempt_number) == 1), count_attempts=attempt_number, ex_question=ex_question, ip_address=ip_address, ) first_response = (attempt_number == 1 and count_hints == 0) or \ (count_hints == 1 and attempt_number == 0) #if user_exercise.total_done > 0 and user_exercise.streak == 0 \ # and first_response: #bingo('hints_keep_going_after_wrong') #just_earned_proficiency = False #update list of started exercises if not user_data.has_started(user_exercise.exercise): user_data.started(user_exercise.exercise.id) proficient = user_data.is_proficient_at(user_exercise.exercise) if str2bool(completed): user_exercise.total_done += 1 if problem_log.correct: # Streak only increments if problem was #solved correctly (on first attempt) user_exercise.total_correct += 1 user_exercise.streak += 1 user_exercise.longest_streak = max(\ user_exercise.longest_streak, \ user_exercise.streak) user_exercise.progress = Decimal(user_exercise.streak)/\ Decimal(user_exercise.exercise.streak) if not proficient: problem_log.earned_proficiency = \ user_exercise.update_proficiency_ka(\ correct = True, \ ubook = user_data.book) if user_exercise.progress >= 1: if len(user_data.all_proficient_exercises) == 0: user_data.all_proficient_exercises += \ "%s" % user_exercise.exercise.id else: user_data.all_proficient_exercises += \ ",%s" % user_exercise.exercise.id else: user_exercise.progress = Decimal(user_exercise.streak)/\ Decimal(user_exercise.exercise.streak) else: if (int(count_hints) ==0) and (attempt_content!='hint') \ and (int(attempt_number) == 1): # Only count wrong answer at most once per problem if user_exercise.streak - 1 > 0: user_exercise.streak = user_exercise.streak - 1 else: user_exercise.streak = 0 user_exercise.progress = Decimal(user_exercise.streak)/\ Decimal(user_exercise.exercise.streak) if first_response: user_exercise.update_proficiency_model(correct=False) problem_log.save() user_exercise.save() user_data.save() if proficient or problem_log.earned_proficiency: update_module_proficiency(user_data, \ module, \ user_exercise.exercise) return user_exercise, True #, user_exercise_graph, goals_updated
def attempt_problem(user_data, user_exercise, attempt_number,completed, count_hints, time_taken, attempt_content, module,ex_question, ip_address, request_type=None): """ Stores data related to a KA exercise attempt """ if user_exercise: # and user_exercise.belongs_to(user_data): dt_now = datetime.datetime.now() #exercise = user_exercise.exercise user_exercise.last_done = dt_now correct = str2bool(completed) and (int(count_hints)==0) and (int(attempt_number) == 1) if "Summ" in user_exercise.exercise.name: correct = correct and (user_exercise.hinted_exercise != ex_question) # Build up problem log for deferred put problem_log = UserExerciseLog( user=user_data.user, exercise=user_exercise.exercise, time_taken=time_taken, time_done=dt_now, count_hints=count_hints, hint_used=int(count_hints) > 0, correct=correct, count_attempts=attempt_number, ex_question=ex_question, ip_address=ip_address, request_type=request_type) first_response = (attempt_number == 1 and count_hints == 0) or \ (attempt_number == 0 and count_hints == 1) #if user_exercise.total_done > 0 and user_exercise.streak == 0 \ # and first_response: #bingo('hints_keep_going_after_wrong') #just_earned_proficiency = False #update list of started exercises if not user_data.has_started(user_exercise.exercise): user_data.started(user_exercise.exercise.id) proficient = user_data.is_proficient_at(user_exercise.exercise) if str2bool(completed): user_exercise.total_done += 1 if problem_log.correct: # Streak only increments if problem was # solved correctly (on first attempt) user_exercise.total_correct += 1 user_exercise.streak += 1 user_exercise.longest_streak = max(user_exercise.longest_streak, user_exercise.streak) user_exercise.progress = Decimal(user_exercise.streak) / Decimal(user_exercise.exercise.streak) if not proficient: problem_log.earned_proficiency = user_exercise.update_proficiency_ka(correct = True, ubook = user_data.book) if user_exercise.progress >= 1: if len(user_data.all_proficient_exercises) == 0: user_data.all_proficient_exercises += "%s" % user_exercise.exercise.id else: user_data.all_proficient_exercises += ",%s" % user_exercise.exercise.id # save exercise_name so that the client framework won't show it again if len(user_exercise.correct_exercises) == 0: user_exercise.correct_exercises += '%s' % ex_question else: user_exercise.correct_exercises += ',%s' % ex_question else: user_exercise.progress = Decimal(user_exercise.streak) / Decimal(user_exercise.exercise.streak) # when student answer an exercise correctly from first time then clear the hint if request_type != 'hint': user_exercise.hinted_exercise = '' else: if (int(count_hints) == 0) and (attempt_content!='hint') \ and (int(attempt_number) == 1): # Only count wrong answer at most once per problem if user_exercise.streak - 1 > 0: user_exercise.streak = user_exercise.streak - 1 else: user_exercise.streak = 0 user_exercise.progress = Decimal(user_exercise.streak) / Decimal(user_exercise.exercise.streak) if first_response: user_exercise.update_proficiency_model(correct=False) # save exercise_name to hinted_exercise so that student won't get credit if he saw the hint then refresh the page if request_type == 'hint' and "Summ" in user_exercise.exercise.name: user_exercise.hinted_exercise = '%s' % ex_question problem_log.save() user_exercise.save() user_data.save() if proficient or problem_log.earned_proficiency: update_module_proficiency(user_data, \ module, \ user_exercise.exercise) return user_exercise, True #, user_exercise_graph, goals_updated