Ejemplo n.º 1
0
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 {}
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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 {}
Ejemplo n.º 5
0
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