Initialize MakoMiddleware manually during certificate grading runs.
Without this, problems fail to load because they can't find how to render themselves, and the certificate generation grading run will get an inaccurately low count of the possible points a user could get (anything they didn't see will be omitted), inflating their grade during certificate calculation and making it inconsistent with their Progress page.
This commit is contained in:
@@ -3,6 +3,7 @@ from certificates.models import certificate_status_for_student
|
||||
from certificates.models import CertificateStatuses as status
|
||||
from certificates.models import CertificateWhitelist
|
||||
|
||||
from mitxmako.middleware import MakoMiddleware
|
||||
from courseware import grades, courses
|
||||
from django.test.client import RequestFactory
|
||||
from capa.xqueue_interface import XQueueInterface
|
||||
@@ -51,6 +52,14 @@ class XQueueCertInterface(object):
|
||||
"""
|
||||
|
||||
def __init__(self, request=None):
|
||||
# MakoMiddleware Note:
|
||||
# Line below has the side-effect of writing to a module level lookup
|
||||
# table that will allow problems to render themselves. If this is not
|
||||
# present, problems that a student hasn't seen will error when loading,
|
||||
# causing the grading system to under-count the possible score and
|
||||
# inflate their grade. This dependency is bad and was probably recently
|
||||
# introduced. This is the bandage until we can trace the root cause.
|
||||
m = MakoMiddleware()
|
||||
|
||||
# Get basic auth (username/password) for
|
||||
# xqueue connection if it's in the settings
|
||||
@@ -161,6 +170,10 @@ class XQueueCertInterface(object):
|
||||
cert, created = GeneratedCertificate.objects.get_or_create(
|
||||
user=student, course_id=course_id)
|
||||
|
||||
# Needed
|
||||
self.request.user = student
|
||||
self.request.session = {}
|
||||
|
||||
grade = grades.grade(student, self.request, course)
|
||||
is_whitelisted = self.whitelist.filter(
|
||||
user=student, course_id=course_id, whitelist=True).exists()
|
||||
@@ -211,5 +224,5 @@ class XQueueCertInterface(object):
|
||||
(error, msg) = self.xqueue_interface.send_to_queue(
|
||||
header=xheader, body=json.dumps(contents))
|
||||
if error:
|
||||
logger.critical('Unable to add a request to the queue')
|
||||
logger.critical('Unable to add a request to the queue: {} {}'.format(error, msg))
|
||||
raise Exception('Unable to send queue message')
|
||||
|
||||
Reference in New Issue
Block a user