Commit b8b86527 by Joe Blaylock

Certificates: Additional flags for regenerate_user

* -G allows explicit setting of grade condition (e.g., a string such as
  'Distinction', 'Pass', 'F', 'B') for the certificate, regardless of
  grader output for the user.
* -T allows explicit request of a particular certificate template to be
  applied to a given user's certificate regeneration, i.e.:
    -T doctor_distinction.pdf
  to generate a certificate of distinction for doctors.
parent 14d03784
......@@ -35,6 +35,16 @@ class Command(BaseCommand):
dest='username',
default=False,
help='The username or email address for whom grading and certification should be requested'),
make_option('-G', '--grade',
metavar='GRADE',
dest='grade_value',
default=None,
help='The grade string, such as "Distinction", which should be passed to the certificate agent'),
make_option('-T', '--template',
metavar='TEMPLATE',
dest='template_file',
default=None,
help='The template file used to render this certificate, like "QMSE01-distinction.pdf"'),
)
def handle(self, *args, **options):
......@@ -59,7 +69,9 @@ class Command(BaseCommand):
xq = XQueueCertInterface()
if options['insecure']:
xq.use_https = False
ret = xq.regen_cert(student, course_id, course=course)
ret = xq.regen_cert(student, course_id, course=course,
forced_grade=options['grade_value'],
template_file=options['template_file'])
print '{0} - {1}'.format(student, ret)
else:
print "noop option given, skipping work queueing..."
......@@ -78,7 +78,7 @@ class XQueueCertInterface(object):
self.restricted = UserProfile.objects.filter(allow_certificate=False)
self.use_https = True
def regen_cert(self, student, course_id, course=None):
def regen_cert(self, student, course_id, course=None, forced_grade=None, template_file=None):
"""(Re-)Make certificate for a particular student in a particular course
Arguments:
......@@ -105,7 +105,7 @@ class XQueueCertInterface(object):
except GeneratedCertificate.DoesNotExist:
pass
return self.add_cert(student, course_id, course)
return self.add_cert(student, course_id, course, forced_grade, template_file)
def del_cert(self, student, course_id):
......@@ -124,21 +124,24 @@ class XQueueCertInterface(object):
raise NotImplementedError
def add_cert(self, student, course_id, course=None):
def add_cert(self, student, course_id, course=None, forced_grade=None, template_file=None, title='None'):
"""
Request a new certificate for a student.
Arguments:
student - User.object
student - User.object
course_id - courseenrollment.course_id (string)
forced_grade - a string indicating a grade parameter to pass with
the certificate request. If this is given, grading
will be skipped.
Request a new certificate for a student.
Will change the certificate status to 'generating'.
Certificate must be in the 'unavailable', 'error',
'deleted' or 'generating' state.
If a student has a passing grade or is in the whitelist
table for the course a request will made for a new cert.
table for the course a request will be made for a new cert.
If a student has allow_certificate set to False in the
userprofile table the status will change to 'restricted'
......@@ -147,7 +150,6 @@ class XQueueCertInterface(object):
will change to status.notpassing
Returns the student's status
"""
VALID_STATUSES = [status.generating,
......@@ -173,9 +175,8 @@ class XQueueCertInterface(object):
self.request.user = student
self.request.session = {}
is_whitelisted = self.whitelist.filter(user=student, course_id=course_id, whitelist=True).exists()
grade = grades.grade(student, self.request, course)
is_whitelisted = self.whitelist.filter(
user=student, course_id=course_id, whitelist=True).exists()
enrollment_mode = CourseEnrollment.enrollment_mode_for_user(student, course_id)
mode_is_verified = (enrollment_mode == GeneratedCertificate.MODES.verified)
user_is_verified = SoftwareSecurePhotoVerification.user_is_verified(student)
......@@ -190,6 +191,8 @@ class XQueueCertInterface(object):
else:
# honor code and audit students
template_pdf = "certificate-template-{org}-{course}.pdf".format(**course_id_dict)
if forced_grade:
grade['grade'] = forced_grade
cert, __ = GeneratedCertificate.objects.get_or_create(user=student, course_id=course_id)
......@@ -221,6 +224,8 @@ class XQueueCertInterface(object):
'grade': grade['grade'],
'template_pdf': template_pdf,
}
if template_file:
contents['template_pdf'] = template_file
new_status = status.generating
cert.status = new_status
cert.save()
......
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