def handle(self, *args, **options): course_id = options.get('course_id') course_ids = [] if course_id: course_ids.append(course_id) else: course_ids = StudentGradebook.objects.filter( grade_summary='').values_list('course_id', flat=True) for course_id in course_ids: course_key = CourseKey.from_string(course_id) users = CourseEnrollment.objects.users_enrolled_in(course_key) course = modulestore().get_course(course_key, depth=None) if course: # For each user... for user in users: request = RequestMockWithoutMiddleware().get('/') request.user = user grade_data = grades.grade(user, course) grade = grade_data['percent'] grading_policy = course.grading_policy proforma_grade = grades.calculate_proforma_grade( grade_data, grading_policy) progress_summary = grades.progress_summary(user, course) try: gradebook_entry = StudentGradebook.objects.get( user=user, course_id=course.id) if not gradebook_entry.grade_summary: gradebook_entry.grade = grade gradebook_entry.proforma_grade = proforma_grade gradebook_entry.progress_summary = json.dumps( progress_summary, cls=EdxJSONEncoder) gradebook_entry.grade_summary = json.dumps( grade_data, cls=EdxJSONEncoder) gradebook_entry.grading_policy = json.dumps( grading_policy, cls=EdxJSONEncoder) gradebook_entry.save() except StudentGradebook.DoesNotExist: pass log_msg = 'Gradebook entry created -- Course: {}, User: {} (grade: {}, proforma_grade: {})'.format( course.id, user.id, grade, proforma_grade) log.info(log_msg)
def _generate_user_gradebook(course_key, user): """ Recalculates the specified user's gradebook entry """ # import is local to avoid recursive import from courseware.courses import get_course course_descriptor = get_course(course_key, depth=None) grading_policy = course_descriptor.grading_policy request = RequestMockWithoutMiddleware().get('/') request.user = user request.course_descriptor = course_descriptor progress_summary = progress_summary_wrapped(request, course_id) log.info(progress_summary) grade_summary = grades.grade(user, course_descriptor) grade = grade_summary['percent'] proforma_grade = grades.calculate_proforma_grade(grade_summary, grading_policy) try: gradebook_entry = StudentGradebook.objects.get(user=user, course_id=course_key) if gradebook_entry.grade != grade: gradebook_entry.grade = grade gradebook_entry.proforma_grade = proforma_grade gradebook_entry.progress_summary = json.dumps(progress_summary, cls=EdxJSONEncoder) gradebook_entry.grade_summary = json.dumps(grade_summary, cls=EdxJSONEncoder) gradebook_entry.grading_policy = json.dumps(grading_policy, cls=EdxJSONEncoder) gradebook_entry.save() except StudentGradebook.DoesNotExist: StudentGradebook.objects.create( user=user, course_id=course_key, grade=grade, proforma_grade=proforma_grade, progress_summary=json.dumps(progress_summary, cls=EdxJSONEncoder), grade_summary=json.dumps(grade_summary, cls=EdxJSONEncoder), grading_policy=json.dumps(grading_policy, cls=EdxJSONEncoder))