From 5f538f078b4e7b02a3f328d114635971205267eb Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 19:50:36 -0500 Subject: [PATCH 01/24] Pass flag through from LMS to grading controller --- .../open_ended_grading/peer_grading_service.py | 10 ++++++---- .../src/peer_grading/peer_grading_problem.coffee | 8 ++++++-- lms/templates/peer_grading/peer_grading_problem.html | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/peer_grading_service.py b/lms/djangoapps/open_ended_grading/peer_grading_service.py index caa349125d..76f54bb12c 100644 --- a/lms/djangoapps/open_ended_grading/peer_grading_service.py +++ b/lms/djangoapps/open_ended_grading/peer_grading_service.py @@ -88,7 +88,7 @@ class PeerGradingService(GradingService): {'location': problem_location, 'grader_id': grader_id}) return json.dumps(self._render_rubric(response)) - def save_grade(self, location, grader_id, submission_id, score, feedback, submission_key, rubric_scores): + def save_grade(self, location, grader_id, submission_id, score, feedback, submission_key, rubric_scores, submission_flagged): data = {'grader_id' : grader_id, 'submission_id' : submission_id, 'score' : score, @@ -96,7 +96,8 @@ class PeerGradingService(GradingService): 'submission_key': submission_key, 'location': location, 'rubric_scores': rubric_scores, - 'rubric_scores_complete': True} + 'rubric_scores_complete': True, + 'submission_flagged' : submission_flagged} return self.post(self.save_grade_url, data) def is_student_calibrated(self, problem_location, grader_id): @@ -224,7 +225,7 @@ def save_grade(request, course_id): error: if there was an error in the submission, this is the error message """ _check_post(request) - required = set(['location', 'submission_id', 'submission_key', 'score', 'feedback', 'rubric_scores[]']) + required = set(['location', 'submission_id', 'submission_key', 'score', 'feedback', 'rubric_scores[]', 'submission_flagged']) success, message = _check_required(request, required) if not success: return _err_response(message) @@ -236,9 +237,10 @@ def save_grade(request, course_id): feedback = p['feedback'] submission_key = p['submission_key'] rubric_scores = p.getlist('rubric_scores[]') + submission_flagged = p['submission_flagged'] try: response = peer_grading_service().save_grade(location, grader_id, submission_id, - score, feedback, submission_key, rubric_scores) + score, feedback, submission_key, rubric_scores, submission_flagged) return HttpResponse(response, mimetype="application/json") except GradingServiceError: log.exception("""Error saving grade. server url: {0}, location: {1}, submission_id:{2}, diff --git a/lms/static/coffee/src/peer_grading/peer_grading_problem.coffee b/lms/static/coffee/src/peer_grading/peer_grading_problem.coffee index c4b87eb30e..ab16b34d12 100644 --- a/lms/static/coffee/src/peer_grading/peer_grading_problem.coffee +++ b/lms/static/coffee/src/peer_grading/peer_grading_problem.coffee @@ -175,6 +175,7 @@ class PeerGradingProblem @submission_container = $('.submission-container') @prompt_container = $('.prompt-container') @rubric_container = $('.rubric-container') + @flag_student_container = $('.flag-student-container') @calibration_panel = $('.calibration-panel') @grading_panel = $('.grading-panel') @content_panel = $('.content-panel') @@ -201,6 +202,7 @@ class PeerGradingProblem @action_button = $('.action-button') @calibration_feedback_button = $('.calibration-feedback-button') @interstitial_page_button = $('.interstitial-page-button') + @flag_student_checkbox = $('.flag-checkbox') Collapsible.setCollapsibles(@content_panel) @@ -252,7 +254,8 @@ class PeerGradingProblem location: @location submission_id: @essay_id_input.val() submission_key: @submission_key_input.val() - feedback: @feedback_area.val() + feedback: @feedback_area.val() + submission_flagged: @flag_student_checkbox.is(':checked') return data @@ -352,7 +355,7 @@ class PeerGradingProblem @grading_panel.find('.calibration-text').show() @calibration_panel.find('.grading-text').hide() @grading_panel.find('.grading-text').hide() - + @flag_student_container.hide() @submit_button.unbind('click') @submit_button.click @submit_calibration_essay @@ -379,6 +382,7 @@ class PeerGradingProblem @grading_panel.find('.calibration-text').hide() @calibration_panel.find('.grading-text').show() @grading_panel.find('.grading-text').show() + @flag_student_container.show() @submit_button.unbind('click') @submit_button.click @submit_grade diff --git a/lms/templates/peer_grading/peer_grading_problem.html b/lms/templates/peer_grading/peer_grading_problem.html index cb9ed1c0fb..04ee7415ec 100644 --- a/lms/templates/peer_grading/peer_grading_problem.html +++ b/lms/templates/peer_grading/peer_grading_problem.html @@ -72,6 +72,7 @@

+

Flag this submission for review by course staff (use if the submission contains inappropriate content):

From 78696c62b8ae3268d5cd73eb6a6f6db2d987d7c5 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 20:36:09 -0500 Subject: [PATCH 02/24] Work on open ended flagged problems --- .../controller_query_service.py | 20 +++++++ lms/djangoapps/open_ended_grading/views.py | 55 +++++++++++++++++++ .../open_ended_flagged_problems.html | 52 ++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 lms/templates/open_ended_problems/open_ended_flagged_problems.html diff --git a/lms/djangoapps/open_ended_grading/controller_query_service.py b/lms/djangoapps/open_ended_grading/controller_query_service.py index 7d515e2475..7c75d44287 100644 --- a/lms/djangoapps/open_ended_grading/controller_query_service.py +++ b/lms/djangoapps/open_ended_grading/controller_query_service.py @@ -21,6 +21,8 @@ class ControllerQueryService(GradingService): self.is_unique_url = self.url + '/is_name_unique/' self.combined_notifications_url = self.url + '/combined_notifications/' self.grading_status_list_url = self.url + '/get_grading_status_list/' + self.flagged_problem_list_url = self.url + '/get_flagged_problem_list/' + self.take_action_on_flags_url = self.url + '/take_action_on_flags/' def check_if_name_is_unique(self, location, problem_id, course_id): params = { @@ -57,3 +59,21 @@ class ControllerQueryService(GradingService): response = self.get(self.grading_status_list_url, params) return response + + def get_flagged_problem_list(self, course_id): + params = { + 'course_id' : course_id, + } + + response = self.get(self.flagged_problem_list_url, params) + return response + + def take_action_on_flags(self, course_id, student_id, submission_id): + params = { + 'course_id' : course_id, + 'student_id' : student_id, + 'submission_id' : submission_id, + } + + response = self.post(self.take_action_on_flags_url, params) + return response diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 2ebd8778e6..fd43921761 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -193,6 +193,61 @@ def student_problem_list(request, course_id): # Checked above 'staff_access': False, }) +@cache_control(no_cache=True, no_store=True, must_revalidate=True) +def flagged_problem_list(request, course_id): + ''' + Show a student problem list + ''' + course = get_course_with_access(request.user, course_id, 'staff') + student_id = unique_id_for_user(request.user) + + # call problem list service + success = False + error_text = "" + problem_list = [] + base_course_url = reverse('courses') + + try: + problem_list_json = controller_qs.get_grading_status_list(course_id, unique_id_for_user(request.user)) + problem_list_dict = json.loads(problem_list_json) + success = problem_list_dict['success'] + if 'error' in problem_list_dict: + error_text = problem_list_dict['error'] + + problem_list = problem_list_dict['problem_list'] + + for i in xrange(0,len(problem_list)): + problem_url_parts = search.path_to_location(modulestore(), course.id, problem_list[i]['location']) + problem_url = base_course_url + "/" + for z in xrange(0,len(problem_url_parts)): + part = problem_url_parts[z] + if part is not None: + if z==1: + problem_url += "courseware/" + problem_url += part + "/" + + problem_list[i].update({'actual_url' : problem_url}) + + except GradingServiceError: + error_text = "Error occured while contacting the grading service" + success = False + # catch error if if the json loads fails + except ValueError: + error_text = "Could not get problem list" + success = False + + ajax_url = _reverse_with_slash('open_ended_problems', course_id) + + return render_to_response('open_ended_problems/open_ended_problems.html', { + 'course': course, + 'course_id': course_id, + 'ajax_url': ajax_url, + 'success': success, + 'problem_list': problem_list, + 'error_text': error_text, + # Checked above + 'staff_access': False, }) + @cache_control(no_cache=True, no_store=True, must_revalidate=True) def combined_notifications(request, course_id): course = get_course_with_access(request.user, course_id, 'load') diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html new file mode 100644 index 0000000000..447a34ff45 --- /dev/null +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -0,0 +1,52 @@ +<%inherit file="/main.html" /> +<%block name="bodyclass">${course.css_class} +<%namespace name='static' file='/static_content.html'/> + +<%block name="headextra"> +<%static:css group='course'/> + + +<%block name="title">${course.number} Flagged Open Ended Problems + +<%include file="/courseware/course_navigation.html" args="active_page='flagged_open_ended_problems'" /> + +
+
+
${error_text}
+

Flagged Open Ended Problems

+

Instructions

+

Here are a list of open ended problems for this course that have been flagged by students as potentially inappropriate.

+ % if success: + % if len(flagged_list) == 0: +
+ No flagged problems exist. +
+ %else: + + + + + + + + %for problem in problem_list: + + + + + + + %endfor +
Problem NameStudent IDStudent ResponseSubmission ID
+ ${problem['problem_name']} + + ${problem['student_id']} + + ${problem['student_response']} + + ${problem['submission_id']} +
+ %endif + %endif +
+
From dd72297f73ed9af5e22a8703709a25cd53bb74e6 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 20:39:53 -0500 Subject: [PATCH 03/24] Wire up flagged problem list --- lms/djangoapps/open_ended_grading/views.py | 21 ++++--------------- .../open_ended_flagged_problems.html | 2 +- lms/urls.py | 4 ++++ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index fd43921761..6a4131dc6f 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -208,25 +208,13 @@ def flagged_problem_list(request, course_id): base_course_url = reverse('courses') try: - problem_list_json = controller_qs.get_grading_status_list(course_id, unique_id_for_user(request.user)) + problem_list_json = controller_qs.get_flagged_problem_list(course_id) problem_list_dict = json.loads(problem_list_json) success = problem_list_dict['success'] if 'error' in problem_list_dict: error_text = problem_list_dict['error'] - problem_list = problem_list_dict['problem_list'] - - for i in xrange(0,len(problem_list)): - problem_url_parts = search.path_to_location(modulestore(), course.id, problem_list[i]['location']) - problem_url = base_course_url + "/" - for z in xrange(0,len(problem_url_parts)): - part = problem_url_parts[z] - if part is not None: - if z==1: - problem_url += "courseware/" - problem_url += part + "/" - - problem_list[i].update({'actual_url' : problem_url}) + problem_list = problem_list_dict['flagged_submissions'] except GradingServiceError: error_text = "Error occured while contacting the grading service" @@ -238,7 +226,7 @@ def flagged_problem_list(request, course_id): ajax_url = _reverse_with_slash('open_ended_problems', course_id) - return render_to_response('open_ended_problems/open_ended_problems.html', { + return render_to_response('open_ended_problems/open_ended_flagged_problems.html', { 'course': course, 'course_id': course_id, 'ajax_url': ajax_url, @@ -246,14 +234,13 @@ def flagged_problem_list(request, course_id): 'problem_list': problem_list, 'error_text': error_text, # Checked above - 'staff_access': False, }) + 'staff_access': True, }) @cache_control(no_cache=True, no_store=True, must_revalidate=True) def combined_notifications(request, course_id): course = get_course_with_access(request.user, course_id, 'load') user = request.user notifications = open_ended_notifications.combined_notifications(course, user) - log.debug(notifications) response = notifications['response'] notification_tuples=open_ended_notifications.NOTIFICATION_TYPES diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index 447a34ff45..054c028071 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -8,7 +8,7 @@ <%block name="title">${course.number} Flagged Open Ended Problems -<%include file="/courseware/course_navigation.html" args="active_page='flagged_open_ended_problems'" /> +<%include file="/courseware/course_navigation.html" args="active_page='open_ended_flagged_problems'" />
diff --git a/lms/urls.py b/lms/urls.py index 4b3cc94cab..f122635821 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -285,6 +285,10 @@ if settings.COURSEWARE_ENABLED: # Open Ended problem list url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_problems$', 'open_ended_grading.views.student_problem_list', name='open_ended_problems'), + + # Open Ended flagged problem list + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems$', + 'open_ended_grading.views.flagged_problem_list', name='open_ended_flagged_problems'), # Cohorts management url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/cohorts$', From b6f77f6f8e8f1ba5d2cab867d50b7baf3e7e9334 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 20:43:57 -0500 Subject: [PATCH 04/24] Fix rendering for flagged problems view --- .../open_ended_problems/open_ended_flagged_problems.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index 054c028071..bf70906637 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -28,6 +28,7 @@ Student ID Student Response Submission ID + Location %for problem in problem_list: @@ -43,6 +44,9 @@ ${problem['submission_id']} + + ${problem['location']} + %endfor From e89196e0dd89bed02de4b153c74e7426088de2c0 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 20:47:00 -0500 Subject: [PATCH 05/24] Add in flagged problem list return --- lms/djangoapps/open_ended_grading/views.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 6a4131dc6f..f1a9d41974 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -158,8 +158,9 @@ def student_problem_list(request, course_id): success = problem_list_dict['success'] if 'error' in problem_list_dict: error_text = problem_list_dict['error'] - - problem_list = problem_list_dict['problem_list'] + problem_list = [] + else: + problem_list = problem_list_dict['problem_list'] for i in xrange(0,len(problem_list)): problem_url_parts = search.path_to_location(modulestore(), course.id, problem_list[i]['location']) @@ -213,8 +214,9 @@ def flagged_problem_list(request, course_id): success = problem_list_dict['success'] if 'error' in problem_list_dict: error_text = problem_list_dict['error'] - - problem_list = problem_list_dict['flagged_submissions'] + problem_list=[] + else: + problem_list = problem_list_dict['flagged_submissions'] except GradingServiceError: error_text = "Error occured while contacting the grading service" From f89e36b5b9bd7fc21fa26f636635f39804c0019e Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 20:54:02 -0500 Subject: [PATCH 06/24] Flagged list renders properly --- .../open_ended_flagged_problems.html | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index bf70906637..eb7b34d8e6 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -17,18 +17,17 @@

Instructions

Here are a list of open ended problems for this course that have been flagged by students as potentially inappropriate.

% if success: - % if len(flagged_list) == 0: + % if len(problem_list) == 0:
No flagged problems exist.
%else: - + - - - + + %for problem in problem_list: @@ -38,14 +37,11 @@ - %endfor From b248a0957254071c4b0db85cd1aaa0300fe74e8e Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:06:54 -0500 Subject: [PATCH 07/24] Work on adding in ban actions --- .../controller_query_service.py | 4 ++- .../peer_grading_service.py | 2 +- lms/djangoapps/open_ended_grading/views.py | 27 +++++++++++++++++++ .../open_ended_flagged_problems.html | 16 +++++++---- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/controller_query_service.py b/lms/djangoapps/open_ended_grading/controller_query_service.py index 7c75d44287..d40c9b4428 100644 --- a/lms/djangoapps/open_ended_grading/controller_query_service.py +++ b/lms/djangoapps/open_ended_grading/controller_query_service.py @@ -68,12 +68,14 @@ class ControllerQueryService(GradingService): response = self.get(self.flagged_problem_list_url, params) return response - def take_action_on_flags(self, course_id, student_id, submission_id): + def take_action_on_flags(self, course_id, student_id, submission_id, action_type): params = { 'course_id' : course_id, 'student_id' : student_id, 'submission_id' : submission_id, + 'action_type' : action_type } response = self.post(self.take_action_on_flags_url, params) return response + diff --git a/lms/djangoapps/open_ended_grading/peer_grading_service.py b/lms/djangoapps/open_ended_grading/peer_grading_service.py index 76f54bb12c..994ba0b2be 100644 --- a/lms/djangoapps/open_ended_grading/peer_grading_service.py +++ b/lms/djangoapps/open_ended_grading/peer_grading_service.py @@ -377,4 +377,4 @@ def save_calibration_essay(request, course_id): return HttpResponse(response, mimetype="application/json") except GradingServiceError: log.exception("Error saving calibration grade, location: {0}, submission_id: {1}, submission_key: {2}, grader_id: {3}".format(location, submission_id, submission_key, grader_id)) - return _err_response('Could not connect to grading service') + return _err_response('Could not connect to grading service') \ No newline at end of file diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index f1a9d41974..717a33ec61 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -287,5 +287,32 @@ def combined_notifications(request, course_id): return render_to_response('open_ended_problems/combined_notifications.html', combined_dict ) + +def take_action_on_flags(request, course_id): + """ + + """ + if request.method != 'POST': + raise Http404 + + + required = ['submission_id', 'action_type', 'student_id'] + for key in required: + if key not in request.POST: + return HttpResponse(json.dumps({'success': False, 'error': 'Missing key {0}'.format(key)}), + mimetype="application/json") + + p = request.POST + submission_id = p['submission_id'] + action_type = p['action_type'] + student_id = p['student_id'] + + try: + controller_qs = ControllerQueryService() + response = controller_qs.save_calibration_essay(course_id, student_id, course_id, action_type) + return HttpResponse(response, mimetype="application/json") + except GradingServiceError: + log.exception("Error saving calibration grade, location: {0}, submission_id: {1}, submission_key: {2}, grader_id: {3}".format(location, submission_id, submission_key, grader_id)) + return _err_response('Could not connect to grading service') diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index eb7b34d8e6..97f1e03c18 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -25,9 +25,9 @@
Problem NameName Student IDStudent ResponseSubmission IDLocationIDResponse
${problem['student_id']} - ${problem['student_response']} - ${problem['submission_id']} - ${problem['location']} + ${problem['student_response']}
- - + + %for problem in problem_list: @@ -35,13 +35,19 @@ ${problem['problem_name']} + + - %endfor From 17fce100bb0a41e43a2c8aed6127c9f3e7cb0ed3 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:10:48 -0500 Subject: [PATCH 08/24] Add in ban actions to table --- lms/djangoapps/open_ended_grading/views.py | 2 +- .../open_ended_problems/open_ended_flagged_problems.html | 8 ++++---- lms/urls.py | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 717a33ec61..aaee9f4c98 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -309,7 +309,7 @@ def take_action_on_flags(request, course_id): try: controller_qs = ControllerQueryService() - response = controller_qs.save_calibration_essay(course_id, student_id, course_id, action_type) + response = controller_qs.take_action_on_flags(course_id, student_id, course_id, action_type) return HttpResponse(response, mimetype="application/json") except GradingServiceError: log.exception("Error saving calibration grade, location: {0}, submission_id: {1}, submission_key: {2}, grader_id: {3}".format(location, submission_id, submission_key, grader_id)) diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index 97f1e03c18..2397e1a70e 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -26,8 +26,8 @@ - - + + %for problem in problem_list: @@ -38,10 +38,10 @@ ${problem['student_response']} + From f3f509da3b7a63b9d5a14939c02f9a9780104337 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Thu, 31 Jan 2013 12:45:48 -0500 Subject: [PATCH 17/24] Fix input area styling --- .../xmodule/xmodule/css/combinedopenended/display.scss | 5 +++-- .../xmodule/js/src/combinedopenended/display.coffee | 2 +- lms/static/coffee/src/open_ended/open_ended.coffee | 9 +++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/common/lib/xmodule/xmodule/css/combinedopenended/display.scss b/common/lib/xmodule/xmodule/css/combinedopenended/display.scss index 41896e6173..38fd6ba01c 100644 --- a/common/lib/xmodule/xmodule/css/combinedopenended/display.scss +++ b/common/lib/xmodule/xmodule/css/combinedopenended/display.scss @@ -442,12 +442,13 @@ section.open-ended-child { margin: 10px; } - span.short-form-response { - padding: 9px; + div.short-form-response { background: #F6F6F6; border: 1px solid #ddd; border-top: 0; margin-bottom: 20px; + overflow-y: auto; + height: 200px; @include clearfix; } diff --git a/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee b/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee index 2aabd35771..89954deb23 100644 --- a/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee +++ b/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee @@ -351,5 +351,5 @@ class @CombinedOpenEnded answer_id = @answer_area.attr('id') answer_val = @answer_area.val() new_text = '' - new_text = "#{answer_val}" + new_text = "
#{answer_val}
" @answer_area.replaceWith(new_text) diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index 558d712c46..aff1e5fc67 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -44,13 +44,14 @@ class OpenEnded .error => callback({success: false, error: "Error occured while performing this operation"}) after_action_wrapper: (target, action_type) -> + tr_parent = target.parent().parent() + tr_children = tr_parent.children() + action_taken = tr_children[4].firstElementChild + action_taken.innerText = "#{action_type} done for student." return @handle_after_action handle_after_action: (data) -> - tr_parent = target.parent().parent() - tr_children = tr_parent.children() - action_taken = tr_children[4].children()[0] - action_taken.replaceWith('
#{action_type} done for student.
') + blah = "blah" gentle_alert: (msg) => if $('.message-container').length From c991c0489c14124343b8ffc4e9e39893bdb457b5 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Mon, 4 Feb 2013 10:26:25 -0500 Subject: [PATCH 18/24] Fix open ended test with flagging --- lms/djangoapps/open_ended_grading/tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lms/djangoapps/open_ended_grading/tests.py b/lms/djangoapps/open_ended_grading/tests.py index 57ea4f319c..131fe5ad9f 100644 --- a/lms/djangoapps/open_ended_grading/tests.py +++ b/lms/djangoapps/open_ended_grading/tests.py @@ -172,7 +172,8 @@ class TestPeerGradingService(ct.PageLoader): 'submission_key': 'fake key', 'score': '2', 'feedback': 'This is feedback', - 'rubric_scores[]': [1, 2]} + 'rubric_scores[]': [1, 2], + 'submission_flagged' : False} r = self.check_for_post_code(200, url, data) d = json.loads(r.content) self.assertTrue(d['success']) From 8bd7b60aca4fa4ec7cde1f87fd117a8fa9b8a991 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Mon, 4 Feb 2013 10:50:07 -0500 Subject: [PATCH 19/24] Add in key to mock peer grading service --- lms/djangoapps/open_ended_grading/peer_grading_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/djangoapps/open_ended_grading/peer_grading_service.py b/lms/djangoapps/open_ended_grading/peer_grading_service.py index 8a649d9017..23e1488d9b 100644 --- a/lms/djangoapps/open_ended_grading/peer_grading_service.py +++ b/lms/djangoapps/open_ended_grading/peer_grading_service.py @@ -50,7 +50,7 @@ class MockPeerGradingService(object): 'max_score': 4}) def save_grade(self, location, grader_id, submission_id, - score, feedback, submission_key, rubric_scores): + score, feedback, submission_key, rubric_scores, submission_flagged): return json.dumps({'success': True}) def is_student_calibrated(self, problem_location, grader_id): From 7f96fbb3d1becf40b295c9c3465d4ef48b5af60e Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Mon, 4 Feb 2013 17:15:07 -0500 Subject: [PATCH 20/24] Address review comments --- lms/djangoapps/open_ended_grading/views.py | 7 ++++++- lms/static/coffee/src/open_ended/open_ended.coffee | 8 ++++---- .../open_ended_problems/open_ended_flagged_problems.html | 8 +------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 1777f26e2e..156bdadddd 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -244,6 +244,9 @@ def flagged_problem_list(request, course_id): @cache_control(no_cache=True, no_store=True, must_revalidate=True) def combined_notifications(request, course_id): + """ + Gets combined notifications from the grading controller and displays them + """ course = get_course_with_access(request.user, course_id, 'load') user = request.user notifications = open_ended_notifications.combined_notifications(course, user) @@ -292,9 +295,11 @@ def combined_notifications(request, course_id): combined_dict ) +@cache_control(no_cache=True, no_store=True, must_revalidate=True) def take_action_on_flags(request, course_id): """ - + Takes action on student flagged submissions. + Currently, only support unflag and ban actions. """ if request.method != 'POST': raise Http404 diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index aff1e5fc67..61e0c73dba 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -23,8 +23,8 @@ class OpenEnded parent_tr = $(event.target).parent().parent() tr_children = parent_tr.children() action_type = "unflag" - submission_id = tr_children[5].innerText - student_id = tr_children[6].innerText + submission_id = parent_tr.data('submission-id') + student_id = parent_tr.data('student-id') callback_func = @after_action_wrapper($(event.target), action_type) @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, callback_func) @@ -33,8 +33,8 @@ class OpenEnded parent_tr = $(event.target).parent().parent() tr_children = parent_tr.children() action_type = "ban" - submission_id = tr_children[5].innerText - student_id = tr_children[6].innerText + submission_id = parent_tr.data('submission-id') + student_id = parent_tr.data('student-id') callback_func = @after_action_wrapper($(event.target), action_type) @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, callback_func) diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index ec892da43c..b4c6f43685 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -34,7 +34,7 @@
%for problem in problem_list: - + @@ -50,12 +50,6 @@ - - %endfor
NameStudent IDID ResponseUnflagBan
- ${problem['student_id']} + ${problem['student_response']} + + + + ${problem['submission_id']} - ${problem['student_response']} + + ${problem['student_id']}
Name ResponseUnflagBan
- + Unflag - + Ban ${problem['submission_id']} diff --git a/lms/urls.py b/lms/urls.py index f122635821..41e8e9fff1 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -287,6 +287,8 @@ if settings.COURSEWARE_ENABLED: 'open_ended_grading.views.student_problem_list', name='open_ended_problems'), # Open Ended flagged problem list + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems$', + 'open_ended_grading.views.flagged_problem_list', name='open_ended_flagged_problems'), url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems$', 'open_ended_grading.views.flagged_problem_list', name='open_ended_flagged_problems'), From 4c164795691c126ef3d08d5be0e7cba04cfabd0d Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:22:59 -0500 Subject: [PATCH 09/24] Working on frontend JS for posting --- lms/djangoapps/open_ended_grading/views.py | 2 +- .../coffee/src/open_ended/open_ended.coffee | 33 +++++++++++++++++++ .../open_ended_flagged_problems.html | 8 +++-- 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 lms/static/coffee/src/open_ended/open_ended.coffee diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index aaee9f4c98..137cff7803 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -309,7 +309,7 @@ def take_action_on_flags(request, course_id): try: controller_qs = ControllerQueryService() - response = controller_qs.take_action_on_flags(course_id, student_id, course_id, action_type) + response = controller_qs.take_action_on_flags(course_id, student_id, submission_id, action_type) return HttpResponse(response, mimetype="application/json") except GradingServiceError: log.exception("Error saving calibration grade, location: {0}, submission_id: {1}, submission_key: {2}, grader_id: {3}".format(location, submission_id, submission_key, grader_id)) diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee new file mode 100644 index 0000000000..f45efeb8a7 --- /dev/null +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -0,0 +1,33 @@ +# This is a simple class that just hides the error container +# and message container when they are empty +# Can (and should be) expanded upon when our problem list +# becomes more sophisticated +class OpenEnded + constructor: (ajax_url) -> + @ajax_url = ajax_url + @error_container = $('.error-container') + @error_container.toggle(not @error_container.is(':empty')) + + @message_container = $('.message-container') + @message_container.toggle(not @message_container.is(':empty')) + + @problem_list = $('.problem-list') + + @ban_button = $('.ban-button') + @unflag_button = $('.unflag-button') + @ban_button.click @ban + @unflag_button.click @unflag + + unflag: (event) => + event.preventDefault() + + ban: (event) => + event.preventDefault() + + post: (cmd, data, callback) -> + # if this post request fails, the error callback will catch it + $.post(@ajax_url + cmd, data, callback) + .error => callback({success: false, error: "Error occured while performing this operation"}) + +ajax_url = $('.open-ended-problems').data('ajax_url') +$(document).ready(() -> new OpenEnded(ajax_url)) diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index 2397e1a70e..9265ad4663 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -10,6 +10,10 @@ <%include file="/courseware/course_navigation.html" args="active_page='open_ended_flagged_problems'" /> +<%block name="js_extra"> + <%static:js group='open_ended'/> + +
${error_text}
@@ -38,10 +42,10 @@ ${problem['student_response']}
- Unflag + Unflag - Ban + Ban ${problem['submission_id']} From 10c7155d4d061d51eee8572a4a5b6fd5f1da03eb Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:28:42 -0500 Subject: [PATCH 10/24] Add open ended to JS pipeline --- lms/envs/common.py | 7 ++++++- lms/static/coffee/src/open_ended/open_ended.coffee | 9 +++++++++ lms/urls.py | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lms/envs/common.py b/lms/envs/common.py index 16472795e0..426c29c7d0 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -438,6 +438,7 @@ main_vendor_js = [ discussion_js = sorted(rooted_glob(PROJECT_ROOT / 'static', 'coffee/src/discussion/**/*.coffee')) staff_grading_js = sorted(rooted_glob(PROJECT_ROOT / 'static', 'coffee/src/staff_grading/**/*.coffee')) peer_grading_js = sorted(rooted_glob(PROJECT_ROOT / 'static','coffee/src/peer_grading/**/*.coffee')) +open_ended_js = sorted(rooted_glob(PROJECT_ROOT / 'static','coffee/src/open_ended/**/*.coffee')) PIPELINE_CSS = { 'application': { @@ -468,7 +469,7 @@ PIPELINE_JS = { 'source_filenames': sorted( set(rooted_glob(COMMON_ROOT / 'static', 'coffee/src/**/*.coffee') + rooted_glob(PROJECT_ROOT / 'static', 'coffee/src/**/*.coffee')) - - set(courseware_js + discussion_js + staff_grading_js + peer_grading_js) + set(courseware_js + discussion_js + staff_grading_js + peer_grading_js + open_ended_js) ) + [ 'js/form.ext.js', 'js/my_courses_dropdown.js', @@ -501,6 +502,10 @@ PIPELINE_JS = { 'peer_grading' : { 'source_filenames': peer_grading_js, 'output_filename': 'js/peer_grading.js' + }, + 'open_ended' : { + 'source_filenames': open_ended_js, + 'output_filename': 'js/open_ended.js' } } diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index f45efeb8a7..5c0f455ce7 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -20,14 +20,23 @@ class OpenEnded unflag: (event) => event.preventDefault() + @gentle_alert "Unflag" ban: (event) => event.preventDefault() + @gentle_alert "Ban" post: (cmd, data, callback) -> # if this post request fails, the error callback will catch it $.post(@ajax_url + cmd, data, callback) .error => callback({success: false, error: "Error occured while performing this operation"}) + gentle_alert: (msg) => + if $('.message-container').length + $('.message-container').remove() + alert_elem = "
" + msg + "
" + $('.error-container').after(alert_elem) + $('.message-container').css(opacity: 0).animate(opacity: 1, 700) + ajax_url = $('.open-ended-problems').data('ajax_url') $(document).ready(() -> new OpenEnded(ajax_url)) diff --git a/lms/urls.py b/lms/urls.py index 41e8e9fff1..260f55dd05 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -289,8 +289,8 @@ if settings.COURSEWARE_ENABLED: # Open Ended flagged problem list url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems$', 'open_ended_grading.views.flagged_problem_list', name='open_ended_flagged_problems'), - url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems$', - 'open_ended_grading.views.flagged_problem_list', name='open_ended_flagged_problems'), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems/take_action_on_flag$', + 'open_ended_grading.views.take_action_on_flags', name='open_ended_flagged_problems_take_action'), # Cohorts management url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/cohorts$', From 8e9ec501a777a374491db1c48b5cd5a8c461df24 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:44:21 -0500 Subject: [PATCH 11/24] Implement flagging, fix urls --- lms/djangoapps/open_ended_grading/views.py | 3 +-- lms/static/coffee/src/open_ended/open_ended.coffee | 11 ++++++++++- lms/urls.py | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 137cff7803..a0ef8239f3 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -226,7 +226,7 @@ def flagged_problem_list(request, course_id): error_text = "Could not get problem list" success = False - ajax_url = _reverse_with_slash('open_ended_problems', course_id) + ajax_url = _reverse_with_slash('open_ended_flagged_problems', course_id) return render_to_response('open_ended_problems/open_ended_flagged_problems.html', { 'course': course, @@ -308,7 +308,6 @@ def take_action_on_flags(request, course_id): student_id = p['student_id'] try: - controller_qs = ControllerQueryService() response = controller_qs.take_action_on_flags(course_id, student_id, submission_id, action_type) return HttpResponse(response, mimetype="application/json") except GradingServiceError: diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index 5c0f455ce7..07b84c8af5 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -24,13 +24,22 @@ class OpenEnded ban: (event) => event.preventDefault() - @gentle_alert "Ban" + parent_tr = $(event.target).parent().parent() + tr_children = parent_tr.children() + action_type = "ban" + submission_id = tr_children[4].innerText + student_id = tr_children[5].innerText + @gentle_alert student_id + @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, @handle_after_action) post: (cmd, data, callback) -> # if this post request fails, the error callback will catch it $.post(@ajax_url + cmd, data, callback) .error => callback({success: false, error: "Error occured while performing this operation"}) + handle_after_action: (data) -> + @gentle_alert data + gentle_alert: (msg) => if $('.message-container').length $('.message-container').remove() diff --git a/lms/urls.py b/lms/urls.py index 260f55dd05..e4494e0166 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -289,7 +289,7 @@ if settings.COURSEWARE_ENABLED: # Open Ended flagged problem list url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems$', 'open_ended_grading.views.flagged_problem_list', name='open_ended_flagged_problems'), - url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems/take_action_on_flag$', + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/open_ended_flagged_problems/take_action_on_flags$', 'open_ended_grading.views.take_action_on_flags', name='open_ended_flagged_problems_take_action'), # Cohorts management From b4c80da22498f36aa6da563e96f0fef5e34dbd2d Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:50:24 -0500 Subject: [PATCH 12/24] Trim whitespace --- lms/djangoapps/open_ended_grading/views.py | 6 +++++- lms/static/coffee/src/open_ended/open_ended.coffee | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index a0ef8239f3..984c544d93 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -25,6 +25,8 @@ import open_ended_notifications from xmodule.modulestore.django import modulestore from xmodule.modulestore import search +from django.http import HttpResponse, Http404 + log = logging.getLogger(__name__) template_imports = {'urllib': urllib} @@ -306,7 +308,9 @@ def take_action_on_flags(request, course_id): submission_id = p['submission_id'] action_type = p['action_type'] student_id = p['student_id'] - + student_id = student_id.strip(' \t\n\r') + submission_id = submission_id.strip(' \t\n\r') + action_type = action_type.lower().strip(' \t\n\r') try: response = controller_qs.take_action_on_flags(course_id, student_id, submission_id, action_type) return HttpResponse(response, mimetype="application/json") diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index 07b84c8af5..e54198e2aa 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -29,7 +29,6 @@ class OpenEnded action_type = "ban" submission_id = tr_children[4].innerText student_id = tr_children[5].innerText - @gentle_alert student_id @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, @handle_after_action) post: (cmd, data, callback) -> From 2affd4760bef18906c858451dcaa8b80af688485 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:53:33 -0500 Subject: [PATCH 13/24] Add in wiring for unflag action --- lms/static/coffee/src/open_ended/open_ended.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index e54198e2aa..227cf2fd76 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -20,7 +20,12 @@ class OpenEnded unflag: (event) => event.preventDefault() - @gentle_alert "Unflag" + parent_tr = $(event.target).parent().parent() + tr_children = parent_tr.children() + action_type = "unflag" + submission_id = tr_children[4].innerText + student_id = tr_children[5].innerText + @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, @handle_after_action) ban: (event) => event.preventDefault() From b0e46085586524caf67b7c76b8907ee23403388d Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 30 Jan 2013 21:56:52 -0500 Subject: [PATCH 14/24] Fix callback alert --- lms/static/coffee/src/open_ended/open_ended.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index 227cf2fd76..45de3a4fcc 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -42,7 +42,7 @@ class OpenEnded .error => callback({success: false, error: "Error occured while performing this operation"}) handle_after_action: (data) -> - @gentle_alert data + @gentle_alert data.data gentle_alert: (msg) => if $('.message-container').length From 78f9f63466e6ffce90df07385c80378168af74c7 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Thu, 31 Jan 2013 11:19:15 -0500 Subject: [PATCH 15/24] Add in notification type for flagged submissions --- .../open_ended_grading/open_ended_notifications.py | 3 ++- lms/djangoapps/open_ended_grading/views.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lms/djangoapps/open_ended_grading/open_ended_notifications.py b/lms/djangoapps/open_ended_grading/open_ended_notifications.py index 43259f3e1b..fec893894f 100644 --- a/lms/djangoapps/open_ended_grading/open_ended_notifications.py +++ b/lms/djangoapps/open_ended_grading/open_ended_notifications.py @@ -19,7 +19,8 @@ KEY_PREFIX = "open_ended_" NOTIFICATION_TYPES = ( ('student_needs_to_peer_grade', 'peer_grading', 'Peer Grading'), ('staff_needs_to_grade', 'staff_grading', 'Staff Grading'), - ('new_student_grading_to_view', 'open_ended_problems', 'Problems you have submitted') + ('new_student_grading_to_view', 'open_ended_problems', 'Problems you have submitted'), + ('flagged_submissions_exist', 'open_ended_flagged_problems', 'Flagged Submissions') ) def staff_grading_notifications(course, user): diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 984c544d93..1777f26e2e 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -56,12 +56,14 @@ def _reverse_without_slash(url_name, course_id): DESCRIPTION_DICT = { 'Peer Grading': "View all problems that require peer assessment in this particular course.", 'Staff Grading': "View ungraded submissions submitted by students for the open ended problems in the course.", - 'Problems you have submitted': "View open ended problems that you have previously submitted for grading." + 'Problems you have submitted': "View open ended problems that you have previously submitted for grading.", + 'Flagged Submissions' : "View submissions that have been flagged by students as inappropriate." } ALERT_DICT = { 'Peer Grading': "New submissions to grade", 'Staff Grading': "New submissions to grade", - 'Problems you have submitted': "New grades have been returned" + 'Problems you have submitted': "New grades have been returned", + 'Flagged Submissions' : "Submissions have been flagged for review" } @cache_control(no_cache=True, no_store=True, must_revalidate=True) def staff_grading(request, course_id): From 63d4ac8c442615c45435b2186dfbaa590891037f Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Thu, 31 Jan 2013 12:17:21 -0500 Subject: [PATCH 16/24] Working on some flagging coffeescript --- .../coffee/src/open_ended/open_ended.coffee | 22 +++++++++++++------ .../open_ended_flagged_problems.html | 3 +++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index 45de3a4fcc..558d712c46 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -23,26 +23,34 @@ class OpenEnded parent_tr = $(event.target).parent().parent() tr_children = parent_tr.children() action_type = "unflag" - submission_id = tr_children[4].innerText - student_id = tr_children[5].innerText - @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, @handle_after_action) + submission_id = tr_children[5].innerText + student_id = tr_children[6].innerText + callback_func = @after_action_wrapper($(event.target), action_type) + @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, callback_func) ban: (event) => event.preventDefault() parent_tr = $(event.target).parent().parent() tr_children = parent_tr.children() action_type = "ban" - submission_id = tr_children[4].innerText - student_id = tr_children[5].innerText - @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, @handle_after_action) + submission_id = tr_children[5].innerText + student_id = tr_children[6].innerText + callback_func = @after_action_wrapper($(event.target), action_type) + @post('take_action_on_flags', {'submission_id' : submission_id, 'student_id' : student_id, 'action_type' : action_type}, callback_func) post: (cmd, data, callback) -> # if this post request fails, the error callback will catch it $.post(@ajax_url + cmd, data, callback) .error => callback({success: false, error: "Error occured while performing this operation"}) + after_action_wrapper: (target, action_type) -> + return @handle_after_action + handle_after_action: (data) -> - @gentle_alert data.data + tr_parent = target.parent().parent() + tr_children = tr_parent.children() + action_taken = tr_children[4].children()[0] + action_taken.replaceWith('
#{action_type} done for student.
') gentle_alert: (msg) => if $('.message-container').length diff --git a/lms/templates/open_ended_problems/open_ended_flagged_problems.html b/lms/templates/open_ended_problems/open_ended_flagged_problems.html index 9265ad4663..ec892da43c 100644 --- a/lms/templates/open_ended_problems/open_ended_flagged_problems.html +++ b/lms/templates/open_ended_problems/open_ended_flagged_problems.html @@ -47,6 +47,9 @@
Ban +
+
${problem['submission_id']}
${problem['problem_name']}
- ${problem['submission_id']} - - ${problem['student_id']} -
From f019225d16b0267db0496e88a59f9bf1bcf115fd Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Mon, 4 Feb 2013 17:23:34 -0500 Subject: [PATCH 21/24] Fix reloading --- .../lib/xmodule/xmodule/js/src/combinedopenended/display.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee b/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee index 9b8eecfead..cd85d93381 100644 --- a/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee +++ b/common/lib/xmodule/xmodule/js/src/combinedopenended/display.coffee @@ -329,7 +329,7 @@ class @CombinedOpenEnded $.postWithPrefix "#{@ajax_url}/check_for_score", (response) => if response.state == "done" or response.state=="post_assessment" delete window.queuePollerID - @reload + location.reload() else window.queuePollerID = window.setTimeout(@poll, 10000) From d89ab000d24b4bef9c9a39d9e1188d178b539130 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Mon, 4 Feb 2013 17:30:45 -0500 Subject: [PATCH 22/24] Fix a function call --- lms/envs/dev.py | 4 ++-- lms/static/coffee/src/open_ended/open_ended.coffee | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lms/envs/dev.py b/lms/envs/dev.py index 99ee9662ee..75fda36baf 100644 --- a/lms/envs/dev.py +++ b/lms/envs/dev.py @@ -62,10 +62,10 @@ CACHES = { XQUEUE_INTERFACE = { - "url": "https://sandbox-xqueue.edx.org", + "url": "http://127.0.0.1:3032", "django_auth": { "username": "lms", - "password": "***REMOVED***" + "password": "abcd" }, "basic_auth": ('anant', 'agarwal'), } diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index 61e0c73dba..47e78bcb06 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -51,7 +51,8 @@ class OpenEnded return @handle_after_action handle_after_action: (data) -> - blah = "blah" + if !response.success + @gentle_alert data.error gentle_alert: (msg) => if $('.message-container').length From e8803985f2cee821d0057cdec4f8bdcea7782de6 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Mon, 4 Feb 2013 17:41:44 -0500 Subject: [PATCH 23/24] Fix JS on after event handling --- lms/static/coffee/src/open_ended/open_ended.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/static/coffee/src/open_ended/open_ended.coffee b/lms/static/coffee/src/open_ended/open_ended.coffee index 47e78bcb06..cc8bad5473 100644 --- a/lms/static/coffee/src/open_ended/open_ended.coffee +++ b/lms/static/coffee/src/open_ended/open_ended.coffee @@ -51,7 +51,7 @@ class OpenEnded return @handle_after_action handle_after_action: (data) -> - if !response.success + if !data.success @gentle_alert data.error gentle_alert: (msg) => From 1dab4aba96b8f0a73f3fb2261616d1df977c4e8e Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Mon, 4 Feb 2013 17:44:09 -0500 Subject: [PATCH 24/24] Fix accidental commit of dev.py --- lms/envs/dev.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lms/envs/dev.py b/lms/envs/dev.py index 75fda36baf..99ee9662ee 100644 --- a/lms/envs/dev.py +++ b/lms/envs/dev.py @@ -62,10 +62,10 @@ CACHES = { XQUEUE_INTERFACE = { - "url": "http://127.0.0.1:3032", + "url": "https://sandbox-xqueue.edx.org", "django_auth": { "username": "lms", - "password": "abcd" + "password": "***REMOVED***" }, "basic_auth": ('anant', 'agarwal'), }