Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ editing capability for a course's list of tabs.

Studio and LMS: add ability to lock assets (cannot be viewed unless registered for class).

LMS: First round of improvements to New (beta) Instructor Dash:
improvements, fixes, and internationalization to the Student Info section.

LMS: Improved accessibility of parts of forum navigation sidebar.

LMS: enhanced accessibility labeling and aria support for the discussion forum new post dropdown as well as response and comment area labeling.
Expand Down
1 change: 0 additions & 1 deletion lms/djangoapps/instructor/views/instructor_dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@ def _section_student_admin(course_id, access):
'section_display_name': _('Student Admin'),
'access': access,
'get_student_progress_url_url': reverse('get_student_progress_url', kwargs={'course_id': course_id}),
'enrollment_url': reverse('students_update_enrollment', kwargs={'course_id': course_id}),
'reset_student_attempts_url': reverse('reset_student_attempts', kwargs={'course_id': course_id}),
'rescore_problem_url': reverse('rescore_problem', kwargs={'course_id': course_id}),
'list_instructor_tasks_url': reverse('list_instructor_tasks', kwargs={'course_id': course_id}),
Expand Down
122 changes: 59 additions & 63 deletions lms/static/coffee/src/instructor_dashboard/student_admin.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,6 @@ std_ajax_err = -> window.InstructorDashboard.util.std_ajax_err.apply this, argum
load_IntervalManager = -> window.InstructorDashboard.util.IntervalManager


# wrap window.confirm
# display `msg`
# run `ok` or `cancel` depending on response
confirm_then = ({msg, ok, cancel}) ->
if window.confirm msg then ok?() else cancel?()

# get jquery element and assert its existance
find_and_assert = ($root, selector) ->
item = $root.find selector

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what were these lines doing?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took this out in edx@3813e51

This was a wrapper that popped up a confirm box to ask a question of the user. I took that out so that I could do some preprossessing of the input (ie check if the username or problem name isn't "") before popping up the confirmation box. Ideally an extension of the dash would extend that preprocessing to include checking that the user and problem are valid before actually asking if we want to clear the data (we don't currently handle invalid inputs very well - we just return the same error message no matter what happened).

Expand Down Expand Up @@ -85,8 +79,6 @@ class StudentAdmin
@$progress_link = find_and_assert @$section, "a.progress-link"
@$field_problem_select_single = find_and_assert @$section, "input[name='problem-select-single']"
@$btn_reset_attempts_single = find_and_assert @$section, "input[name='reset-attempts-single']"
@$btn_enroll = @$section.find "input[name='enroll']"
@$btn_unenroll = @$section.find "input[name='unenroll']"
@$btn_delete_state_single = @$section.find "input[name='delete-state-single']"
@$btn_rescore_problem_single = @$section.find "input[name='rescore-problem-single']"
@$btn_task_history_single = @$section.find "input[name='task-history-single']"
Expand Down Expand Up @@ -121,162 +113,166 @@ class StudentAdmin
e.preventDefault()
unique_student_identifier = @$field_student_select_progress.val()
if not unique_student_identifier
return @$request_response_error_progress.text "Please enter a student email address or username."
return @$request_response_error_progress.text gettext("Please enter a student email address or username.")
error_message = gettext("Error getting student progress url for '<%= student_id %>'. Check that the student identifier is spelled correctly.")
full_error_message = _.template(error_message, {student_id: unique_student_identifier})

$.ajax
dataType: 'json'
url: @$progress_link.data 'endpoint'
data: unique_student_identifier: unique_student_identifier
success: @clear_errors_then (data) ->
window.location = data.progress_url
error: std_ajax_err => @$request_response_error_progress.text "Error getting student progress url for '#{unique_student_identifier}'."

# enroll student
@$btn_enroll.click =>
send_data =
action: 'enroll'
emails: @$field_student_select_progress.val()
auto_enroll: false

$.ajax
dataType: 'json'
url: @$btn_enroll.data 'endpoint'
data: send_data
success: @clear_errors_then -> console.log "student #{send_data.emails} enrolled"
error: std_ajax_err => @$request_response_error_progress.text "Error enrolling student '#{send_data.emails}'."

# unenroll student
@$btn_unenroll.click =>
send_data =
action: 'unenroll'
emails: @$field_student_select_progress.val()

$.ajax
dataType: 'json'
url: @$btn_unenroll.data 'endpoint'
data: send_data
success: @clear_errors_then -> console.log "student #{send_data.emails} unenrolled"
error: std_ajax_err => @$request_response_error_progress.text "Error unenrolling student '#{send_data.emails}'."
error: std_ajax_err => @$request_response_error_progress.text full_error_message

# reset attempts for student on problem
@$btn_reset_attempts_single.click =>
unique_student_identifier = @$field_student_select_grade.val()
problem_to_reset = @$field_problem_select_single.val()
if not unique_student_identifier
return @$request_response_error_grade.text "Please enter a student email address or username."
return @$request_response_error_grade.text gettext("Please enter a student email address or username.")
if not problem_to_reset
return @$request_response_error_grade.text "Please enter a problem urlname."
return @$request_response_error_grade.text gettext("Please enter a problem urlname.")
send_data =
unique_student_identifier: unique_student_identifier
problem_to_reset: problem_to_reset
delete_module: false
success_message = gettext("Success! Problem attempts reset for problem '<%= problem_id %>' and student '<%= student_id %>'.")
error_message = gettext("Error resetting problem attempts for problem '<%= problem_id %>' and student '<%= student_id %>'. Check that the problem and student identifiers are spelled correctly.")
full_success_message = _.template(success_message, {problem_id: problem_to_reset, student_id: unique_student_identifier})
full_error_message = _.template(error_message, {problem_id: problem_to_reset, student_id: unique_student_identifier})

$.ajax
dataType: 'json'
url: @$btn_reset_attempts_single.data 'endpoint'
data: send_data
success: @clear_errors_then -> alert "Success! Problem attempts reset for problem '#{problem_to_reset}' and student '#{unique_student_identifier}'."
error: std_ajax_err => @$request_response_error_grade.text "Error resetting problem attempts for problem '#{problem_to_reset}' and student '#{unique_student_identifier}'."
success: @clear_errors_then -> alert full_success_message
error: std_ajax_err => @$request_response_error_grade.text full_error_message

# delete state for student on problem
@$btn_delete_state_single.click =>
unique_student_identifier = @$field_student_select_grade.val()
problem_to_reset = @$field_problem_select_single.val()
if not unique_student_identifier
return @$request_response_error_grade.text "Please enter a student email address or username."
return @$request_response_error_grade.text gettext("Please enter a student email address or username.")
if not problem_to_reset
return @$request_response_error_grade.text "Please enter a problem urlname."
return @$request_response_error_grade.text gettext("Please enter a problem urlname.")
confirm_message = gettext("Delete student '<%= student_id %>'s state on problem '<%= problem_id %>'?")
full_confirm_message = _.template(confirm_message, {student_id: unique_student_identifier, problem_id: problem_to_reset})

if window.confirm "Delete student '#{unique_student_identifier}'s state on problem '#{problem_to_reset}'?"
if window.confirm full_confirm_message
send_data =
unique_student_identifier: unique_student_identifier
problem_to_reset: problem_to_reset
delete_module: true
error_message = gettext("Error deleting student '<%= student_id %>'s state on problem '<%= problem_id %>'. Check that the problem and student identifiers are spelled correctly.")
full_error_message = _.template(error_message, {student_id: unique_student_identifier, problem_id: problem_to_reset})

$.ajax
dataType: 'json'
url: @$btn_delete_state_single.data 'endpoint'
data: send_data
success: @clear_errors_then -> alert 'Module state successfully deleted.'
error: std_ajax_err => @$request_response_error_grade.text "Error deleting problem state."
success: @clear_errors_then -> alert gettext('Module state successfully deleted.')
error: std_ajax_err => @$request_response_error_grade.text full_error_message
else
# Clear error messages if "Cancel" was chosen on confirmation alert
@clear_errors()

# start task to rescore problem for student
@$btn_rescore_problem_single.click =>
unique_student_identifier = @$field_student_select_grade.val()
problem_to_reset = @$field_problem_select_single.val()
if not unique_student_identifier
return @$request_response_error_grade.text "Please enter a student email address or username."
return @$request_response_error_grade.text gettext("Please enter a student email address or username.")
if not problem_to_reset
return @$request_response_error_grade.text "Please enter a problem urlname."
return @$request_response_error_grade.text gettext("Please enter a problem urlname.")
send_data =
unique_student_identifier: unique_student_identifier
problem_to_reset: problem_to_reset
success_message = gettext("Started rescore problem task for problem '<%= problem_id %>' and student '<%= student_id %>'. Click the 'Show Background Task History for Student' button to see the status of the task.")
full_success_message = _.template(success_message, {student_id: unique_student_identifier, problem_id: problem_to_reset})
error_message = gettext("Error starting a task to rescore problem '<%= problem_id %>' for student '<%= student_id %>'. Check that the problem and student identifiers are spelled correctly.")
full_error_message = _.template(error_message, {student_id: unique_student_identifier, problem_id: problem_to_reset})

$.ajax
dataType: 'json'
url: @$btn_rescore_problem_single.data 'endpoint'
data: send_data
success: @clear_errors_then -> alert "Started rescore problem task for problem '#{problem_to_reset}' and student '#{unique_student_identifier}'. Click the 'Show Background Task History for Student' button to see the status of the task."
error: std_ajax_err => @$request_response_error_grade.text "Error starting a task to rescore problem '#{problem_to_reset}' for student '#{unique_student_identifier}'."
success: @clear_errors_then -> alert full_success_message
error: std_ajax_err => @$request_response_error_grade.text full_error_message

# list task history for student+problem
@$btn_task_history_single.click =>
unique_student_identifier = @$field_student_select_grade.val()
problem_to_reset = @$field_problem_select_single.val()
if not unique_student_identifier
return @$request_response_error_grade.text "Please enter a student email address or username."
return @$request_response_error_grade.text gettext("Please enter a student email address or username.")
if not problem_to_reset
return @$request_response_error_grade.text "Please enter a problem urlname."
return @$request_response_error_grade.text gettext("Please enter a problem urlname.")
send_data =
unique_student_identifier: unique_student_identifier
problem_urlname: problem_to_reset
error_message = gettext("Error getting task history for problem '<%= problem_id %>' and student '<%= student_id %>'. Check that the problem and student identifiers are spelled correctly.")
full_error_message = _.template(error_message, {student_id: unique_student_identifier, problem_id: problem_to_reset})

$.ajax
dataType: 'json'
url: @$btn_task_history_single.data 'endpoint'
data: send_data
success: @clear_errors_then (data) =>
create_task_list_table @$table_task_history_single, data.tasks
error: std_ajax_err => @$request_response_error_grade.text "Error getting task history for student '#{unique_student_identifier}' and problem '#{problem_to_reset}'."
error: std_ajax_err => @$request_response_error_grade.text full_error_message

# start task to reset attempts on problem for all students
@$btn_reset_attempts_all.click =>
problem_to_reset = @$field_problem_select_all.val()
if not problem_to_reset
return @$request_response_error_all.text "Please enter a problem urlname."
if window.confirm "Reset attempts for all students on problem '#{@$field_problem_select_all.val()}'?"
return @$request_response_error_all.text gettext("Please enter a problem urlname.")
confirm_message = gettext("Reset attempts for all students on problem '<%= problem_id %>'?")
full_confirm_message = _.template(confirm_message, {problem_id: problem_to_reset})
if window.confirm full_confirm_message
send_data =
all_students: true
problem_to_reset: problem_to_reset
success_message = gettext("Successfully started task to reset attempts for problem '<%= problem_id %>'. Click the 'Show Background Task History for Problem' button to see the status of the task.")
full_success_message = _.template(success_message, {problem_id: problem_to_reset})
error_message = gettext("Error starting a task to reset attempts for all students on problem '<%= problem_id %>'. Check that the problem identifier is spelled correctly.")
full_error_message = _.template(error_message, {problem_id: problem_to_reset})

$.ajax
dataType: 'json'
url: @$btn_reset_attempts_all.data 'endpoint'
data: send_data
success: @clear_errors_then -> alert "Successfully started task to reset attempts for problem '#{problem_to_reset}'. Click the 'Show Background Task History for Problem' button to see the status of the task."
error: std_ajax_err => @$request_response_error_all.text "Error starting a task to reset attempts for all students on this problem."
success: @clear_errors_then -> alert full_success_message
error: std_ajax_err => @$request_response_error_all.text full_error_message
else
# Clear error messages if "Cancel" was chosen on confirmation alert
@clear_errors()

# start task to rescore problem for all students
@$btn_rescore_problem_all.click =>
problem_to_reset = @$field_problem_select_all.val()
if not problem_to_reset
return @$request_response_error_all.text "Please enter a problem urlname."
if window.confirm "Rescore problem '#{@$field_problem_select_all.val()}' for all students?"
return @$request_response_error_all.text gettext("Please enter a problem urlname.")
confirm_message = gettext("Rescore problem '<%= problem_id %>' for all students?")
full_confirm_message = _.template(confirm_message, {problem_id: problem_to_reset})
if window.confirm full_confirm_message
send_data =
all_students: true
problem_to_reset: problem_to_reset
success_message = gettext("Successfully started task to rescore problem '<%= problem_id %>' for all students. Click the 'Show Background Task History for Problem' button to see the status of the task.")
full_success_message = _.template(success_message, {problem_id: problem_to_reset})
error_message = gettext("Error starting a task to rescore problem '<%= problem_id %>'. Check that the problem identifier is spelled correctly.")
full_error_message = _.template(error_message, {problem_id: problem_to_reset})

$.ajax
dataType: 'json'
url: @$btn_rescore_problem_all.data 'endpoint'
data: send_data
success: @clear_errors_then -> alert "Successfully started task to rescore problem '#{problem_to_reset}' for all students. Click the 'Show Background Task History for Problem' button to see the status of the task."
error: std_ajax_err => @$request_response_error_all.text "Error starting a task to rescore this problem for all students."
success: @clear_errors_then -> alert full_success_message
error: std_ajax_err => @$request_response_error_all.text full_error_message
else
# Clear error messages if "Cancel" was chosen on confirmation alert
@clear_errors()

# list task history for problem
Expand All @@ -285,15 +281,15 @@ class StudentAdmin
problem_urlname: @$field_problem_select_all.val()

if not send_data.problem_urlname
return @$request_response_error_all.text "Please enter a problem urlname."
return @$request_response_error_all.text gettext("Please enter a problem urlname.")

$.ajax
dataType: 'json'
url: @$btn_task_history_all.data 'endpoint'
data: send_data
success: @clear_errors_then (data) =>
create_task_list_table @$table_task_history_all, data.tasks
error: std_ajax_err => @$request_response_error_all.text "Error listing task history for this student and problem."
error: std_ajax_err => @$request_response_error_all.text gettext("Error listing task history for this student and problem.")

reload_running_tasks_list: =>
list_endpoint = @$table_running_tasks.data 'endpoint'
Expand Down
10 changes: 0 additions & 10 deletions lms/templates/instructor/instructor_dashboard_2/student_admin.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,6 @@ <h2>${_("Student-specific grade inspection")}</h2>
<a href="" class="progress-link" data-endpoint="${ section_data['get_student_progress_url_url'] }"> ${_("Student Progress Page")} </a>
</p>
</div>
<br>

<!-- These buttons don't appear to be working
<p>
${_("Click to enroll or unenroll this student from the course:")}
<input type="button" name="enroll" value="${_("Enroll")}" data-endpoint="${ section_data['enrollment_url'] }">
<input type="button" name="unenroll" value="${_("Unenroll")}" data-endpoint="${ section_data['enrollment_url'] }">
</p>
-->

<hr>
</div>
Expand Down Expand Up @@ -59,7 +50,6 @@ <h2>${_("Student-specific grade adjustment")}</h2>
</p>

<p>
<!-- Doesn't give any type of notification upon success -->
<input type="button" name="reset-attempts-single" value="${_("Reset Student Attempts")}" data-endpoint="${ section_data['reset_student_attempts_url'] }">

%if settings.MITX_FEATURES.get('ENABLE_INSTRUCTOR_BACKGROUND_TASKS') and section_data['access']['instructor']:
Expand Down