Commit 4a127e51 by Don Mitchell

Merge pull request #441 from edx/dhm/course_update_bugs

POST requests were claiming request.method == 'PUT'
parents a2522c49 541c98a3
...@@ -36,8 +36,11 @@ class CourseUpdateTest(CourseTestCase): ...@@ -36,8 +36,11 @@ class CourseUpdateTest(CourseTestCase):
'provided_id': payload['id']}) 'provided_id': payload['id']})
content += '<div>div <p>p<br/></p></div>' content += '<div>div <p>p<br/></p></div>'
payload['content'] = content payload['content'] = content
# POST requests were coming in w/ these header values causing an error; so, repro error here
resp = self.client.post(first_update_url, json.dumps(payload), resp = self.client.post(first_update_url, json.dumps(payload),
"application/json") "application/json",
HTTP_X_HTTP_METHOD_OVERRIDE="PUT",
REQUEST_METHOD="POST")
self.assertHTMLEqual(content, json.loads(resp.content)['content'], self.assertHTMLEqual(content, json.loads(resp.content)['content'],
"iframe w/ div") "iframe w/ div")
......
...@@ -13,7 +13,7 @@ from django_future.csrf import ensure_csrf_cookie ...@@ -13,7 +13,7 @@ from django_future.csrf import ensure_csrf_cookie
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.servers.basehttp import FileWrapper from django.core.servers.basehttp import FileWrapper
from django.core.files.temp import NamedTemporaryFile from django.core.files.temp import NamedTemporaryFile
from django.views.decorators.http import require_POST from django.views.decorators.http import require_POST, require_http_methods
from mitxmako.shortcuts import render_to_response from mitxmako.shortcuts import render_to_response
from cache_toolbox.core import del_cached_content from cache_toolbox.core import del_cached_content
...@@ -249,6 +249,7 @@ def remove_asset(request, org, course, name): ...@@ -249,6 +249,7 @@ def remove_asset(request, org, course, name):
@ensure_csrf_cookie @ensure_csrf_cookie
@require_http_methods(("GET", "POST", "PUT"))
@login_required @login_required
def import_course(request, org, course, name): def import_course(request, org, course, name):
""" """
...@@ -256,7 +257,7 @@ def import_course(request, org, course, name): ...@@ -256,7 +257,7 @@ def import_course(request, org, course, name):
""" """
location = get_location_and_verify_access(request, org, course, name) location = get_location_and_verify_access(request, org, course, name)
if request.method == 'POST': if request.method in ('POST', 'PUT'):
filename = request.FILES['course-data'].name filename = request.FILES['course-data'].name
if not filename.endswith('.tar.gz'): if not filename.endswith('.tar.gz'):
......
...@@ -245,6 +245,7 @@ def edit_unit(request, location): ...@@ -245,6 +245,7 @@ def edit_unit(request, location):
@expect_json @expect_json
@login_required @login_required
@require_http_methods(("GET", "POST", "PUT"))
@ensure_csrf_cookie @ensure_csrf_cookie
def assignment_type_update(request, org, course, category, name): def assignment_type_update(request, org, course, category, name):
''' '''
...@@ -256,7 +257,7 @@ def assignment_type_update(request, org, course, category, name): ...@@ -256,7 +257,7 @@ def assignment_type_update(request, org, course, category, name):
if request.method == 'GET': if request.method == 'GET':
return JsonResponse(CourseGradingModel.get_section_grader_type(location)) return JsonResponse(CourseGradingModel.get_section_grader_type(location))
elif request.method == 'POST': # post or put, doesn't matter. elif request.method in ('POST', 'PUT'): # post or put, doesn't matter.
return JsonResponse(CourseGradingModel.update_section_grader_type(location, request.POST)) return JsonResponse(CourseGradingModel.update_section_grader_type(location, request.POST))
......
...@@ -42,8 +42,7 @@ from .component import ( ...@@ -42,8 +42,7 @@ from .component import (
ADVANCED_COMPONENT_POLICY_KEY) ADVANCED_COMPONENT_POLICY_KEY)
from django_comment_common.utils import seed_permissions_roles from django_comment_common.utils import seed_permissions_roles
import datetime
from django.utils.timezone import UTC
from xmodule.html_module import AboutDescriptor from xmodule.html_module import AboutDescriptor
__all__ = ['course_index', 'create_new_course', 'course_info', __all__ = ['course_index', 'create_new_course', 'course_info',
'course_info_updates', 'get_course_settings', 'course_info_updates', 'get_course_settings',
...@@ -176,6 +175,7 @@ def course_info(request, org, course, name, provided_id=None): ...@@ -176,6 +175,7 @@ def course_info(request, org, course, name, provided_id=None):
@expect_json @expect_json
@require_http_methods(("GET", "POST", "PUT", "DELETE"))
@login_required @login_required
@ensure_csrf_cookie @ensure_csrf_cookie
def course_info_updates(request, org, course, provided_id=None): def course_info_updates(request, org, course, provided_id=None):
...@@ -206,7 +206,7 @@ def course_info_updates(request, org, course, provided_id=None): ...@@ -206,7 +206,7 @@ def course_info_updates(request, org, course, provided_id=None):
except: except:
return HttpResponseBadRequest("Failed to delete", return HttpResponseBadRequest("Failed to delete",
content_type="text/plain") content_type="text/plain")
elif request.method == 'POST': elif request.method in ('POST', 'PUT'): # can be either and sometimes django is rewriting one to the other
try: try:
return JsonResponse(update_course_updates(location, request.POST, provided_id)) return JsonResponse(update_course_updates(location, request.POST, provided_id))
except: except:
...@@ -300,7 +300,7 @@ def course_settings_updates(request, org, course, name, section): ...@@ -300,7 +300,7 @@ def course_settings_updates(request, org, course, name, section):
if request.method == 'GET': if request.method == 'GET':
# Cannot just do a get w/o knowing the course name :-( # Cannot just do a get w/o knowing the course name :-(
return JsonResponse(manager.fetch(Location(['i4x', org, course, 'course', name])), encoder=CourseSettingsEncoder) return JsonResponse(manager.fetch(Location(['i4x', org, course, 'course', name])), encoder=CourseSettingsEncoder)
elif request.method == 'POST': # post or put, doesn't matter. elif request.method in ('POST', 'PUT'): # post or put, doesn't matter.
return JsonResponse(manager.update_from_json(request.POST), encoder=CourseSettingsEncoder) return JsonResponse(manager.update_from_json(request.POST), encoder=CourseSettingsEncoder)
...@@ -479,7 +479,7 @@ def textbook_index(request, org, course, name): ...@@ -479,7 +479,7 @@ def textbook_index(request, org, course, name):
if request.is_ajax(): if request.is_ajax():
if request.method == 'GET': if request.method == 'GET':
return JsonResponse(course_module.pdf_textbooks) return JsonResponse(course_module.pdf_textbooks)
elif request.method == 'POST': elif request.method in ('POST', 'PUT'): # can be either and sometimes django is rewriting one to the other
try: try:
textbooks = validate_textbooks_json(request.body) textbooks = validate_textbooks_json(request.body)
except TextbookValidationError as err: except TextbookValidationError as err:
...@@ -580,7 +580,7 @@ def textbook_by_id(request, org, course, name, tid): ...@@ -580,7 +580,7 @@ def textbook_by_id(request, org, course, name, tid):
if not textbook: if not textbook:
return JsonResponse(status=404) return JsonResponse(status=404)
return JsonResponse(textbook) return JsonResponse(textbook)
elif request.method in ('POST', 'PUT'): elif request.method in ('POST', 'PUT'): # can be either and sometimes django is rewriting one to the other
try: try:
new_textbook = validate_textbook_json(request.body) new_textbook = validate_textbook_json(request.body)
except TextbookValidationError as err: except TextbookValidationError as err:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment