From 8807d9fe51c14d035827c71542f4fe691789b4df Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Mon, 5 Aug 2013 11:25:02 -0400 Subject: [PATCH] Integrate JsonResponse into lms/djangoapps/instructor/views/api.py --- lms/djangoapps/instructor/views/api.py | 90 +++++++++----------------- 1 file changed, 31 insertions(+), 59 deletions(-) diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index 34698225c5..ecfb7f46c6 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -7,12 +7,13 @@ Many of these GETs may become PUTs in the future. """ import re -import json import logging from django_future.csrf import ensure_csrf_cookie from django.views.decorators.cache import cache_control from django.core.urlresolvers import reverse -from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden +from django.utils.translation import ugettext as _ +from django.http import HttpResponseBadRequest, HttpResponseForbidden +from util.json_request import JsonResponse from courseware.access import has_access from courseware.courses import get_course_with_access, get_course_by_id @@ -41,13 +42,23 @@ def common_exceptions_400(func): Catches common exceptions and renders matching 400 errors. (decorator without arguments) """ - def wrapped(*args, **kwargs): # pylint: disable=C0111 + def wrapped(request, *args, **kwargs): # pylint: disable=C0111 + use_json = (request.is_ajax() or + request.META.get("HTTP_ACCEPT", "").startswith("application/json")) try: - return func(*args, **kwargs) + return func(request, *args, **kwargs) except User.DoesNotExist: - return HttpResponseBadRequest("User does not exist.") + message = "User does not exist." + if use_json: + return JsonResponse({"error": _(message)}, 400) + else: + return HttpResponseBadRequest(_(message)) except AlreadyRunningError: - return HttpResponseBadRequest("Task already running.") + message = "Task is already running." + if use_json: + return JsonResponse({"error": _(message)}, 400) + else: + return HttpResponseBadRequest(_(message)) return wrapped @@ -82,10 +93,7 @@ def require_query_params(*args, **kwargs): error_response_data['info'][param] = extra if len(error_response_data['parameters']) > 0: - return HttpResponseBadRequest( - json.dumps(error_response_data), - mimetype="application/json", - ) + return JsonResponse(error_response_data, status=400) else: return func(*args, **kwargs) return wrapped @@ -194,10 +202,7 @@ def students_update_enrollment(request, course_id): 'results': results, 'auto_enroll': auto_enroll, } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -255,10 +260,7 @@ def modify_access(request, course_id): 'action': action, 'success': 'yes', } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -308,10 +310,7 @@ def list_course_role_members(request, course_id): course, rolename )), } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -330,10 +329,7 @@ def get_grading_config(request, course_id): 'course_id': course_id, 'grading_config_summary': grading_config_summary, } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -362,10 +358,7 @@ def get_students_features(request, course_id, csv=False): # pylint: disable=W06 'queried_features': query_features, 'available_features': available_features, } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) else: header, datarows = analytics.csvs.format_dictlist(student_data, query_features) return analytics.csvs.create_csv_response("enrolled_profiles.csv", header, datarows) @@ -417,10 +410,7 @@ def get_distribution(request, course_id): if p_dist.type == 'EASY_CHOICE': response_payload['feature_results']['choices_display_names'] = p_dist.choices_display_names - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -449,10 +439,7 @@ def get_student_progress_url(request, course_id): 'course_id': course_id, 'progress_url': progress_url, } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -521,10 +508,7 @@ def reset_student_attempts(request, course_id): else: return HttpResponseBadRequest() - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -572,10 +556,7 @@ def rescore_problem(request, course_id): else: return HttpResponseBadRequest() - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -618,10 +599,7 @@ def list_instructor_tasks(request, course_id): response_payload = { 'tasks': map(extract_task_features, tasks), } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -680,10 +658,7 @@ def list_forum_members(request, course_id): 'course_id': course_id, rolename: map(extract_user_info, users), } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) @ensure_csrf_cookie @@ -747,10 +722,7 @@ def update_forum_role_membership(request, course_id): 'course_id': course_id, 'action': action, } - response = HttpResponse( - json.dumps(response_payload), content_type="application/json" - ) - return response + return JsonResponse(response_payload) def _split_input_list(str_list): @@ -782,6 +754,6 @@ def _msk_from_problem_urlname(course_id, urlname): urlname = "problem/" + urlname - (org, course_name, _) = course_id.split("/") + (org, course_name, __) = course_id.split("/") module_state_key = "i4x://" + org + "/" + course_name + "/" + urlname return module_state_key