diff --git a/lms/djangoapps/instructor/views/instructor_dashboard.py b/lms/djangoapps/instructor/views/instructor_dashboard.py index 9736a3d8a2..35f7257902 100644 --- a/lms/djangoapps/instructor/views/instructor_dashboard.py +++ b/lms/djangoapps/instructor/views/instructor_dashboard.py @@ -9,6 +9,7 @@ from mitxmako.shortcuts import render_to_response from django.core.urlresolvers import reverse from django.utils.html import escape from django.http import Http404 +from django.conf import settings from courseware.access import has_access from courseware.courses import get_course_by_id @@ -45,10 +46,19 @@ def instructor_dashboard_2(request, course_id): _section_analytics(course_id), ] + enrollment_count = sections[0]['enrollment_count'] + + disable_buttons = False + max_enrollment_for_buttons = settings.MITX_FEATURES.get("MAX_ENROLLMENT_INSTR_BUTTONS") + if max_enrollment_for_buttons is not None: + disable_buttons = enrollment_count > max_enrollment_for_buttons + + context = { 'course': course, 'old_dashboard_url': reverse('instructor_dashboard', kwargs={'course_id': course_id}), 'sections': sections, + 'disable_buttons': disable_buttons, } return render_to_response('instructor/instructor_dashboard_2/instructor_dashboard_2.html', context) diff --git a/lms/djangoapps/instructor/views/legacy.py b/lms/djangoapps/instructor/views/legacy.py index 61b43fa9cc..6d7e75baa4 100644 --- a/lms/djangoapps/instructor/views/legacy.py +++ b/lms/djangoapps/instructor/views/legacy.py @@ -105,12 +105,15 @@ def instructor_dashboard(request, course_id): else: idash_mode = request.session.get('idash_mode', 'Grades') + enrollment_number = CourseEnrollment.objects.filter(course_id=course_id, is_active=1).count() + # assemble some course statistics for output to instructor def get_course_stats_table(): - datatable = {'header': ['Statistic', 'Value'], - 'title': _u('Course Statistics At A Glance'), - } - data = [['# Enrolled', CourseEnrollment.objects.filter(course_id=course_id, is_active=1).count()]] + datatable = { + 'header': ['Statistic', 'Value'], + 'title': _u('Course Statistics At A Glance'), + } + data = [['# Enrolled', enrollment_number]] data += [['Date', timezone.now().isoformat()]] data += compute_course_stats(course).items() if request.user.is_staff: @@ -832,35 +835,43 @@ def instructor_dashboard(request, course_id): if not datatable: course_stats = get_course_stats_table() + # disable buttons for large courses + disable_buttons = False + max_enrollment_for_buttons = settings.MITX_FEATURES.get("MAX_ENROLLMENT_INSTR_BUTTONS") + if max_enrollment_for_buttons is not None: + disable_buttons = enrollment_number > max_enrollment_for_buttons + #---------------------------------------- # context for rendering - context = {'course': course, - 'staff_access': True, - 'admin_access': request.user.is_staff, - 'instructor_access': instructor_access, - 'forum_admin_access': forum_admin_access, - 'datatable': datatable, - 'course_stats': course_stats, - 'msg': msg, - 'modeflag': {idash_mode: 'selectedmode'}, - 'studio_url': studio_url, + context = { + 'course': course, + 'staff_access': True, + 'admin_access': request.user.is_staff, + 'instructor_access': instructor_access, + 'forum_admin_access': forum_admin_access, + 'datatable': datatable, + 'course_stats': course_stats, + 'msg': msg, + 'modeflag': {idash_mode: 'selectedmode'}, + 'studio_url': studio_url, - 'to_option': email_to_option, # email - 'subject': email_subject, # email - 'editor': email_editor, # email - 'email_msg': email_msg, # email - 'show_email_tab': show_email_tab, # email + 'to_option': email_to_option, # email + 'subject': email_subject, # email + 'editor': email_editor, # email + 'email_msg': email_msg, # email + 'show_email_tab': show_email_tab, # email - 'problems': problems, # psychometrics - 'plots': plots, # psychometrics - 'course_errors': modulestore().get_item_errors(course.location), - 'instructor_tasks': instructor_tasks, - 'offline_grade_log': offline_grades_available(course_id), - 'cohorts_ajax_url': reverse('cohorts', kwargs={'course_id': course_id}), + 'problems': problems, # psychometrics + 'plots': plots, # psychometrics + 'course_errors': modulestore().get_item_errors(course.location), + 'instructor_tasks': instructor_tasks, + 'offline_grade_log': offline_grades_available(course_id), + 'cohorts_ajax_url': reverse('cohorts', kwargs={'course_id': course_id}), - 'analytics_results': analytics_results, - } + 'analytics_results': analytics_results, + 'disable_buttons': disable_buttons + } if settings.MITX_FEATURES.get('ENABLE_INSTRUCTOR_BETA_DASHBOARD'): context['beta_dashboard_url'] = reverse('instructor_dashboard_2', kwargs={'course_id': course_id}) diff --git a/lms/envs/common.py b/lms/envs/common.py index 731c4f3c51..22047afb28 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -182,6 +182,10 @@ MITX_FEATURES = { # Automatically approve student identity verification attempts 'AUTOMATIC_VERIFY_STUDENT_IDENTITY_FOR_TESTING': False, + + # Disable instructor dash buttons for downloading course data + # when enrollment exceeds this number + 'MAX_ENROLLMENT_INSTR_BUTTONS': 200, } # Used for A/B testing diff --git a/lms/templates/courseware/instructor_dashboard.html b/lms/templates/courseware/instructor_dashboard.html index 7b06d8e309..27f0b9bb08 100644 --- a/lms/templates/courseware/instructor_dashboard.html +++ b/lms/templates/courseware/instructor_dashboard.html @@ -150,31 +150,46 @@ function goto( mode)
%endif + ++ ${_("Note: some of these buttons are known to time out for larger " + "courses. We have temporarily disabled those features for courses " + "with more than {max_enrollment} students. We are urgently working on " + "fixing this issue. Thank you for your patience as we continue " + "working to improve the platform!").format( + max_enrollment=settings.MITX_FEATURES['MAX_ENROLLMENT_INSTR_BUTTONS'] + )} +
+ % endif +- ${_("Gradebook")} + ${_("Gradebook")}
- ${_("Grade summary")} + ${_("Grade summary")}
- +
- - + +
- - + +
- - + +
- - +
+ ${_("Note: some of these buttons are known to time out for larger " + "courses. We have temporarily disabled those features for courses " + "with more than {max_enrollment} students. We are urgently working on " + "fixing this issue. Thank you for your patience as we continue " + "working to improve the platform!").format( + max_enrollment=settings.MITX_FEATURES['MAX_ENROLLMENT_INSTR_BUTTONS'] + )} +
+${_("Enroll or un-enroll one or many students: enter emails, separated by new lines or commas;")}
diff --git a/lms/templates/instructor/instructor_dashboard_2/data_download.html b/lms/templates/instructor/instructor_dashboard_2/data_download.html index c9f15bdca4..74c98e7dbc 100644 --- a/lms/templates/instructor/instructor_dashboard_2/data_download.html +++ b/lms/templates/instructor/instructor_dashboard_2/data_download.html @@ -1,8 +1,23 @@ <%! from django.utils.translation import ugettext as _ %> <%page args="section_data"/> - - + +
+ ${_("Note: some of these buttons are known to time out for larger " + "courses. We have temporarily disabled those features for courses " + "with more than {max_enrollment} students. We are urgently working on " + "fixing this issue. Thank you for your patience as we continue " + "working to improve the platform!").format( + max_enrollment=settings.MITX_FEATURES['MAX_ENROLLMENT_INSTR_BUTTONS'] + )} +
+