From 9bdff7485a36d175240f79e25561fa3a87a0e328 Mon Sep 17 00:00:00 2001 From: Miles Steele Date: Fri, 21 Jun 2013 16:22:08 -0400 Subject: [PATCH] cleanup - rename list copy - add beta list - fix forum and admin API's to be more similar - add auto-enroll checkbox - fix list reload - remove extra js logging - add course errors visibility toggle - add underscore.js check --- lms/djangoapps/instructor/access.py | 13 ++- lms/djangoapps/instructor/views/api.py | 25 +++-- .../instructor/views/instructor_dashboard.py | 19 +++- .../src/instructor_dashboard/analytics.coffee | 11 ++- .../instructor_dashboard/course_info.coffee | 28 ++++++ .../instructor_dashboard/data_download.coffee | 9 +- .../instructor_dashboard.coffee | 7 +- .../instructor_dashboard/membership.coffee | 95 +++++++++++-------- .../instructor_dashboard/student_admin.coffee | 17 ++-- .../sass/course/instructor/_instructor_2.scss | 46 ++++++--- .../instructor_dashboard_2/course_info.html | 24 ++--- .../instructor_dashboard_2/data_download.html | 6 +- .../instructor_dashboard_2/membership.html | 86 ++++++++++------- lms/urls.py | 4 +- 14 files changed, 255 insertions(+), 135 deletions(-) create mode 100644 lms/static/coffee/src/instructor_dashboard/course_info.coffee diff --git a/lms/djangoapps/instructor/access.py b/lms/djangoapps/instructor/access.py index 4e5bbf4ce2..704dfc4178 100644 --- a/lms/djangoapps/instructor/access.py +++ b/lms/djangoapps/instructor/access.py @@ -18,7 +18,16 @@ from django_comment_common.models import (Role, def list_with_level(course, level): - grpname = get_access_group_name(course, level) + """ + List users who have 'level' access. + + level is in ['instructor', 'staff', 'beta'] + """ + if level in ['beta']: + grpname = course_beta_test_group_name(course.location) + else: + grpname = get_access_group_name(course, level) + try: return Group.objects.get(name=grpname).user_set.all() except Group.DoesNotExist: @@ -52,7 +61,7 @@ def _change_access(course, user, level, mode): """ if level in ['beta']: - grpname = course_beta_test_group_name(course) + grpname = course_beta_test_group_name(course.location) else: grpname = get_access_group_name(course, level) group, _ = Group.objects.get_or_create(name=grpname) diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index 2f7904f92f..249291a655 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -31,22 +31,33 @@ import analytics.csvs @ensure_csrf_cookie @cache_control(no_cache=True, no_store=True, must_revalidate=True) -def enroll_unenroll(request, course_id): +def students_update_enrollment_email(request, course_id): """ Enroll or unenroll students by email. Requires staff access. + + Query Parameters: + - action in ['enroll', 'unenroll'] + - emails is string containing a list of emails separated by anything split_input_list can handle. + - auto_enroll is a boolean (defaults to false) """ course = get_course_with_access(request.user, course_id, 'staff', depth=None) - emails_to_enroll = split_input_list(request.GET.get('enroll', '')) - emails_to_unenroll = split_input_list(request.GET.get('unenroll', '')) + action = request.GET.get('action', '') + emails = split_input_list(request.GET.get('emails', '')) + auto_enroll = request.GET.get('auto_enroll', '') in ['true', 'Talse', True] - enrolled_result = enroll_emails(course_id, emails_to_enroll) - unenrolled_result = unenroll_emails(course_id, emails_to_unenroll) + if action == 'enroll': + results = enroll_emails(course_id, emails, auto_enroll=auto_enroll) + elif action == 'unenroll': + results = unenroll_emails(course_id, emails) + else: + raise ValueError("unrecognized action '{}'".format(action)) response_payload = { - 'enrolled': enrolled_result, - 'unenrolled': unenrolled_result, + 'action': action, + 'results': results, + 'auto_enroll': auto_enroll, } response = HttpResponse(json.dumps(response_payload), content_type="application/json") return response diff --git a/lms/djangoapps/instructor/views/instructor_dashboard.py b/lms/djangoapps/instructor/views/instructor_dashboard.py index 475d41e8f4..51a985dbb5 100644 --- a/lms/djangoapps/instructor/views/instructor_dashboard.py +++ b/lms/djangoapps/instructor/views/instructor_dashboard.py @@ -40,9 +40,15 @@ def instructor_dashboard_2(request, course_id): if not staff_access: raise Http404 + access = { + 'instructor': instructor_access, + 'staff': staff_access, + 'forum_admin': forum_admin_access, + } + sections = [ _section_course_info(course_id), - _section_membership(course_id), + _section_membership(course_id, access), _section_student_admin(course_id), _section_data_download(course_id), _section_analytics(course_id), @@ -100,13 +106,16 @@ def _section_course_info(course_id): return section_data -def _section_membership(course_id): +def _section_membership(course_id, access): """ Provide data for the corresponding dashboard section """ section_data = { 'section_key': 'membership', 'section_display_name': 'Membership', - 'enroll_button_url': reverse('enroll_unenroll', kwargs={'course_id': course_id}), - 'unenroll_button_url': reverse('enroll_unenroll', kwargs={'course_id': course_id}), + + 'access': access, + + 'enroll_button_url': reverse('students_update_enrollment_email', kwargs={'course_id': course_id}), + 'unenroll_button_url': reverse('students_update_enrollment_email', kwargs={'course_id': course_id}), 'list_course_role_members_url': reverse('list_course_role_members', kwargs={'course_id': course_id}), 'access_allow_revoke_url': reverse('access_allow_revoke', kwargs={'course_id': course_id}), 'list_forum_members_url': reverse('list_forum_members', kwargs={'course_id': course_id}), @@ -121,7 +130,7 @@ def _section_student_admin(course_id): 'section_key': 'student_admin', 'section_display_name': 'Student Admin', 'get_student_progress_url': reverse('get_student_progress_url', kwargs={'course_id': course_id}), - 'unenroll_button_url': reverse('enroll_unenroll', kwargs={'course_id': course_id}), + 'unenroll_button_url': reverse('students_update_enrollment_email', kwargs={'course_id': course_id}), 'reset_student_attempts_url': reverse('reset_student_attempts', kwargs={'course_id': course_id}), } return section_data diff --git a/lms/static/coffee/src/instructor_dashboard/analytics.coffee b/lms/static/coffee/src/instructor_dashboard/analytics.coffee index 0a9b9b0287..4de7a412b1 100644 --- a/lms/static/coffee/src/instructor_dashboard/analytics.coffee +++ b/lms/static/coffee/src/instructor_dashboard/analytics.coffee @@ -23,7 +23,7 @@ class Analytics populate_selector: (cb) -> @get_profile_distributions [], (data) => - @$distribution_select.find('option').eq(0).text "-- Select distribution" + @$distribution_select.find('option').eq(0).text "-- Select Distribution --" for feature in data.available_features opt = $ '