From 18822bdb4e3011a11b63a695a279a55f65eb490a Mon Sep 17 00:00:00 2001 From: John Eskew <jeskew@edx.org> Date: Sun, 5 Oct 2014 10:42:23 -0400 Subject: [PATCH] Wrap course info and dashboard in bulk ops wrapper to reduce Mongo calls. --- common/djangoapps/student/views.py | 36 +++++++++--------- lms/djangoapps/courseware/views.py | 61 +++++++++++++++--------------- 2 files changed, 50 insertions(+), 47 deletions(-) diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 02d9ca587b2..d1417970f75 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -246,23 +246,25 @@ def get_course_enrollment_pairs(user, course_org_filter, org_filter_out_set): a student's dashboard. """ for enrollment in CourseEnrollment.enrollments_for_user(user): - course = modulestore().get_course(enrollment.course_id) - if course and not isinstance(course, ErrorDescriptor): - - # if we are in a Microsite, then filter out anything that is not - # attributed (by ORG) to that Microsite - if course_org_filter and course_org_filter != course.location.org: - continue - # Conversely, if we are not in a Microsite, then let's filter out any enrollments - # with courses attributed (by ORG) to Microsites - elif course.location.org in org_filter_out_set: - continue - - yield (course, enrollment) - else: - log.error("User {0} enrolled in {2} course {1}".format( - user.username, enrollment.course_id, "broken" if course else "non-existent" - )) + store = modulestore() + with store.bulk_operations(enrollment.course_id): + course = store.get_course(enrollment.course_id) + if course and not isinstance(course, ErrorDescriptor): + + # if we are in a Microsite, then filter out anything that is not + # attributed (by ORG) to that Microsite + if course_org_filter and course_org_filter != course.location.org: + continue + # Conversely, if we are not in a Microsite, then let's filter out any enrollments + # with courses attributed (by ORG) to Microsites + elif course.location.org in org_filter_out_set: + continue + + yield (course, enrollment) + else: + log.error("User {0} enrolled in {2} course {1}".format( + user.username, enrollment.course_id, "broken" if course else "non-existent" + )) def _cert_info(user, course, cert_status): diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index 18013af6dc1..f92326690a8 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -559,41 +559,42 @@ def course_info(request, course_id): course_key = SlashSeparatedCourseKey.from_deprecated_string(course_id) - course = get_course_with_access(request.user, 'load', course_key) - staff_access = has_access(request.user, 'staff', course) - masq = setup_masquerade(request, staff_access) # allow staff to toggle masquerade on info page - reverifications = fetch_reverify_banner_info(request, course_key) - studio_url = get_studio_url(course, 'course_info') + with modulestore().bulk_operations(course_key): + course = get_course_with_access(request.user, 'load', course_key) + staff_access = has_access(request.user, 'staff', course) + masq = setup_masquerade(request, staff_access) # allow staff to toggle masquerade on info page + reverifications = fetch_reverify_banner_info(request, course_key) + studio_url = get_studio_url(course, 'course_info') - # link to where the student should go to enroll in the course: - # about page if there is not marketing site, SITE_NAME if there is - url_to_enroll = reverse(course_about, args=[course_id]) - if settings.FEATURES.get('ENABLE_MKTG_SITE'): - url_to_enroll = marketing_link('COURSES') + # link to where the student should go to enroll in the course: + # about page if there is not marketing site, SITE_NAME if there is + url_to_enroll = reverse(course_about, args=[course_id]) + if settings.FEATURES.get('ENABLE_MKTG_SITE'): + url_to_enroll = marketing_link('COURSES') - show_enroll_banner = request.user.is_authenticated() and not CourseEnrollment.is_enrolled(request.user, course.id) + show_enroll_banner = request.user.is_authenticated() and not CourseEnrollment.is_enrolled(request.user, course.id) - context = { - 'request': request, - 'course_id': course_key.to_deprecated_string(), - 'cache': None, - 'course': course, - 'staff_access': staff_access, - 'masquerade': masq, - 'studio_url': studio_url, - 'reverifications': reverifications, - 'show_enroll_banner': show_enroll_banner, - 'url_to_enroll': url_to_enroll, - } + context = { + 'request': request, + 'course_id': course_key.to_deprecated_string(), + 'cache': None, + 'course': course, + 'staff_access': staff_access, + 'masquerade': masq, + 'studio_url': studio_url, + 'reverifications': reverifications, + 'show_enroll_banner': show_enroll_banner, + 'url_to_enroll': url_to_enroll, + } - now = datetime.now(UTC()) - effective_start = _adjust_start_date_for_beta_testers(request.user, course, course_key) - if staff_access and now < effective_start: - # Disable student view button if user is staff and - # course is not yet visible to students. - context['disable_student_access'] = True + now = datetime.now(UTC()) + effective_start = _adjust_start_date_for_beta_testers(request.user, course, course_key) + if staff_access and now < effective_start: + # Disable student view button if user is staff and + # course is not yet visible to students. + context['disable_student_access'] = True - return render_to_response('courseware/info.html', context) + return render_to_response('courseware/info.html', context) @ensure_csrf_cookie -- GitLab