Commit cf524906 by Adam Palay Committed by Sarina Canelake

more granular transactions in grading [LMS-1480]

remove field_data_cache from grades.grade and grades.progress_summary

cleans grading code by adding wrappers
parent 901ad226
...@@ -236,14 +236,11 @@ class TestCourseGrader(TestSubmittingProblems): ...@@ -236,14 +236,11 @@ class TestCourseGrader(TestSubmittingProblems):
make up the final grade. (For display) make up the final grade. (For display)
""" """
field_data_cache = FieldDataCache.cache_for_descriptor_descendents( fake_request = self.factory.get(
self.course.id, self.student_user, self.course) reverse('progress', kwargs={'course_id': self.course.id})
)
fake_request = self.factory.get(reverse('progress',
kwargs={'course_id': self.course.id}))
return grades.grade(self.student_user, fake_request, return grades.grade(self.student_user, fake_request, self.course)
self.course, field_data_cache)
def get_progress_summary(self): def get_progress_summary(self):
""" """
...@@ -257,16 +254,13 @@ class TestCourseGrader(TestSubmittingProblems): ...@@ -257,16 +254,13 @@ class TestCourseGrader(TestSubmittingProblems):
etc. etc.
""" """
field_data_cache = FieldDataCache.cache_for_descriptor_descendents( fake_request = self.factory.get(
self.course.id, self.student_user, self.course) reverse('progress', kwargs={'course_id': self.course.id})
)
fake_request = self.factory.get(reverse('progress',
kwargs={'course_id': self.course.id}))
progress_summary = grades.progress_summary(self.student_user, progress_summary = grades.progress_summary(
fake_request, self.student_user, fake_request, self.course
self.course, )
field_data_cache)
return progress_summary return progress_summary
def check_grade_percent(self, percent): def check_grade_percent(self, percent):
......
...@@ -14,6 +14,7 @@ from django.shortcuts import redirect ...@@ -14,6 +14,7 @@ from django.shortcuts import redirect
from mitxmako.shortcuts import render_to_response, render_to_string from mitxmako.shortcuts import render_to_response, render_to_string
from django_future.csrf import ensure_csrf_cookie from django_future.csrf import ensure_csrf_cookie
from django.views.decorators.cache import cache_control from django.views.decorators.cache import cache_control
from django.db import transaction
from markupsafe import escape from markupsafe import escape
from courseware import grades from courseware import grades
...@@ -643,8 +644,9 @@ def mktg_course_about(request, course_id): ...@@ -643,8 +644,9 @@ def mktg_course_about(request, course_id):
except (ValueError, Http404) as e: except (ValueError, Http404) as e:
# if a course does not exist yet, display a coming # if a course does not exist yet, display a coming
# soon button # soon button
return render_to_response('courseware/mktg_coming_soon.html', return render_to_response(
{'course_id': course_id}) 'courseware/mktg_coming_soon.html', {'course_id': course_id}
)
registered = registered_for_course(course, request.user) registered = registered_for_course(course, request.user)
...@@ -659,21 +661,36 @@ def mktg_course_about(request, course_id): ...@@ -659,21 +661,36 @@ def mktg_course_about(request, course_id):
settings.MITX_FEATURES.get('ENABLE_LMS_MIGRATION')) settings.MITX_FEATURES.get('ENABLE_LMS_MIGRATION'))
course_modes = CourseMode.modes_for_course(course.id) course_modes = CourseMode.modes_for_course(course.id)
return render_to_response('courseware/mktg_course_about.html', return render_to_response(
{ 'courseware/mktg_course_about.html',
'course': course, {
'registered': registered, 'course': course,
'allow_registration': allow_registration, 'registered': registered,
'course_target': course_target, 'allow_registration': allow_registration,
'show_courseware_link': show_courseware_link, 'course_target': course_target,
'course_modes': course_modes, 'show_courseware_link': show_courseware_link,
}) 'course_modes': course_modes,
}
)
@login_required @login_required
@cache_control(no_cache=True, no_store=True, must_revalidate=True) @cache_control(no_cache=True, no_store=True, must_revalidate=True)
@transaction.commit_manually
def progress(request, course_id, student_id=None): def progress(request, course_id, student_id=None):
""" User progress. We show the grade bar and every problem score. """
Wraps "_progress" with the manual_transaction context manager just in case
there are unanticipated errors.
"""
with grades.manual_transaction():
return _progress(request, course_id, student_id)
def _progress(request, course_id, student_id):
"""
Unwrapped version of "progress".
User progress. We show the grade bar and every problem score.
Course staff are allowed to see the progress of students in their class. Course staff are allowed to see the progress of students in their class.
""" """
...@@ -696,26 +713,26 @@ def progress(request, course_id, student_id=None): ...@@ -696,26 +713,26 @@ def progress(request, course_id, student_id=None):
# additional DB lookup (this kills the Progress page in particular). # additional DB lookup (this kills the Progress page in particular).
student = User.objects.prefetch_related("groups").get(id=student.id) student = User.objects.prefetch_related("groups").get(id=student.id)
field_data_cache = FieldDataCache.cache_for_descriptor_descendents( courseware_summary = grades.progress_summary(student, request, course)
course_id, student, course, depth=None)
courseware_summary = grades.progress_summary(student, request, course, grade_summary = grades.grade(student, request, course)
field_data_cache)
grade_summary = grades.grade(student, request, course, field_data_cache)
if courseware_summary is None: if courseware_summary is None:
#This means the student didn't have access to the course (which the instructor requested) #This means the student didn't have access to the course (which the instructor requested)
raise Http404 raise Http404
context = {'course': course, context = {
'courseware_summary': courseware_summary, 'course': course,
'grade_summary': grade_summary, 'courseware_summary': courseware_summary,
'staff_access': staff_access, 'grade_summary': grade_summary,
'student': student, 'staff_access': staff_access,
} 'student': student,
context.update() }
with grades.manual_transaction():
response = render_to_response('courseware/progress.html', context)
return render_to_response('courseware/progress.html', context) return response
@login_required @login_required
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment