def attempt_problem_number(exercise_name, problem_number): user_data = models.UserData.current() if user_data: exercise = models.Exercise.get_by_name(exercise_name) user_exercise = user_data.get_or_insert_exercise(exercise) if user_exercise and problem_number: user_exercise, user_exercise_graph = attempt_problem( user_data, user_exercise, problem_number, request.request_int("attempt_number"), request.request_string("attempt_content"), request.request_string("sha1"), request.request_string("seed"), request.request_bool("complete"), request.request_int("count_hints", default=0), int(request.request_float("time_taken")), request.request_string("non_summative"), request.request_string("problem_type"), request.remote_addr, ) # this always returns a delta of points earned each attempt points_earned = user_data.points - user_data.original_points() if (user_exercise.streak == 0): # never award points for a zero streak points_earned = 0 if (user_exercise.streak == 1): # award points for the first correct exercise done, even if no prior history exists # and the above pts-original points gives a wrong answer points_earned = user_data.points if ( user_data.points == points_earned) else points_earned add_action_results( user_exercise, { "exercise_message_html": templatetags.exercise_message( exercise, user_data.coaches, user_exercise_graph.states(exercise.name)), "points_earned": { "points": points_earned }, "attempt_correct": request.request_bool("complete") }) return user_exercise logging.warning("Problem %d attempted with no user_data present", problem_number) return unauthorized_response()
def hint_problem_number(exercise_name, problem_number): user_data = models.UserData.current() if user_data: exercise = models.Exercise.get_by_name(exercise_name) user_exercise = user_data.get_or_insert_exercise(exercise) if user_exercise and problem_number: prev_user_exercise_graph = models.UserExerciseGraph.get(user_data) attempt_number = request.request_int("attempt_number") count_hints = request.request_int("count_hints") user_exercise, user_exercise_graph, goals_updated = attempt_problem( user_data, user_exercise, problem_number, attempt_number, request.request_string("attempt_content"), request.request_string("sha1"), request.request_string("seed"), request.request_bool("complete"), count_hints, int(request.request_float("time_taken")), request.request_string("non_summative"), request.request_string("problem_type"), request.remote_addr, ) user_states = user_exercise_graph.states(exercise.name) review_mode = request.request_bool("review_mode", default=False) exercise_message_html = templatetags.exercise_message(exercise, user_exercise_graph, review_mode=review_mode) add_action_results(user_exercise, { "exercise_message_html": exercise_message_html, "exercise_state": { "state": [state for state in user_states if user_states[state]], "template" : exercise_message_html, } }) # A hint will count against the user iff they haven't attempted the question yet and it's their first hint if attempt_number == 0 and count_hints == 1: bingo("hints_costly_hint") bingo("hints_costly_hint_binary") return user_exercise logging.warning("Problem %d attempted with no user_data present", problem_number) return unauthorized_response()
def hint_problem_number(exercise_name, problem_number): user_data = models.UserData.current() if user_data: exercise = models.Exercise.get_by_name(exercise_name) user_exercise = user_data.get_or_insert_exercise(exercise) if user_exercise and problem_number: attempt_number = request.request_int("attempt_number") count_hints = request.request_int("count_hints") user_exercise, user_exercise_graph = attempt_problem( user_data, user_exercise, problem_number, attempt_number, request.request_string("attempt_content"), request.request_string("sha1"), request.request_string("seed"), request.request_bool("complete"), count_hints, int(request.request_float("time_taken")), request.request_string("non_summative"), request.request_string("problem_type"), request.remote_addr, ) add_action_results( user_exercise, { "exercise_message_html": templatetags.exercise_message( exercise, user_data.coaches, user_exercise_graph.states(exercise.name)), }) # A hint will count against the user iff they haven't attempted the question yet and it's their first hint if attempt_number == 0 and count_hints == 1: bingo("hints_costly_hint") bingo("hints_costly_hint_binary") return user_exercise logging.warning("Problem %d attempted with no user_data present", problem_number) return unauthorized_response()
def logexercisehint(self, request, **kwargs): if request.POST['key']: kusername = get_username(request.POST['key']) kexercise = get_exercise(request.POST['sha1']) if kusername and kexercise: user_exercise = get_user_exercise(kusername, kexercise) if user_exercise is None: with transaction.commit_on_success(): user_exercise, exe_created = UserExercise.objects.get_or_create(user=kusername, exercise=kexercise, streak=0) else: return self.create_response(request, {'error': 'attempt not logged'}, HttpUnauthorized) dsa_book = get_book(request.POST['book']) ubook = get_user_book(kusername, dsa_book) with transaction.commit_on_success(): user_data, created = UserData.objects.get_or_create(user=kusername,book=dsa_book) module = get_module(request.POST['module_name']) if user_exercise and ubook: bme = BookModuleExercise.components.filter(book=ubook.book, module=module, exercise=kexercise)[0] ex_question = request.POST['sha1'] if 'non_summative' in request.POST: ex_question = request.POST['non_summative'] user_exercise,correct = attempt_problem( user_data, user_exercise, request.POST['attempt_number'], request.POST['complete'], request.POST['count_hints'], int(request.POST['time_taken']), request.POST['attempt_content'], request.POST['module_name'], ex_question, request.META['REMOTE_ADDR'], ) if correct: print jsonpickle.encode(user_exercise) return self.create_response(request, jsonpickle.encode(user_exercise) ) else: return self.create_response(request, {'error': 'attempt not logged'}, HttpBadRequest) return self.create_response(request, {'error': 'unauthorized action'},HttpUnauthorized)
def attempt_problem_number(exercise_name, problem_number): user_data = models.UserData.current() if user_data: exercise = models.Exercise.get_by_name(exercise_name) user_exercise = user_data.get_or_insert_exercise(exercise) if user_exercise and problem_number: user_exercise, user_exercise_graph = attempt_problem( user_data, user_exercise, problem_number, request.request_int("attempt_number"), request.request_string("attempt_content"), request.request_string("sha1"), request.request_string("seed"), request.request_bool("complete"), request.request_int("count_hints", default=0), int(request.request_float("time_taken")), request.request_string("non_summative"), request.request_string("problem_type"), request.remote_addr, ) # this always returns a delta of points earned each attempt points_earned = user_data.points - user_data.original_points() if(user_exercise.streak == 0): # never award points for a zero streak points_earned = 0 if(user_exercise.streak == 1): # award points for the first correct exercise done, even if no prior history exists # and the above pts-original points gives a wrong answer points_earned = user_data.points if (user_data.points == points_earned) else points_earned add_action_results(user_exercise, { "exercise_message_html": templatetags.exercise_message(exercise, user_data.coaches, user_exercise_graph.states(exercise.name)), "points_earned" : { "points" : points_earned }, "attempt_correct" : request.request_bool("complete") }) return user_exercise logging.warning("Problem %d attempted with no user_data present", problem_number) return unauthorized_response()
def get(self): from exercises import attempt_problem login_user = UserData.current() exercises_list = [exercise for exercise in Exercise.all()] videos_list = [video for video in Video.all()] user_count = self.request_int('users', 5) for user_id in xrange(0, user_count): # Create a new user first_name = random.choice(CreateRandomGoalData.first_names) last_name = random.choice(CreateRandomGoalData.last_names) nickname = "%s %s" % (first_name, last_name) email = 'test_%i@automatedrandomdata' % user_id user = users.User(email) logging.info("Creating user %s: (%i/%i)" % (nickname, user_id + 1, user_count)) user_data = UserData.get_or_insert( key_name="test_user_%i" % user_id, user=user, current_user=user, user_id=str(user_id), moderator=False, last_login=datetime.now(), proficient_exercises=[], suggested_exercises=[], need_to_reassess=True, points=0, coaches=[login_user.user_email], user_email=email, user_nickname=nickname, ) user_data.put() # Delete user exercise & video progress query = UserExercise.all() query.filter('user = '******'user = '******'type': 'GoalObjectiveExerciseProficiency', 'exercise': random.choice(exercises_list)}) for objective in xrange(1, random.randint(2, 4)): obj_descriptors.append({ 'type': 'GoalObjectiveWatchVideo', 'video': random.choice(videos_list)}) title = first_name + "'s Goal #" + str(goal_idx) logging.info("Creating goal " + title) objectives = GoalObjective.from_descriptors(obj_descriptors, user_data) goal = Goal(parent=user_data, title=title, objectives=objectives) user_data.save_goal(goal) for objective in obj_descriptors: if objective['type'] == 'GoalObjectiveExerciseProficiency': user_exercise = user_data.get_or_insert_exercise( objective['exercise']) chooser = random.randint(1, 120) if chooser >= 60: continue elif chooser > 15: count = 1 hints = 0 elif chooser < 7: count = 20 hints = 0 else: count = 25 hints = 1 logging.info( "Starting exercise: %s (%i problems, %i hints)" % (objective['exercise'].name, count, hints * count)) for i in xrange(1, count): attempt_problem(user_data, user_exercise, i, 1, 'TEST', 'TEST', 'TEST', True, hints, 0, False, "TEST", 'TEST', '0.0.0.0') elif objective['type'] == 'GoalObjectiveWatchVideo': seconds = random.randint(1, 1200) logging.info("Watching %i seconds of video %s" % (seconds, objective['video'].title)) VideoLog.add_entry(user_data, objective['video'], seconds, 0, detect_cheat=False) self.response.out.write('OK')
def get(self): from exercises import attempt_problem login_user = UserData.current() exercises_list = [exercise for exercise in Exercise.all()] videos_list = [video for video in Video.all()] user_count = self.request_int('users', 5) for user_id in xrange(0, user_count): # Create a new user first_name = random.choice(CreateRandomGoalData.first_names) last_name = random.choice(CreateRandomGoalData.last_names) nickname = "%s %s" % (first_name, last_name) email = 'test_%i@automatedrandomdata' % user_id user = users.User(email) logging.info("Creating user %s: (%i/%i)" % (nickname, user_id + 1, user_count)) user_data = UserData.get_or_insert( key_name="test_user_%i" % user_id, user=user, current_user=user, user_id=str(user_id), moderator=False, last_login=datetime.now(), proficient_exercises=[], suggested_exercises=[], need_to_reassess=True, points=0, coaches=[login_user.user_email], user_email=email, user_nickname=nickname, ) user_data.put() # Delete user exercise & video progress query = UserExercise.all() query.filter('user = '******'user = '******'type': 'GoalObjectiveExerciseProficiency', 'exercise': random.choice(exercises_list) }) for objective in xrange(1, random.randint(2, 4)): obj_descriptors.append({ 'type': 'GoalObjectiveWatchVideo', 'video': random.choice(videos_list) }) title = first_name + "'s Goal #" + str(goal_idx) logging.info("Creating goal " + title) objectives = GoalObjective.from_descriptors( obj_descriptors, user_data) goal = Goal(parent=user_data, title=title, objectives=objectives) user_data.save_goal(goal) for objective in obj_descriptors: if objective['type'] == 'GoalObjectiveExerciseProficiency': user_exercise = user_data.get_or_insert_exercise( objective['exercise']) chooser = random.randint(1, 120) if chooser >= 60: continue elif chooser > 15: count = 1 hints = 0 elif chooser < 7: count = 20 hints = 0 else: count = 25 hints = 1 logging.info( "Starting exercise: %s (%i problems, %i hints)" % (objective['exercise'].name, count, hints * count)) for i in xrange(1, count): attempt_problem(user_data, user_exercise, i, 1, 'TEST', 'TEST', 'TEST', True, hints, 0, False, False, "TEST", '0.0.0.0') elif objective['type'] == 'GoalObjectiveWatchVideo': seconds = random.randint(1, 1200) logging.info("Watching %i seconds of video %s" % (seconds, objective['video'].title)) VideoLog.add_entry(user_data, objective['video'], seconds, 0, detect_cheat=False) self.response.out.write('OK')
def attempt_problem_number(exercise_name, problem_number): user_data = models.UserData.current() if user_data: exercise = models.Exercise.get_by_name(exercise_name) user_exercise = user_data.get_or_insert_exercise(exercise) if user_exercise and problem_number: user_exercise, user_exercise_graph, goals_updated = attempt_problem( user_data, user_exercise, problem_number, request.request_int("attempt_number"), request.request_string("attempt_content"), request.request_string("sha1"), request.request_string("seed"), request.request_bool("complete"), request.request_int("count_hints", default=0), int(request.request_float("time_taken")), request.request_string("non_summative"), request.request_string("problem_type"), request.remote_addr, ) # this always returns a delta of points earned each attempt points_earned = user_data.points - user_data.original_points() if(user_exercise.streak == 0): # never award points for a zero streak points_earned = 0 if(user_exercise.streak == 1): # award points for the first correct exercise done, even if no prior history exists # and the above pts-original points gives a wrong answer points_earned = user_data.points if (user_data.points == points_earned) else points_earned user_states = user_exercise_graph.states(exercise.name) correct = request.request_bool("complete") review_mode = request.request_bool("review_mode", default=False) action_results = { "exercise_state": { "state": [state for state in user_states if user_states[state]], "template" : templatetags.exercise_message(exercise, user_exercise_graph, review_mode=review_mode), }, "points_earned": {"points": points_earned}, "attempt_correct": correct, } if goals_updated: action_results['updateGoals'] = [g.get_visible_data(None) for g in goals_updated] if review_mode: action_results['reviews_left'] = ( user_exercise_graph.reviews_left_count() + (1 - correct)) add_action_results(user_exercise, action_results) return user_exercise logging.warning("Problem %d attempted with no user_data present", problem_number) return unauthorized_response()