Files
edx-platform/lms/djangoapps/ora_staff_grader/utils.py
0x29a 9d8375ff99 refactor: rename module -> block within lms/djangoapps/courseware
Also, removed unused `_has_access_xmodule` methid from `lms/djangoapps/courseware/access.py`.
2023-01-30 18:15:22 +01:00

86 lines
2.8 KiB
Python

"""
Various helpful utilities for ESG
"""
from functools import wraps
import json
from opaque_keys.edx.keys import UsageKey
from rest_framework.request import clone_request
from lms.djangoapps.courseware.block_render import handle_xblock_callback_noauth
from lms.djangoapps.ora_staff_grader.errors import MissingParamResponse
def require_params(param_names):
"""
Adds the required query params to the view function. Returns 404 if param(s) missing.
Params:
- param_name (string): the query param to unpack
Raises:
- MissingParamResponse (HTTP 400)
"""
def decorator(function):
@wraps(function)
def wrapped_function(
self, request, *args, **kwargs
): # pylint: disable=unused-argument
passed_parameters = []
for param_name in param_names:
param = request.query_params.get(param_name)
if not param:
return MissingParamResponse()
passed_parameters.append(param)
return function(self, request, *passed_parameters, *args, **kwargs)
return wrapped_function
return decorator
def is_json(input_string):
"""Quick True/False check to see if a value is JSON"""
try:
json.loads(input_string)
except ValueError:
return False
return True
def call_xblock_json_handler(request, usage_id, handler_name, data, auth=False):
"""
WARN: Tested only for use in ESG. Consult before use outside of ESG.
Create an internally-routed XBlock.json_handler request. The internal auth code/param unpacking requires a POST
request with payload in the body. Ideally, we would be able to call functions on XBlocks without this sort of
hacky request proxying but this is what we have to work with right now.
params:
request (HttpRequest): Originating web request, we're going to borrow auth headers/cookies from this
usage_id (str): Usage ID of the XBlock for running the handler
handler_name (str): the name of the XBlock handler method
data (dict): Data to be encoded and sent as the body of the POST request
returns:
response (HttpResponse): get response data with json.loads(response.content)
"""
# XBlock.json_handler operates through a POST request
proxy_request = clone_request(request, "POST")
proxy_request.META["REQUEST_METHOD"] = "POST"
# The body is an encoded JSON blob
proxy_request.body = json.dumps(data).encode()
# Course ID can be retrieved from the usage_id
usage_key = UsageKey.from_string(usage_id)
course_id = str(usage_key.course_key)
# Send the request and return the HTTP response from the XBlock
return handle_xblock_callback_noauth(
proxy_request, course_id, usage_id, handler_name
)