def get_student_course_stats(request, course): """ Regenerates student stats for a course (weighted section grades) Stores the grades to a mongo (json) collection, and to csv files request - a mock request (using RequestDict) course - a string course id """ course_name = re.sub("[/:]","_",course) log.info(course_name) lock_id = "regenerate_student_course_data-lock-{0}-{1}-{2}".format(course,"student_course_grades", course_name) log.info(lock_id) acquire_lock = lambda: cache.add(lock_id, "true", LOCK_EXPIRE) release_lock = lambda: cache.delete(lock_id) if acquire_lock(): try: fs, db = common.get_db_and_fs_cron(get_student_course_stats) collection = db['student_course_stats'] courseware_summaries, users_in_course_ids = get_student_course_stats_base(request,course, "grades") rows = [] for z in xrange(0,len(courseware_summaries)): row = {'student' : users_in_course_ids[z], 'overall_percent' : courseware_summaries[z]["percent"]} row.update({c['category'] : c['percent'] for c in courseware_summaries[z]["grade_breakdown"]}) rows.append(row) file_name = "student_grades_{0}.csv".format(course_name) try: return_csv(fs,file_name, rows) except: log.exception("Could not generate csv file.") file_name = "no_file_generated" write_to_collection(collection, rows, course) finally: release_lock() return json.dumps({'result_data' : rows, 'result_file' : file_name}) return {}
def get_student_course_stats_base(request,course, type="grades"): """ Called by get_student_course_stats and get_student_problem_stats Gets a list of users in a course, and then computes grades for them request - a mock request (using RequestDict) course - a string course id type - whether to get student weighted grades or unweighted grades. If "grades" will get weighted """ fs, db = common.get_db_and_fs_cron(common.student_course_stats_stub) course_obj = get_course_with_access(request.user, course, 'load', depth=None) users_in_course = StudentModule.objects.filter(course_id=course).values('student').distinct() users_in_course_ids = [u['student'] for u in users_in_course] log.debug("Users in course count: {0}".format(len(users_in_course_ids))) courseware_summaries = [] for i in xrange(0,len(users_in_course_ids)): try: user = users_in_course_ids[i] current_task.update_state(state='PROGRESS', meta={'current': i, 'total': len(users_in_course_ids)}) student = User.objects.using('remote').prefetch_related("groups").get(id=int(user)) model_data_cache = None if type=="grades": grade_summary = grades.grade(student, request, course_obj, model_data_cache) else: grade_summary = grades.progress_summary(student, request, course_obj, model_data_cache) courseware_summaries.append(grade_summary) except: log.exception("Could not generate data for {0}".format(users_in_course_ids[i])) return courseware_summaries, users_in_course_ids
def course_grades_view(fs, mongodb, course, params): """ View student course-level grades fs - filesystem mongodb - mongo collection course - string course id """ data_type="course_grades" fs, mongodb = common.get_db_and_fs_cron(common.student_course_stats_stub) # WTF? return course_grades_view_base(fs, mongodb, course, data_type,params)
def get_student_course_stats(request, course): """ Regenerates student stats for a course (weighted section grades) Stores the grades to a mongo (json) collection, and to csv files request - a mock request (using RequestDict) course - a string course id """ course_name = re.sub("[/:]", "_", course) log.info(course_name) lock_id = "regenerate_student_course_data-lock-{0}-{1}-{2}".format( course, "student_course_grades", course_name) log.info(lock_id) acquire_lock = lambda: cache.add(lock_id, "true", LOCK_EXPIRE) release_lock = lambda: cache.delete(lock_id) if acquire_lock(): try: fs, db = common.get_db_and_fs_cron(get_student_course_stats) collection = db['student_course_stats'] courseware_summaries, users_in_course_ids = get_student_course_stats_base( request, course, "grades") rows = [] for z in xrange(0, len(courseware_summaries)): row = { 'student': users_in_course_ids[z], 'overall_percent': courseware_summaries[z]["percent"] } row.update({ c['category']: c['percent'] for c in courseware_summaries[z]["grade_breakdown"] }) rows.append(row) file_name = "student_grades_{0}.csv".format(course_name) try: return_csv(fs, file_name, rows) except: log.exception("Could not generate csv file.") file_name = "no_file_generated" write_to_collection(collection, rows, course) finally: release_lock() return json.dumps({'result_data': rows, 'result_file': file_name}) return {}
def get_student_course_stats_base(request, course, type="grades"): """ Called by get_student_course_stats and get_student_problem_stats Gets a list of users in a course, and then computes grades for them request - a mock request (using RequestDict) course - a string course id type - whether to get student weighted grades or unweighted grades. If "grades" will get weighted """ fs, db = common.get_db_and_fs_cron(common.student_course_stats_stub) course_obj = get_course_with_access(request.user, course, 'load', depth=None) users_in_course = StudentModule.objects.filter( course_id=course).values('student').distinct() users_in_course_ids = [u['student'] for u in users_in_course] log.debug("Users in course count: {0}".format(len(users_in_course_ids))) courseware_summaries = [] for i in xrange(0, len(users_in_course_ids)): try: user = users_in_course_ids[i] current_task.update_state(state='PROGRESS', meta={ 'current': i, 'total': len(users_in_course_ids) }) student = User.objects.using('remote').prefetch_related( "groups").get(id=int(user)) model_data_cache = None if type == "grades": grade_summary = grades.grade(student, request, course_obj, model_data_cache) else: grade_summary = grades.progress_summary( student, request, course_obj, model_data_cache) courseware_summaries.append(grade_summary) except: log.exception("Could not generate data for {0}".format( users_in_course_ids[i])) return courseware_summaries, users_in_course_ids